为什么getCount()大于适配器数据集重复位置

时间:2013-08-20 22:50:06

标签: android baseadapter

我这里有一个非常简单的适配器。我想在列表中有很多空格的地方。比方说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.*/
    }


}

1 个答案:

答案 0 :(得分:1)

你在getView()内做了什么?这很重要!

我想问题是在getView()内你正在返回convertView未经修改,已经初始化以表示列表中的前一行。基本上,列表视图将继续回收View,因为它们从列表顶部滚动(为了提高效率)并将它们传递回适配器以便重用。

如果convertView不为null,那么您需要手动重置之前调用getView()时可能在其上设置的任何视图或属性,或者膨胀并返回新的View对象。否则,您将观察到您描述的重复行问题。