【Android基礎篇】SimpleAdapter重寫時響應CheckBox複選框狀態改變,androidcheckbox
在使用自訂ListView時,往往需要自己基於SimpleAdapter重寫適配器,承接上篇在自訂Adapter實現按鈕響應,今天實現響應CheckBox。
和上篇一樣,我們需要在重寫的MySimpleAdapter中添加一個MainActivity的變數,用於調用MainActivity的改變List<Map<String,Object>>中的資料的方法,這樣才能達到重新整理
ListView的目的。代碼如下:
這是MainActivity中調用List<Map<String,Object>>變數改變裡面的資料然後重新整理ListView的方法,傳入參數是ListView中的Item序號和改變的布爾值(因為只修改CheckBox):
public void setChecked(int position,boolean m){ Map<String,Object> map = today_plan_listItems.get(position); map.put("check", m); listItems.set(position, map); listView.invalidate(); }
listItems是List<Map<String,Object>>變數,
listView是ListView變數
下面是MySimpleAdapter類全部的代碼:
package com.plan;import java.util.List;import java.util.Map;import android.content.Context;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.Button;import android.widget.CheckBox;import android.widget.CompoundButton;import android.widget.Toast;import android.widget.CompoundButton.OnCheckedChangeListener;import android.widget.SimpleAdapter;import com.example.plan.R;public class MySimpleAdapter extends SimpleAdapter{ MainActivity context; public MySimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) { super(context, data, resource, from, to); this.context = (MainActivity) context; // TODO Auto-generated constructor stub } public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View v = super.getView(position, convertView, parent); Button btn=(Button) v.findViewById(R.id.button1); final CheckBox check = (CheckBox)v.findViewById(R.id.checkBox_complish); final int p = position; Log.d("Position", Integer.toString(position)); //複選框的響應 check.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub String s = (p+":"+check.isChecked()); Toast.makeText(context, s, 2000).show(); if(check.isChecked()){ context.setChecked(p, true); }else if(!check.isChecked()){ context.setChecked(p, false); } } }); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub //Toast.makeText(context, "刪除"+Integer.toString(p),2000).show(); context.deleteItemsTodayPlanList(p); } }); return v; }}
複選框check響應的原理是監聽它的OnClickListner事件,原狀態為false,點擊後就為true。
注意,在這裡最好別監聽OnCheckedChangeListener事件,因為一旦使用這個監聽器,每次的ListView重新整理都是一次狀態改變,處理起來會很麻煩。