CheckBox in ListView

CheckBox in ListView

Listview 在android中是經常用的組件,一些特殊情況下,系統提供的list view item 不夠用, 不能滿足需求,那麼就需要自定義listView。 

如果在listview的item裏面需要有一個CheckBox 和 2 個 TextView(like gmail app list item),那麼需要自定義list item layout和自定義adapter。
有個簡單list item(例子裏面只顯示一行內容):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:gravity="center_vertical"
    android:padding="5dp" >

    <CheckBox
        android:id="@+id/checkBox1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:focusable="false"
        android:text="" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginLeft="74dp"
        android:layout_toRightOf="@+id/checkBox1"
        android:text="" />

</RelativeLayout>

當一個list view 的item裏面有Button 或者是CheckBox等空間,會導致listView的ItemSelected方法失效。
爲了解決這個問題需要在Button或者是CheckBox裏面添加一行設置:
android:focusable="false"
這樣事件才能傳遞到List view 的item。

在上面的例子中有一個CheckBox,在自定義的adapter裏面,要對CheckBox的focus Change事件監聽,需要通過OnClickListener事件實現。

 private ListAdapter adapter = new ListAdapter(){

	@Override
	public void registerDataSetObserver(DataSetObserver observer) {
	    
	}

	@Override
	public void unregisterDataSetObserver(DataSetObserver observer) {
	    
	}

	@Override
	public int getCount() {
	    return data.size();
	}

	@Override
	public Object getItem(int position) {
	    return data.get(position);
	}

	@Override
	public long getItemId(int position) {
	    return position;
	}

	@Override
	public boolean hasStableIds() {
	    return true;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
	    LayoutInflater inflater = (LayoutInflater)ListViewTest.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE) ;
	    final View view = inflater.inflate(R.layout.layout_listview_item_select_multi_1, null) ;
	    TextView tv = (TextView)view.findViewById(R.id.textView1) ;
	    tv.setText(data.get(position)) ;
	    CheckBox cb = (CheckBox)view.findViewById(R.id.checkBox1) ;
	    cb.setOnClickListener(new View.OnClickListener() {
		@Override
		public void onClick(View v) {
		    CheckBox cb = (CheckBox)v ;
		    if(cb.isChecked()){
			view.setBackgroundResource(R.drawable.list_selector2) ;
		    }else{
			view.setBackgroundResource(R.drawable.list_selector3) ;
		    }
		}
	    }) ;
	    return view;
	}

	@Override
	public int getItemViewType(int position) {
	    return 0;
	}

	@Override
	public int getViewTypeCount() {
	    return 1;
	}

	@Override
	public boolean isEmpty() {
	    return false;
	}

	@Override
	public boolean areAllItemsEnabled() {
	    return true;
	}

	@Override
	public boolean isEnabled(int position) {
	    return true;
	}
	
    } ;
當然重寫Adapter,不必實現ListAdapter.   繼承BaseAdaper 或者她的子類就行。
























發佈了241 篇原創文章 · 獲贊 3 · 訪問量 54萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章