Android Listview:getView在不可观察的视图上被多次调用
(我已经看到了) 我有一个Android Listview:getView在不可观察的视图上被多次调用,android,android-listview,Android,Android Listview,(我已经看到了) 我有一个ListView,我为它编写了一个自定义适配器,还有一个onitemclicklistener。我遇到了一个问题,当选择列表中的任何元素时,getView会被调用(两次),用于ListView的前4个元素,即使这些元素不可见。即使我没有在适配器上调用notifyDataSetChanged,也会发生这种情况-不管怎样,前4个视图都会被提取两次。这是正常的行为吗?我的问题不在于它被调用了两次,而是在不需要更新它们的时候它被调用了 顺便说一句,我没有对listview的高度
ListView
,我为它编写了一个自定义适配器,还有一个onitemclicklistener
。我遇到了一个问题,当选择列表中的任何元素时,getView
会被调用(两次),用于ListView
的前4个元素,即使这些元素不可见。即使我没有在适配器上调用notifyDataSetChanged
,也会发生这种情况-不管怎样,前4个视图都会被提取两次。这是正常的行为吗?我的问题不在于它被调用了两次,而是在不需要更新它们的时候它被调用了
顺便说一句,我没有对listview的高度或宽度使用wrap_内容-高度是match_parent,宽度是dp的固定数字
onItemClick Listener的onItemClick()
方法如下:
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
mPicture = pictures[position];
mPicturesAdapter.setCurrentPicture(mPicture);
mPicturesAdapter.notifyDataSetChanged();
}
public View getView(int position, View convertView, ViewGroup parent) {
Log.v("tag", "Getting view for position "+position);
LayoutInflater inflater = LayoutInflater.from(mContext);
LinearLayout layout = (LinearLayout)
inflater.inflate(R.layout.picture_thumbnail, parent, false);
// set up the linearlayout here ...
return layout;
}
在任何项目单击时,无论单击了哪个项目,都会对位置0-3调用两次getView()。只需通过修改适配器即可
if (convertView != null){
Then populate list
}
mPicturesAdapter.setCurrentPicture(mPicture);
ListView已尝试更新自身。我猜onClick方法在不调用notifyDataSetChanged的情况下仍然可以完成它的工作。实际上,无论您使用什么列表/组来填充ListView,您都需要先清空它,然后重新调用它。例如,如果使用ListA填充ListView,则在第二次或任何连续更新中,您需要先清空ListA,然后添加项目,然后使用它进行填充。
setCurrentPicture
是我自己编写的一种方法。如果我没有调用notifyDataSetChanged,那么getView仍然会在前4个视图上调用两次,但在实际可观察的视图上不会调用两次。但似乎值得实施,所以我会这么做。但是,我不认为这会影响这个问题。问题不在于convertView-我知道我可以在getView()中执行一些视图回收,但我正在试图了解在不可观察的视图上调用getView是否是一个问题。@Pulak不仅仅是你“可以”执行视图回收。仅当需要回收子项时才应使用ListView。如果不回收视图,其行为可能无法预测,从而导致一些未知问题。尝试回收其子项,如果问题仍然存在,您仍然可以缩小可能的原因。@reTs-如果我不需要回收子项,我可以使用哪些其他视图来创建包含10-20项的可滚动列表?@Pulak只需使用一个包含线性布局的滚动视图,给你所有的孩子充气。@Pulak实际上你介意告诉我为什么你不愿意看到回收吗?它没有坏处,您只需要在Android中添加4或5行代码。不过,我没有添加任何项目-listview中的项目都保持不变(尽管它们的某些属性可能会发生变化),它们会堆积起来,并且每次都会添加重复项。