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の一番上からスクロールして (効率のために) をリサイクルし続け、アダプターに戻して再利用します。

が null でない場合convertViewは、 への以前の呼び出しで設定した可能性のあるビューまたはプロパティを手動でリセットするか、新しいオブジェクトgetView()を膨張させて返す必要があります。Viewそうしないと、説明した行の繰り返しの問題が発生します。

于 2013-08-20T23:05:43.797 に答える