我这里有一个非常简单的适配器。我想在列表中有很多空格的地方。比方说1000。适配器后面的数据集中只有5个元素。当此适配器加载到列表视图中时,一切都会正常,直到您滚动屏幕。然后重置位置并加载数据集中的数据。为什么? getCount()在被重写时是否需要始终返回实际位于数据集中的大小?
private abstract class BlankEntriesAdapter extends BaseAdapter {
private final List<String> rowList;
public BlankEntriesAdapter(List<String> rowList) {
this.rowList = rowList;
}
@Override
public int getCount() {
//force a few blank spaces
return 1000;
}
@Override
public String getItem(int position) {
if (position < rowList.size()) {
return rowList.get(position);
}
return null;
}
@Override
public long getItemId(int position) {
RowItem item = getItem(position);
if (item != null) {
return item.rowId;
}
return 0L;
}
@Override
public boolean isEnabled(int position) {
return position < rowList.size();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//ISSUE IS HERE. Position numbers start to repeat. Expect position to match what row was drawn to screen.
String stringItem = getItem(position);
/*Load string to view if not null. Code not shown.*/
}
}
答案 0 :(得分:1)
你在getView()
内做了什么?这很重要!
我想问题是在getView()
内你正在返回convertView
未经修改,已经初始化以表示列表中的前一行。基本上,列表视图将继续回收View
,因为它们从列表顶部滚动(为了提高效率)并将它们传递回适配器以便重用。
如果convertView
不为null,那么您需要手动重置之前调用getView()
时可能在其上设置的任何视图或属性,或者膨胀并返回新的View
对象。否则,您将观察到您描述的重复行问题。