Android Listview:在不可观察的视图上多次调用getView

时间:2012-07-13 02:34:51

标签: android android-listview

(我已经看过this similar question) 我有一个ListView,我为其编写了一个自定义适配器和一个onitemclicklistener。我遇到了一个问题,即当选择列表的任何元素时,getView的前4个元素中的每一个都会调用ListView(两次),即使这些元素不可见。即使我没有在适配器上调用notifyDataSetChanged,也会发生这种情况 - 无论如何,前两个视图都被提取两次。这是正常的行为吗?我的问题并不是因为它被调用了两次,而是在不需要更新它时它被调用了。

顺便说一句,我没有使用wrap_content作为listview的高度或宽度 - 高度是match_parent而宽度是固定的dp数。

OnItemClickListener的onItemClick()方法在这里:

public void onItemClick(AdapterView<?> parent, View v, int position, long id) {

      mPicture = pictures[position];
      mPicturesAdapter.setCurrentPicture(mPicture);
      mPicturesAdapter.notifyDataSetChanged();
}
来自我的自定义适配器(扩展BaseAdapter)的

getView()位于:

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()两次。

3 个答案:

答案 0 :(得分:0)

只需通过

修改适配器即可
mPicturesAdapter.setCurrentPicture(mPicture);

ListView已经尝试更新自己。我猜你在没有调用notifyDataSetChanged

的情况下onClick方法仍然可以完成它的工作

答案 1 :(得分:0)

实际上,无论您使用哪个列表/组来填充ListView,都需要先清空它然后再调用它。例如,如果使用ListA填充ListView,则在第二次或任何连续更新中,您需要先清空ListA,然后添加项目,然后使用它进行填充。

答案 2 :(得分:-1)

if (convertView != null){

           Then populate list

   }