ListView中的Button或CheckBox点击处理
来源:互联网 发布:java编程思想思维导图 编辑:程序博客网 时间:2024/06/03 18:54
在ListView的使用过程中,我们经常会用到View的复用机制,来优化应用的性能。也就是说ListView的item的View存在着复用,刚开始Adapter会创造一个屏幕的item,以后的Item就会复用这最初的Item View,只不过把数据更换了而已。于是这样便会带来一个问题,加入Item上有一些局部事件,比如说ChexkBox,当我们点击的是第一项的时候,第一个Item的CheckBoX的选中状态确实改变了,但是继续往下拉,你会发现,下面还有CheckBox的选中状态改变了。因为下面的Item复用了初始的Item View,所以会造成点击,改变状态或者Button上的文字时,会发生错乱。
如何解决这个问题呢?解决的方法有两个。第一是定义一个List<Integer>集合,用来存放被点击的position。第二个方法是,在你的Item的内容的Bean中添加一个字段boolean isClicked,用来标记是否被点击过了。
首先来介绍方法一:刚开始的时候,判断集合是否存在这个position,如果存在则,将内容设置为点击状态。否则,设置为正常状态。接着是点击事件的处理:如果集合已经存在了这个position,那么说明前面已经被点击过一次了,那么这次恢复正常的状态,并且将position从集合中移除。如果集合不存在该positon,则说明这是第一次点击,那么将它处理成点击的状态,并且将position添加到集合中去。
说完了,该上代码了
public class TestActivity extends Activity {private ListView listView;private TestAdapter adapter;//定义一个集合用来保存被点击的positionprivate List<Integer> clickList = new ArrayList<Integer>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_list);listView = (ListView) findViewById(R.id.list);adapter = new TestAdapter();listView.setAdapter(adapter);}class TestAdapter extends BaseAdapter {@Overridepublic int getCount() {return 22;}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(final int position, View convertView,ViewGroup parent) {final ViewHolder holder;if (null == convertView) {holder = new ViewHolder();convertView = LayoutInflater.from(TestActivity.this).inflate(R.layout.item_list, parent, false);holder.button = (Button) convertView.findViewById(R.id.btn);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}if (clickList.contains(Integer.valueOf(position))) {holder.button.setText("我是第" + position);} else {holder.button.setText("点击我吧");}holder.button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if (clickList.contains(position)) {clickList.remove(Integer.valueOf(position));holder.button.setText("点击我吧");} else {clickList.add(position);holder.button.setText("我是第" + position);}}});return convertView;}}class ViewHolder {Button button;}}
至于第二个方法,不过是变换了一种形式,其实和第一种方法是一样的意思。
只是展示方法的使用,所以只用了一个成员
public class Click {private boolean isClicked = false;public boolean isClicked() {return isClicked;}public void setClicked(boolean isClicked) {this.isClicked = isClicked;}}
继续上代码
public class TestActivity extends Activity {private ListView listView;private TestAdapter adapter;//ListView的数据源private List<Click> beanList = new ArrayList<Click>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_list);//添加22项数据for(int i=0; i<22; i++){beanList.add(new Click());}listView = (ListView) findViewById(R.id.list);adapter = new TestAdapter();listView.setAdapter(adapter);}class TestAdapter extends BaseAdapter {@Overridepublic int getCount() {return beanList.size();}@Overridepublic Object getItem(int position) {return beanList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(final int position, View convertView,ViewGroup parent) {final ViewHolder holder;if (null == convertView) {holder = new ViewHolder();convertView = LayoutInflater.from(TestActivity.this).inflate(R.layout.item_list, parent, false);holder.button = (Button) convertView.findViewById(R.id.btn);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}//判断初始状态,并作相应的内容处理Click bean = beanList.get(position);if (bean.isClicked()) {holder.button.setText("我是第" + position);} else {holder.button.setText("点击我吧");}holder.button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//原来是isClicked,即被点击过了,则更改isClicked为falseif (beanList.get(position).isClicked()) {beanList.get(position).setClicked(false);holder.button.setText("点击我吧");} else {beanList.get(position).setClicked(true);holder.button.setText("我是第" + position);}}});return convertView;}}class ViewHolder {Button button;}}
效果图
0 0
- ListView中的Button或CheckBox点击处理
- listview中Button、ImageButton、CheckBox点击冲突
- 关于ListView的item中包含Button或Checkbox时导致item无法点击问题
- 当Listview中的item与其中的Button/CheckBox的点击事件冲突时……
- Listview中的button点击事件
- ListView中的Button点击设置
- ListView中的Button点击设置
- ListView点击没有反应,(其每一项有button或checkbox子控件的时候),解决。。
- Android:处理ListView条目中的Button的点击事件和条目点击事件冲突
- Android ListView 中的CheckBox点击乱系
- ListView上有Button和CheckBox焦点处理
- ListView中的Item点击和Button点击焦点冲突
- listView中添加checkBox按键,点击是否选中处理。
- listview中的item和button的点击事件的冲突
- ListView和ListItem中的CheckBox点击冲突的问题
- Android ListView和item中的CheckBox点击冲突的问题解决
- ListView Item中有Button checkbox 点击Item子控件不响应解决
- Android ListView中嵌入Button/CheckBox后Item点击无效问题解决
- HTML5 - 使用polyfill(腻子脚本)填补旧浏览器对html5的支持缺陷
- Java对象的序列化
- JSP中setattribute与setParameter的区别
- 一些简单的有关字符串处理函数
- RAID阵列与LVM逻辑卷组原理
- ListView中的Button或CheckBox点击处理
- 初识接口interface
- 在linux 中去除^M字符
- HTML5 - 用CSS3动画制作场景切换效果(移动,旋转,淡入淡出等)
- ios蓝牙开发 ------ CoreBluetooth 教程<转>
- VC++6.0 空格错误之 unknown character '0xa1'
- R语言apply函数族笔记
- 关于公示编辑器写的公式在word文档中位置总是偏上解决办法。
- C++中一个关于复制构造函数和指针的问题