編輯:關於Android編程
今天帶來的是兩列並排ListView關聯滑動,這裡面有兩個知識點:1、兩個ListView如何並列顯示。2、如何關聯滑動。
第一個問題,好像我之前的博客提到過,就是讓ListView的width有wrap_content的能力,可以參考我的另一篇博客《並排ListView——仿京東分類列表》。
今天的重點在第二個問題上,如何讓兩個ListView聯動起來。
雖然,重點在第二個問題上,但是,任何事都得一步步的來,首先,我們要先讓ListView的width有wrap_content的能力。
public class RelationListView extends ListView {
private RelationListView mListView;
public RelationListView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public RelationListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = 0;
int height = getMeasuredHeight();
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
if(widthMode == MeasureSpec.EXACTLY) {
width = widthSize;
}else if(widthMode == MeasureSpec.AT_MOST) {
final int childCount = getChildCount();
for(int i=0;i可以看到,要讓ListView的width有wrap_content的能力,主要是去重寫ListView的onMeasure方法,這部分內容這裡不多說了,可以去看我之前的那篇博客。可以看到,我們主要是改變了width的值,讓width的值等於最寬的那個item的寬度。
繼續往下走,如何讓兩個ListView關聯,肯定是要保存另一個ListView的實例,才能去操作它,細心的朋友,可能看到在RelationListView中有一個成員變量:
private RelationListView mListView;
怎麼去設置它的值呢? 當然是自定義一個方法了:
public void setRelatedListView(RelationListView listView) {
mListView = listView;
}
我們在外部通過調用該方法來聲明,哪個ListView要與該ListView聯動。
如何控制聯動? 首先我們要知道當前ListView滑動了,我選擇了onTouchEvent, 這個方法有個參數MotionEvent 我們直接將這個參數傳給要聯動的那個ListView的onTouchEvent就ok,直接在onTouchEvent中傳嗎? 當然不是,那樣就造成死循環了。
來看代碼:
public void onTouch(MotionEvent ev) {
super.onTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if(null != mListView) {
mListView.onTouch(ev);
}
return super.onTouchEvent(ev);
}
我是定義了一個onTouch方法方法,然後在onTouchEvent中調用該方法。 有什麼不一樣嗎? 在onTouch中,我們直接調用父類的onTouchEvent而不是重寫的那個onTouchEvent,這樣就避免了死循環。
來使用一下吧, 布局文件:
沒有聯動的情況:
public class MainActivity extends Activity {
private RelationListView mListView1;
private RelationListView mListView2;
private String[] mData1 = new String[] { listView1, listView1,
listView1, listView1, listView1, listView1, listView1,
listView1, listView1, listView1, listView1, listView1,
listView1, listView1, listView1, listView1, listView1,
listView1, listView1, listView1, listView1, listView1,
listView1, listView1 };
private String[] mData2 = new String[] { ListView2, ListView2,
ListView2, ListView2, ListView2, ListView2, ListView2,
ListView2, ListView2, ListView2, ListView2, ListView2,
ListView2, ListView2, ListView2, ListView2, ListView2,
ListView2, ListView2, ListView2, ListView2, ListView2,
ListView2, ListView2, ListView2, ListView2 };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView1 = (RelationListView) findViewById(R.id.listView1);
mListView2 = (RelationListView) findViewById(R.id.listView2);
mListView1.setAdapter(new ArrayAdapter(this,
android.R.layout.simple_list_item_1, mData1));
mListView2.setAdapter(new ArrayAdapter(this,
android.R.layout.simple_list_item_1, mData2));
}
}
看看效果,是不是兩列ListView了,第一個問題已經實現了。

再來看看單向聯動,ok,添加一行代碼:
mListView1.setRelatedListView(mListView2);
是不是很爽? 相信你已經知道雙向聯動該如何做了, 對,再添加一行代碼:
mListView2.setRelatedListView(mListView1);
這樣就實現了ListView的雙向聯動。

Android反編譯-逆天的反編譯
Jar包的反編譯: Java的世界是透明的,當編譯java程序的時候,是將java源文件轉成.class文件,java虛擬機去執行這些字節碼從而得到運行java程序的目的
Android數據庫高手秘籍(一)——SQLite命令
要想熟練地操作任何一個數據庫,最最基本的要求就是要懂SQL語言,這也是每個程序員都應該掌握的技能。雖說SQL博大精深,要想精通確實很難,但最基本的一些建表命
Android - ToDoList(定制ArrayAdapter)
ToDoList(定制ArrayAdapter) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/
Android動畫之補間動畫(Tween Animation)實例詳解
本文實例講述了Android動畫之補間動畫。分享給大家供大家參考,具體如下:前面講了《Android動畫之逐幀動畫(Frame Animation)》,今天就來詳細講解一