0

我这里有一个非常简单的适配器。我想在列表中有很多空格的地方。假设是 1,000。适配器后面的数据集只有 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.*/
    }


}
4

1 回答 1

1

你在里面做什么getView()?这很重要!

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

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

于 2013-08-20T23:05:43.797 回答