3

私のカスタムListAdapterでは、GetView()が最初に呼び出されたときに、convertViewはNULLとして渡されますが、2回目は、最初に作成されたビューとして渡されます。私のListViewには4つの行があり、4つすべてが同時に画面に表示されます。ドキュメントから、convertViewは、すでに作成され、画面からスクロールされたビューである必要があるようです。私はconvertViewが4回すべてnullになることを期待していたので、4つの別々のビューを作成/拡張します。getViewを最初に呼び出した後、convertViewを使用する必要がありますか?ありがとう。

OnCreate()の場合:

    Cursor questions = db.loadQuestions(b.getLong("categoryId"), inputLanguage.getLanguageId(), outputLanguage.getLanguageId());
    startManagingCursor(questions);

    ListAdapter adapter = new QuestionsListAdapter(this, questions);

    ListView list = (ListView)findViewById(R.id.list1);
    setListAdapter(adapter);

アダプタークラス

private class QuestionsListAdapter extends BaseAdapter implements  ListAdapter{

    private Cursor c;
    private Context context;

    public QuestionsListAdapter(Context context, Cursor c) {
        this.c = c;
        this.context = context;
    }

    public Object getItem(int position) {
        c.moveToPosition(position);
        return new Question(c);
    }

    public long getItemId(int position) {
        c.moveToPosition(position);
        return new Question(c).get_id();
    }

    @Override
    public int getItemViewType(int position) {

        Question currentQuestion = (Question)this.getItem(position);
        if (currentQuestion.getType().equalsIgnoreCase("text"))
            return 0;
        else if (currentQuestion.getType().equalsIgnoreCase("range"))
            return 0;
        else if (currentQuestion.getType().equalsIgnoreCase("yesNo"))
            return 2;
        else if (currentQuestion.getType().equalsIgnoreCase("picker"))
            return 0;
        else if (currentQuestion.getType().equalsIgnoreCase("command"))
            return 0;
        else if (currentQuestion.getType().equalsIgnoreCase("datePicker"))
            return 0;
        else if (currentQuestion.getType().equalsIgnoreCase("diagram"))
            return 0;
        else
            return -1;
    }

    @Override
    public int getViewTypeCount() {
        return 7;
    }

    public int getCount() {
        return c.getCount();
    }

    public View getView(int position, View convertView, ViewGroup viewGroup) {

        Question currentQuestion = (Question)this.getItem(position);

        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.question_row_text, null);
        }
        //setup cell

        return convertView;
    } 
}
4

3 に答える 3

3

私の記憶が正しければ、GetView表示される行ごとに2回呼び出されます。最初の呼び出しセットはレイアウト目的で行われ、2番目のセットは実際に表示されるビューを返すと思います。2番目の呼び出しセットは、最初の呼び出しセットで返されたのと同じビューを返す必要があることは理にかなっています。

いずれにせよ、コードは、レイアウト用に呼び出されているのか、表示用に呼び出されているのかを気にする必要はありません。ほとんどすべての状況で、convertViewがnullでない場合、通常はそれconvertViewが返されます。それ以外の場合は、新しいビューを返す必要があります。

于 2011-06-15T21:03:14.677 に答える
0

正直なところ、私はあなたのコードに多くの間違いを見ることができません。カーソルを管理できるように、いくつかのメソッドを拡張CursorAdapterしてオーバーライドすることをお勧めします。

于 2011-06-07T22:49:04.987 に答える
0

2014年に早送りすると、同じ問題が発生していました...この投稿の解決策はどれもうまくいきませんでした。上記の回答とコメントで参照されているGoogleI/ Oビデオを見ていたとき、回答(私の特定のケースの場合)は約19分ですぐに明らかになりました...

GETVIEWTYPECOUNT()から返される数値は、アダプターの存続期間を通じて一定である必要があります!!!!

任意の数のタイプのビュー/データを動的に持つことができるアダプターを作成しました...そしてgetViewTypeCount()メソッドは現在の数のビュータイプを返しました...したがって、アダプターに新しいデータ型を追加した場合、戻り値が変更されます。

それを定数にすることで私の問題は解決しました。うまくいけば、これは将来的に他の人々にも役立つでしょう。

于 2014-03-06T21:05:34.010 に答える