ImageView, кажется, перерабатывается, как только они покидают экран в RecyclerView - PullRequest
1 голос
/ 09 мая 2019

Я только начал использовать RecyclerView для отображения некоторых строк, содержащих ImageView и TextView.Все правильно отображается при открытии экрана.Если я быстро прокручиваю до конца списка, то быстро возвращаюсь назад, проблем нет.Однако, как только я медленно прокручиваю вниз, чтобы отобразить следующую строку, а 1-я строка больше не отображается, прокрутка назад вверх покажет черный квадрат вместо моего растрового изображения.

Я думал, что будет вызвана onBindViewHolder ()снова при прокрутке вверх, но это происходит только после прокрутки на 3 строки.Похоже, что RecyclerView выполняет предварительную выборку некоторых строк

Я попытался вызвать setItemPrefetchEnabled (false);на layoutManager или setInitialPrefetchItemCount (0);но это ничего не меняет

Есть идеи, что происходит и как это исправить?

Я делаю тыкать, поэтому код здесь минимален

//Фрагмент

final RecyclerView view = this.fragmentView.findViewById(R.id.recyclerView);
view.setHasFixedSize(true);
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
//layoutManager.setItemPrefetchEnabled(false);
//layoutManager.setInitialPrefetchItemCount(0);
view.setLayoutManager(layoutManager);
MyAdapter adapter = new MyAdapter(data);
view.setAdapter(adapter);

// ViewHolder

    public class MyViewHolder extends RecyclerView.ViewHolder {

        ImageView thumbnail;
        TextView name;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
        }
}

// Адаптер

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // create a new view
    final View view = LayoutInflater.from(parent.getContext()).inflate(R.id.my_layout, parent, false);
    final MyViewHolder viewHolder = buildViewHolder(view);
    view.setTag(viewHolder);        
    return viewHolder;
}

@Override
public void onBindViewHolder(MyViewHolder viewHolder, int position) {
    final MyData myData = this.data.get(position);
    viewHolder.name.setText(myData.getName());
    viewHolder.thumbnail.setImageBitmap(getBitmap(myData.getThumbnailPath()));
}

private MyViewHolder buildViewHolder(View view) {
    final MyViewHolder viewHolder = new MyViewHolder(view);
    viewHolder.name = view.findViewById(R.id.name);
    viewHolder.thumbnail = view.findViewById(R.id.thumbnail);
    return viewHolder;
}

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Похоже, что звонит

this.view.setItemViewCacheSize(0);

в моем RecyclerView исправляет проблему, но я не понимаю, почему это необходимо. Я все еще хотел бы понять, что здесь происходит

0 голосов
/ 09 мая 2019

Я не правильно понял ваш вопрос, и я также не могу комментировать.Но если ваша проблема заключается в том, что представления перерабатываются, попробуйте:

holder.setIsRecyclable(false).

внутри onBindViewHolder() это говорит: «Эй, перестань, перестань так перерабатывать представления»

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