2014-12-05 65 views
4

奇怪的是,我的CustomBaseAdapter错误地返回了需要膨胀的项目,等等,适配器将错误的数据显示在行上!BaseAdapter在getView()方法调用时返回错误的位置

虽然我现在用的是ViewHolder模式,我的ListView layout_height设置为match_parent和无微不至我发现,以保证项目的ListView稳定,已经落实,CustomBaseAdapter似乎没有它响应。

getView()方法

@Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 
     mItemView = convertView; 
     if (convertView == null) { 
      mItemView = mInflater.inflate(R.layout.layout_listview_row, parent, false); 
      holder = new ViewHolder(); 
      //setting up the Views 
      mItemView.setTag(holder); 
     } else { 
      holder = (ViewHolder) mItemView.getTag(); 
     } 

     //Getting the item 
     final MyItem item = getItem(position); 

     //Doing some checks on my item and then display the appropriate data. 

     //By saying checks i mean something like: 

     if(item.getSomething().equals("blabla")){ 
      //Load some pic 
     }else{ 
      //Load another pic 
     } 
     //Now when i have scrolled the list once and return back to top, 
     //Suddenly in Logcat i am seeing that the first row is getting matched to 
     //the object in the 4th position, but it doesnt display its data. It displays 
     //the text from the first item as it was supposed to do. But the relation between 
     //the first row and the item's position is like 0->4. 
} 

其他方法

@Override 
public int getCount() { 
    return this.mObjects.size(); 
} 

@Override 
public MyItem getItem(int position) { 
    return this.mObjects.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

我从字面上搜索并尝试在谷歌的一切!似乎没有任何东西给我一个解决方案。

任何帮助,将不胜感激!让我知道你是否需要更多的代码。

+0

采取这里看看......是的,我知道这是1H但是,值得...的https:/ /www.youtube.com/watch?v=wDBM6wVEO70 – Selvin 2014-12-05 00:32:41

+0

我已经看过它,但无法理解我做错了什么! – Pavlos 2014-12-05 00:36:08

+0

是的,我修正了这个问题,但给-1只是因为你猜测我可能在做某种愚蠢的检查并不公平。无论如何... – Pavlos 2014-12-05 00:51:08

回答

1

我怀疑mItemView是罪魁祸首这里。通过名称来判断,这是一个实例字段,因此如果CustomBaseAdapter中有多个线程调用getView(),则mItemView可能会更改它指向哪个循环视图。另外,我假设getView()return mItemView结尾,对吧?

无论如何,我会建议尝试消除mItemView,只是写这样的功能:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.layout_listview_row, parent, false); 
     ViewHolder holder = new ViewHolder(); 
     //setting up the Views 
     convertView.setTag(holder); 
    } 

    ViewHolder holder = (ViewHolder) convertView.getTag(); 

    // ... 

    return convertView; 
} 
+1

“另外,我假定getView()以返回mItemView结束,对吧?”这有点节省了我很多时间,这种模式奇怪的工作没有重绘+加载适配器时做了一些其他的修改!我接受了答案,并感谢你! – Pavlos 2014-12-05 14:07:17

2

您正在“回收”显示对象,但您有责任向其中获取适当的数据。问题是这行代码:

mItemView = convertView; 

convertView是您的数据的“容器”。如果convertView不为空,则构建容器,但必须将适当的数据放入其中。这通常通过“使用”位置指示器来完成。

也许是这样的:

if (convertView == null) { 
     mItemView = mInflater.inflate(R.layout.layout_listview_row, parent, false); 
     holder = new ViewHolder(); 
     //setting up the Views 
     mItemView.setTag(holder); 
    } else { 
     holder = getItem(position); 
     mItemView.setTag(holder); 
    } 
+0

为什么我会让持有人等于所选位置的物品?你能解释holder = getItem(position)的用途吗? – Pavlos 2014-12-05 00:23:27

+0

@Selvin:你说的是什么意思?如果物品被重复使用,我该如何传递正确的数据? – Pavlos 2014-12-05 00:26:41

+0

我的意思是:这段代码没有感觉,但关于回收的第一部分是真的 – Selvin 2014-12-05 00:30:33

相关问题