【Android基础篇】SimpleAdapter重写时响应CheckBox复选框状态改变

在使用自定义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刷新都是一次状态改变,处理起来会很麻烦。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。