1.BaseAdapter.getView缓存问题
为了提高效率,在BaseAdapter.getView中我使用数组缓存了已经创建的view:
public View getView(int position, View convertView, ViewGroup parent) {
if (Constant.DEBUG)
Log.d(Constant.TAG, "KeyItemAdapter.getview(positon=" + position + ")");
if (viewArray[position] == null) {
viewArray[position] = mInflater.inflate(layoutID, null);
// 添加按钮响应函数
ImageButton btnSetting = (ImageButton) viewArray[position].findViewById(R.id.ibtn_setting);
btnSetting.setOnClickListener(new KeyItemButtonListener(position));
}
//后面代码就是对view的一些设置
convertView = viewArray[position];
return convertView;
现在问题出来了,当listview的数据发生改变时,我调用
adapter.notifyDataSetChanged();
刷新列表,这时候BaseAdapter.getView将会重新执行,重刷新后的列表点击btnSetting就没有反应了,或者第一次点击有反应,后面就没有反应
导致ui出现了一些混乱
我进行如下修改就ok:
if (Constant.DEBUG)
Log.d(Constant.TAG, "KeyItemAdapter.getview(positon=" + position + ")");
// if (viewArray[position] == null) {
// viewArray[position] = mInflater.inflate(layoutID, null);
// // 添加按钮响应函数
// ImageButton btnSetting = (ImageButton) viewArray[position].findViewById(R.id.ibtn_setting);
// btnSetting.setOnClickListener(new KeyItemButtonListener(position));
// }
viewArray[position] = mInflater.inflate(layoutID, null);
// 添加按钮响应函数
ImageButton btnSetting = (ImageButton) viewArray[position].findViewById(R.id.ibtn_setting);
btnSetting.setOnClickListener(new KeyItemButtonListener(position));
可是不明白为什么会这样,希望高手能够详细解答一下。
------解决方案--------------------
不用这么麻烦的,原因是android系统会给本身的view添加一个缓存,这个缓存在你notifyDataSetChange后一定要记得刷新。通过调用listView的requestFocusFromTouch()函数来重置你的OnItemClickListener()监听,这样就没有问题了。