Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Listview:getView在不可观察的视图上被多次调用_Android_Android Listview - Fatal编程技术网

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中的项目都保持不变(尽管它们的某些属性可能会发生变化),它们会堆积起来,并且每次都会添加重复项。