Android—自訂帶CheckBox的ListView實現

來源:互聯網
上載者:User

         最近做帶CheckBox的LISTVIEW的實現,在實現過程中遇到一些問題,也參考了一些網上資料,功能已經實現,在此做個記錄,方便大家參考。

         首先建立一個工程,然後修改main.xml

        

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >        <Button        android:id="@+id/select_btn"        android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_gravity="center_horizontal"    android:text = "SelectAll"    /> <!--    android:listSelector="@android:color/transparent"可以去掉點擊時預設的黃色背景   android:divider="@android:color/transparent"可以去掉預設的分割線   這兩個設定了後就可以換成自己的背景了。 -->    <ListView android:layout_width="match_parent"        android:layout_height="match_parent"         android:id="@+id/list"        android:layout_alignParentTop="true"        /></LinearLayout>    然後需要自己寫一個ListView每項的布局檔案,我寫了一個簡單的listview_item.xml    
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal" >  <TextView         android:id="@+id/name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="5dip"  android:textSize="12dip"     />    <RelativeLayout android:layout_width="match_parent"android:layout_height="wrap_content"        >    <CheckBox     android:id="@+id/listcb"    android:layout_width="30dp"    android:layout_height="27dp"android:layout_marginRight="5dip"  android:layout_alignParentRight="true"android:gravity="center_vertical"android:focusable="false"android:clickable="false"android:focusableInTouchMode="false" android:button="@android:color/transparent"android:background="@drawable/music_listview_checkbox"/></RelativeLayout> </LinearLayout>

    再呢?需要給ListView自訂一個ADAPTER,ListViewAdapter.java,對於處理CheckBox的地方我有加註釋。

package com.wm.example;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.CheckBox;import android.widget.TextView;public class ListViewAdapter extends BaseAdapter {private List<String> mData = new ArrayList<String>();//    private Context mContext;    LayoutInflater mInflater;    // 用來控制CheckBox的選中狀況  private  HashMap<Integer,Boolean> isSelected;      public ListViewAdapter(LayoutInflater inflater,Context mcontext,List<String> mdata) {mInflater = inflater;//mContext = mcontext;isSelected = new HashMap<Integer,Boolean>();mData = mdata;initSelectedMap();}  public void initSelectedMap(){//預設全部未勾選狀態。for(int i = 0; i< mData.size();++i){isSelected.put(i, false);}}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn mData.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn mData.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View v;ViewTag mViewTag = new ViewTag();// TODO Auto-generated method stubv = mInflater.inflate(R.layout.listview_item, null);mViewTag.mTextView = (TextView) v.findViewById(R.id.name);String mText = mData.get(position);if(mText != null){mViewTag.mTextView.setText(mData.get(position));}else{mViewTag.mTextView.setText("Unknown name");}mViewTag.mCheckBox  = (CheckBox) v.findViewById(R.id.listcb);//According to the saved status and setChecked status mViewTag.mCheckBox.setChecked(isSelected.get(position));v.setTag(mViewTag);return v;}public void setListViewData(List<String> mList){mData = mList;}public void setItemCheckBoxStatus(View mView,int index){ViewTag holder = (ViewTag) mView.getTag();  // 改變CheckBox的狀態  holder.mCheckBox.toggle();  // 將CheckBox的選中狀況記錄下來  isSelected.put(index, holder.mCheckBox.isChecked()); }public void setAllCheckBoxStatus(Boolean mFlag){for(int i= 0;i < mData.size(); ++i){isSelected.put(i, mFlag);}}public class ViewTag{public TextView mTextView;public CheckBox mCheckBox;}}

   最後,更該首頁面的代碼,這裡我多做了一個實現全選與不全選的控制功能。
 

package com.wm.example;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.Button;import android.widget.ListView;public class ListViewCheckboxActivity extends Activity implements OnClickListener,OnItemClickListener{private static final String TAG="ListViewCheckboxActivity";private Button mBtn;private ListViewmListView;private ListViewAdapter mListViewAdapter = null;private List<String>mData = new ArrayList<String>();//control select button status(SelectedAll or UnselectAll)privateBooleanmAllSelected = false;private HashMap<Integer,Boolean> mCheckedObj = new HashMap<Integer,Boolean>();/** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                mBtn=(Button) findViewById(R.id.select_btn);        mBtn.setOnClickListener(this);        mListView = (ListView) findViewById(R.id.list);mListView.setOnItemClickListener(this);InitData();mListViewAdapter = new ListViewAdapter(getLayoutInflater(),this,mData);mListView.setAdapter(mListViewAdapter);    }        private void InitData(){    mData.add("aaa");    mData.add("bbb");    mData.add("ccc");    mData.add("ddd");    mData.add("eee");    mData.add("fff");    mData.add("ggg");    }@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {// TODO Auto-generated method stubmListViewAdapter.setItemCheckBoxStatus(arg1, arg2);if(mCheckedObj.containsKey(arg2)){Log.w(TAG,"****onItemClick***NEED REMOVE***");mCheckedObj.remove(arg2);}else{Log.w(TAG,"****onItemClick***NEED put***");mCheckedObj.put(arg2, true);}if(mCheckedObj.size() == 0){Log.w(TAG,"****onItemClick**NO CHECKED***");mAllSelected = false;mBtn.setText("SelectAll");}else if(mCheckedObj.size() == mData.size()){mAllSelected = true;mBtn.setText("UnselectAll");}}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch(v.getId()){case R.id.select_btn:{if(mAllSelected){mAllSelected = false;mBtn.setText("SelectAll");mListViewAdapter.setAllCheckBoxStatus(false);mCheckedObj.clear();}else{mAllSelected = true;mBtn.setText("UnselectAll");mListViewAdapter.setAllCheckBoxStatus(true);for(int i=0; i<mData.size();++i){mCheckedObj.put(i, true);}}//Refresh datamListViewAdapter.notifyDataSetChanged();}break;default:break;}}}

     大功告成,因為代碼比較簡單,所以沒有加太多注釋。
       
    

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.