ListView 条目中含有checbox,imgbtn,button;如何处理选择时,上下滑动会乱掉

来源:互联网 发布:淘宝账号注销后支付宝 编辑:程序博客网 时间:2024/05/22 03:36

1.先上代码

package com.bjym.myapplication;import android.app.Activity;import android.graphics.Color;import android.os.Bundle;import android.util.Log;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.CheckBox;import android.widget.CompoundButton;import android.widget.CompoundButton.OnCheckedChangeListener;import android.widget.ImageButton;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import java.util.HashMap;import static com.bjym.myapplication.R.id.imageButton;public class MainActivity extends Activity {    private ListView lv;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        lv = (ListView) findViewById(R.id.lv);        initData();//简单的数据填充        adapter = new MyAdapter();        lv.setAdapter(adapter);        lv.setOnItemClickListener(new OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view,                                    int position, long id) {                Log.e("ysl","执行了setOnItemClickListener方法:position = "+position+"  view = "+view+" parent = "+parent+"  id = "+id);                Object object = parent.getItemAtPosition(position); //如果数据源是一个对象,可以通过第一个参数拿到                TextView view2 = (TextView) view.findViewById(R.id.tv_name); //可以通过第二个参数拿到item中的textview、button、imageview等等控件                CheckBox  box=(CheckBox) view.findViewById(R.id.cb);                ImageButton imageButton=(ImageButton) view.findViewById(R.id.imgben);//在集合中改变次位置控件的当前选择状态(如果已经选择了true,就变为不选择false)                if (imgbtn.get(position)){                    imgbtn.put(position, false);                }else {                    imgbtn.put(position, true);                }                box.setChecked(!box.isChecked());//CheckBox可以直接获取当前状态,然后设置为新状态。                adapter.notifyDataSetChanged();//把当前屏幕上显示的条目重新加载一遍,getview方法执行了10遍(屏幕上显示了10个条目)。                                Toast.makeText(getApplicationContext(),                        "点击的是item----"+box.getText().toString()+"----"+view2.getText().toString(), Toast.LENGTH_SHORT).show();            }        });    }        private String[] tvs = new String[100];    private String[] cbs = new String[100];    private String[] btns = new String[100];    private String[] imgbtns = new String[100];    private void initData() {        for (int i = 0; i < 100; i++) {            tvs[i] = "tvs" + i;            cbs[i] = "cbs" + i;            btns[i] = "btns" + i;            imgbtns[i] = "imgbtns" + i;        }    }    private MyAdapter adapter;//imgbtn使用的集合    HashMap<Integer, Boolean> imgbtn;    private class MyAdapter extends BaseAdapter {        HashMap<Integer, Boolean> state;        public MyAdapter(){            state = new HashMap<Integer, Boolean>();//map中存放的是条目每个位置上选择的状态,默认都是false;            imgbtn = new HashMap<Integer, Boolean>();            for (int i = 0; i < imgbtns.length; i++){                imgbtn.put(i, false);            }        }        @Override        public int getCount() {            return tvs.length;        }        @Override        public Object getItem(int position) {            return null;        }        @Override        public long getItemId(int position) {            return 0;        }        @Override        public View getView(final int position, View convertView,                            ViewGroup parent) {            Log.e("ysl","执行了getView方法:position = "+position+" convertView = "+convertView+" parent = "+parent);            final ViewHoler vh;            if (convertView == null) {                vh = new ViewHoler();                convertView = View.inflate(MainActivity.this,                        R.layout.item_imagebutton, null);                vh.tv = (TextView) convertView.findViewById(R.id.tv_name);                vh.cb = (CheckBox) convertView.findViewById(R.id.cb);                vh.btn = (Button) convertView.findViewById(R.id.btn);                vh.imgbtn = (ImageButton) convertView.findViewById(R.id.imgben);                convertView.setTag(vh);            } else {                vh = (ViewHoler) convertView.getTag();            }            vh.tv.setText(tvs[position]);            vh.cb.setText(cbs[position]);            vh.btn.setText(btns[position]);///////////////////////////////////////解决checkbox的选择复用问题//checkbox的集合和其他两个略有不同;state集合只存储了选择的位置,状态为true;//这个集合可以直接获取到都选择了哪些条目;方便获取到最终选择的结果。//因为view的复用;先把监听器设为空,然后设置选择状态,然后再设置监听,去改变集合中各元素的值。            vh.cb.setOnCheckedChangeListener(null);             vh.cb.setChecked(state.get(position) == null ? false : true);//集合中有就是true,否则是false;            vh.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {                @Override                public void onCheckedChanged(CompoundButton buttonView,                                             boolean isChecked) {                    if (isChecked) {                        state.put(position, isChecked);                    } else {                        state.remove(position);                    }                }            });            Log.e("ysl","state = "+state);            Log.e("ysl","imgbtn = "+imgbtn);            vh.cb.setOnClickListener(new OnClickListener() {                @Override                public void onClick(View v) {                    Toast.makeText(getApplicationContext(),                            "点击的是checkbox"+position, Toast.LENGTH_SHORT).show();                }            });///////////////////////////////////////button按钮的事件//直接读取集合,根据布尔值设置显示效果            if (imgbtn.get(position)){                vh.btn.setBackgroundColor(Color.BLUE);            }else {                vh.btn.setBackgroundColor(Color.WHITE);            }            vh.btn.setOnClickListener(new OnClickListener() {                @Override                public void onClick(View v) {                    Toast.makeText(getApplicationContext(),                            "点击的是button------------"+vh.tv.getText().toString(), Toast.LENGTH_SHORT).show();                }            });///////////////////////////////////////imagebutton的事件//直接读取集合,根据布尔值设置显示效果            if (imgbtn.get(position)){                vh.imgbtn.setBackgroundResource(R.drawable.sina_on);            }else {                vh.imgbtn.setBackgroundResource(R.drawable.sina_un);            }            vh.imgbtn.setOnClickListener(new OnClickListener() {                @Override                public void onClick(View v) {                    Toast.makeText(getApplicationContext(),                            "点击的是imgbtn"+position, Toast.LENGTH_SHORT).show();                }            });            return convertView;        }    }    private class ViewHoler {        public ImageButton imgbtn;        public Button btn;        public CheckBox cb;        public TextView tv;    }}

2.说明:

选择的状态是用两个集合来存储的,checkbox用的集合只存储选中的,通过监听器来向集合中添加或删除位置信息;

imgbtn和button所使用的集合是全部数据,选中的为true,未选中的为false。通过条目点击事件来设置每个位置上的值是false或true;

在进行adapter.notifyDataSetChanged();时,会根据集合中的不同位置的值来设置显示效果。

两种集合都能实现点击条目不重复选择/乱选的效果。checkbox也可以使用第二中集合的方式,只是如果获取结果的话,第一种比较好(集合中直接就是选中的数据)。

阅读全文
0 0
原创粉丝点击