Android: ReViewlerView ImageView перерабатывают при прокрутке
В моем приложении у меня есть RecyclerView. Каждый элемент RecyclerView содержит ImageView, который представляет элементы, добавленные в закладки.
Я реализовал логику, которая проверяет состояние элемента для переключения содержимого ImageView (состояние закладки) в методе onBindViewHolder() внутри моего пользовательского адаптера.
Проблема, с которой я столкнулся, заключается в том, что при прокрутке представления я получаю переработанный актив ImageView, хотя моя логика реализована в onBindViewHolder().
Я уже пробовал эти решения здесь, но не помогло:
- Повторите фон на элементе с помощью прокрутки RecycleAdapter и прокрутите
- RecyclerView вызывает проблемы при утилизации
- переработанный элемент recyerview сохраняет старый цвет фона
Все говорили, что вы должны реализовать логику внутри метода onBindViewHolder() и сделать логику зависимой от модели данных, но я уже сделал это.
Вот мой код RecyclerAdapter.java:
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.BasicViewHolder> {
Context mContext;
List<DataModel> mDataModels;
public RecyclerAdapter(Context context, List<DataModel> dataModels) {
mContext = context;
mDataModels = dataModels;
}
@Override
public BasicViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Context context = parent.getContext();
int layoutIdForListItem = R.layout.item_layout;
LayoutInflater inflater = LayoutInflater.from(context);
boolean shouldAttachToParentImmediately = false;
View view = inflater.inflate(layoutIdForListItem, parent, shouldAttachToParentImmediately);
BasicViewHolder viewHolder = new BasicViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(BasicViewHolder holder, int position) {
holder.bind(position);
}
@Override
public int getItemCount() {
return mDataModels.size();
}
public class BasicViewHolder extends RecyclerView.ViewHolder {
public final TextView titleTextView;
public final ImageView bookmarkImageView;
public BasicViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
titleTextView = itemView.findViewById(R.id.textView);
bookmarkImageView = itemView.findViewById(R.id.imageView);
}
void bind(int listIndex) {
titleTextView.setText(mDataModels.get(listIndex).getTitle());
//I think here is where the problem is being caused
if(mDataModels.get(listIndex).isSelected()) bookmarkImageView.setImageDrawable(mContext.getResources().getDrawable(R.drawable.ic_bookmark));
}
}
}
DataModelList только указывает на изменение ImageView элемента в позиции 1
Тем не менее, другие элементы получают тот же ImageView при прокрутке
Я надеюсь, что вы, ребята, можете помочь мне, спасибо за ваше время.
1 ответ
Проблема с вашим кодом в том, что вы обновляете только bookmarkImageView
когда привязываемый элемент выбран. В связи с тем, что переработка представления работает, важно всегда обновлять каждое представление. В вашем случае это означает отображение закладки, когда элемент выбран, и скрытие закладки, когда элемент не выбран.
Попробуйте что-то вроде этого:
if (mDataModels.get(listIndex).isSelected()) {
bookmarkImageView.setImageResource(R.drawable.ic_bookmark);
} else {
bookmarkImageView.setImageDrawable(null);
}