当前位置: 代码迷 >> Android >> ListView 刷新后点击无响应有关问题,希望了解的高手解答一下
  详细解决方案

ListView 刷新后点击无响应有关问题,希望了解的高手解答一下

热度:57   发布时间:2016-05-01 21:24:22.0
ListView 刷新后点击无响应问题,希望了解的高手解答一下
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()监听,这样就没有问题了。
  相关解决方案