onBindViewHolder не запускается для элементов в представлении ресайклера - PullRequest
0 голосов
/ 05 августа 2020

У меня есть вид ресайклера с 10 предметами. Я прокручиваю страницу вниз и пытаюсь набрать notifyItemChanged(pos) для первого элемента, который не отображается с тех пор, как я прокрутил страницу вниз. Когда я вызываю это, он не запускает onBindViewholder() для первого элемента. Короче говоря, мой вопрос: когда я звоню notifyItemChanged(pos) с позиции, которая не отображается на экране, не вызывает ли это onBindViewHolder()?. Это мой код адаптера

@SuppressLint("NewApi")
    @Override
    public void onBindViewHolder(@NonNull final UserTasksViewHolder holder, final int position) {
        if (usertasks != null) {
            final UserSessionTasksEntity current = usertasks.get(position);
            viewPos = prefs.getString(view_position, "");
            holder.taskCode.setText(current.getTaskCode());
            holder.taskName.setText(current.getTaskName());
    }

    @Override
    public int getItemCount() {
        if (usertasks != null)
            return usertasks.size();
        return 0;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }

Ответы [ 3 ]

1 голос
/ 07 августа 2020

Ваша ошибка связана с вашим методом onItemCount. NotifydatasetChanged вызывает onBindViewHolder для каждого элемента в ваших пользовательских задачах и доходит до вашего usertasks.size. Измените свой onGetItemCount на это:

@Override
public int getItemCount() {
    if (usertasks != null)
        return usertasks.size();
    else{
       return 0;
    }
     
}

Теперь ваш notifyDatasetChanged будет вызывать onBindViewHolder, пока ваши пользовательские задачи не равны нулю. Если он по-прежнему не вызывает, поищите свои пользовательские задачи, так как он, вероятно, равен null

0 голосов
/ 18 августа 2020

Я смог это исправить. Проблема заключается в том, что держатель представления привязки никогда не запускается для элементов, которые уже были переработаны. Поскольку мой logi c был записан в держателе представления привязки, он не работал, вместо этого я обновил свой список во фрагменте и вызвал notifyDataSetChanged.

0 голосов
/ 06 августа 2020

Сначала создайте метод в классе адаптера просмотра ресайклера, например, для обновления:

public void setData(ArrayList<GridItem> newitems,int pos){ // this is new array
        this.mydata=newitems;//here you update your orignal data
        this.notifyItemChanged(pos);//here notify the change at particular position

    }

В вашем классе фрагмента:

//get your recyclerview  adapter and call the above method
adapter.setData(newdata,position);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...