Как работают onBindViewHolder и RecyclerView? - PullRequest
0 голосов
/ 26 апреля 2019

Я прочитал этот пост Когда вызывается onBindViewHolder и как он работает? и официальная документация, но я не нашел ответов на свой вопрос. onBindViewHolder вызывается каждый раз, когда вам нужно связать данные, я помещаю журнал с переменной, которая увеличивается с каждым разом, когда он вызывается, и словом, с которым он должен связываться:

public class WordListAdapter extends RecyclerView.Adapter<WordListAdapter.WordViewHolder> {

    int x;

    ...

    @Override
    public void onBindViewHolder(WordViewHolder holder, int position) {

        WordItem current = mDB.query(position);
        holder.wordItemView.setText(current.getWord());

        Log.d("XLOGGIN", "word=" + current.getWord() + " " + "x=" + x);
        x++;

    }

    ...

}

это журнал:

Log before scroll
2019-04-26 10:15:18.064 19001-19001/com.adc.wordlistsql D/XLOGGIN: word=Adapter x=0
2019-04-26 10:15:18.150 19001-19001/com.adc.wordlistsql D/XLOGGIN: word=Android x=1
2019-04-26 10:15:18.213 19001-19001/com.adc.wordlistsql D/XLOGGIN: word=Android Performance x=2
2019-04-26 10:15:18.281 19001-19001/com.adc.wordlistsql D/XLOGGIN: word=Android Studio x=3
2019-04-26 10:15:18.346 19001-19001/com.adc.wordlistsql D/XLOGGIN: word=Androidx x=4
2019-04-26 10:15:18.410 19001-19001/com.adc.wordlistsql D/XLOGGIN: word=AsyncTask x=5
2019-04-26 10:15:18.474 19001-19001/com.adc.wordlistsql D/XLOGGIN: word=Data model x=6

Log after scroll
2019-04-26 10:15:36.979 19001-19001/com.adc.wordlistsql D/XLOGGIN: word=ListView x=7
2019-04-26 10:15:37.059 19001-19001/com.adc.wordlistsql D/XLOGGIN: word=OnClickListener x=8
2019-04-26 10:15:37.142 19001-19001/com.adc.wordlistsql D/XLOGGIN: word=SQLOpenHelper x=9
2019-04-26 10:15:37.219 19001-19001/com.adc.wordlistsql D/XLOGGIN: word=SQLiteDatabase x=10
2019-04-26 10:15:37.248 19001-19001/com.adc.wordlistsql D/XLOGGIN: word=ViewHolder x=11

onBindViewHolder вызывается RecyclerView, поэтому всякий раз, когда он должен связываться, он вызывается; как RecyclerView узнает, когда он больше не должен вызывать OnBindViewHolder, потому что больше нет данных для привязки? В моем коде я не нашел ничего, к чему можно отнести это поведение. В коде есть только запрос к базе данных и wordItemView setText.

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

onBindViewHolder() - это вызов каждый раз, когда вам нужно заполнить одну запись.Если ваш размер данных составляет, например, 10, при прокрутке списка метод будет вызываться 10 раз.Если вы прокрутите вверх снова, RecyclerView будет вызывать больше раз метод, обновляющий данные для представления.

Важно то, что вам необходимо определить, какие данные будут размещаться в каждой позиции.В вашем примере приращение только x, поэтому при каждом вызове метода onBindViewHolder() будут разные данные.

Размер списка определяется методом getItemCount().

Надеюсь, это поможет.

0 голосов
/ 26 апреля 2019

Recyclerview похож на listview, единственное существенное отличие состоит в том, что reyclerview будет загружать только те элементы, которые в данный момент видны на экране, тем самым, обладая чрезвычайно хорошей временной и пространственной сложностью, когда дело доходит до загрузки большого количества данных в списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...