ListView在什么样的情况下会出现错位?错位的原因是什么?怎么解决?下面的内容会对这些问题做一个讲解。
1.ListView在什么样的情况下会出现错位?
其实错位是当我们的ListView的每个单项(item)从屏幕中移入或是移出,我们的系统会对这个item的状态进行重新定义——是否被选中等等。一般只是显示的情况下,我们的ListView很少出现错位,因为状态没有改变。
我们现在就是拿一个CheckBox组件来说明,因为CheckBox是一个比较基础的换件,而且CheckBox的状态改变比较明显。
例如下面这种情况:
初始界面中选中第0个和第1个:
当我们对屏幕进行滑动再回来的时候,我们会看到,第0个的CheckBox的勾不见了。第9个的CheckBox出现了勾,这是个就是错位。
也就是说我们在重新加载由屏幕之外的item移到屏幕之内时,CheckBox的状态发生改变。
如是,我们想是不是有一种方法来记录这种变化,且变化只是在监听器监听到有需要改变的状态发生时,才会变化。
这里我们用一个ArrayList<Boolean>的数组来记录。
关键代码如下:
public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; if (recordMap.get(position) == null) { convertView = mInflater.inflate(R.layout.listview_item, null); viewHolder = new ViewHolder(convertView); Log.i(TAG, "1: " + position); final int finalP = position; recordMap.put(position, convertView); viewHolder.checkBox.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { CheckBox checkBox = (CheckBox)v; isChecked.set(finalP, checkBox.isChecked()); } }); convertView.setTag(viewHolder); } else { Log.i(TAG, "2: " + position); convertView = recordMap.get(position); viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.button.setText("click " + position); viewHolder.checkBox.setChecked(isChecked.get(position)); return convertView; }