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