Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android聯動ListView的實現

Android聯動ListView的實現

編輯:關於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的雙向聯動。

 

\
 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved