2.4.5 ListView之checkbox错位问题解决

Android基础入门教程——2.4.5 ListView之checkbox错位问题解决

标签(空格分隔): Android基础入门教程

本节引言:

作为ListView经典问题之一,如果你尝试过自定义ListView的item,在上面带有一个checkbox的话,那么 当你的item数超过了一页的话,就会出现这个问题,下面我们来分析下出现这种问题的原因,以及如何来 解决这个问题!

1.问题发生的原因:

这是网上找来的一幅关于ListView getView方法调用机制的一个图

上图中有一个Recycler的东东,平时我们ListView上可见的Item处于内存中,而且他的Item则放在 这个Recycler中,第一次加载item时,当前页面中的convertView都为NULL,当滚出屏幕,这是时候 ConvertView不为空,所以新的一项会复用这个ConvertView! 我们可以写个简单的例子,跟下log,下面是运行后的一些Log图!

从图中看出,,Postion从12开始,ConvertView就不为空了,具体这里代表的是什么, 我也不知道,目测要走源码…我们知道这里ConvertView会缓存就好,就是因为这个原因 造成的checkbox错位,所以第一个解决方式就是,不重用这个ConvertView,或者 说每次getView都将这个ConvertView设置为null,但是如果需要显示的Item数目巨大的话, 这种方法就会显得非常臃肿,一般实际开发我们使用的是下面的解决方法: 找个东东来保存当前Item CheckBox的状态,初始化的时候进行判断,设置是否选中!

2.解决方法示例:

好的存储这个Checkbox的方法有很多,你可以放到一个HashMap

{private String name;private String number;private boolean checkStatus;public Person(String name, String number) {super();this.name = name;this.number = number;this.checkStatus = false;}public String getName() {return name;}(String name) {this.name = name;}public String getNumber() {return number;}(String number) {this.number = number;}() {return checkStatus;}(boolean checkStatus) {this.checkStatus = checkStatus;}}

实现的Adapter类:ContactListAdapter.java:

.OnCheckedChangeListener{private List<Person> mData;private Context mContext;public ContactListAdapter(List<Person> data, Context context) {mData = data;mContext = context;}(List<Person> data) {mData = data;notifyDataSetChanged();}() {return mData.size();}@Overridepublic Person getItem(int position) {return mData.get(position);}(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {final Person person = mData.get(position);ViewHolder viewHolder;if (convertView == null) {convertView = LayoutInflater.from(mContext).inflate(R.layout.item_contact, parent, false);viewHolder = new ViewHolder();viewHolder.ly = (RelativeLayout) convertView.findViewById(R.id.lyContactListItem);viewHolder.txtName = (TextView) convertView.findViewById(R.id.txtName);viewHolder.txtNumber = (TextView) convertView.findViewById(R.id.txtNumber);viewHolder.cbxStatus = (CheckBox) convertView.findViewById(R.id.cbxStatus);convertView.setTag(viewHolder);viewHolder.cbxStatus.setTag(person);} else {viewHolder = (ViewHolder) convertView.getTag();}viewHolder.cbxStatus.setOnCheckedChangeListener(this);viewHolder.cbxStatus.setChecked(person.getcheckStatus());viewHolder.txtName.setText(person.getName());viewHolder.txtNumber.setText(person.getNumber());return convertView;}(CompoundButton buttonView, boolean isChecked) {Person person = (Person)buttonView.getTag();person.setCheckStatus(isChecked);}{RelativeLayout ly;TextView txtName;TextView txtNumber;CheckBox cbxStatus;}}

嘿嘿,非常简单,另外别忘了一点: checkbox监听器的方法要添加在初始化Checkbox状态的代码之前哦~

本节引言:

好的,本节给大家讲解了ListView的一个经典问题,ListView中checkbox错位的 问题解决,只需简单的添加一个记录checkbox选择状态的值,然后重写checkbox 点击事件的时候,先做判断~谢谢~

总结成功的经验能够让人越来越聪明,

2.4.5 ListView之checkbox错位问题解决

相关文章:

你感兴趣的文章:

标签云: