Ответ 1
recyclerview
повторно использует существующие элементы и просто связывает новые данные с этими элементами - это предотвращает создание и уничтожение элементов, которые они должны быть переработаны;).
Посмотрите на конструктор вашего ViewHolder
. В нем вы передаете исходный список данных, которые ваши ViewHolders привязаны к. По сути, это создает статическую привязку к вашему первоначальному списку, не отфильтрованный список:
public ViewHolder(View itemView, Context context ,List<listitem_gib> getDataAdapter ) {
super(itemView);
itemView.setOnClickListener(this);
this.getDataAdapter = getDataAdapter; <-- this is stored in the viewholder
...
}
Чем лучше работать, тем лучше использовать onBindViewHolder
для RecyclerViewAdapter
. Это позволит ViewHolder
использовать текущие элементы адаптера во время щелчка следующим образом:
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
listitem_gib item = getDataAdapter.get(position);
holder.bind(item);
}
Обновите свой ViewHolder
следующим образом:
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
private TextView name;
private TextView num;
private ImageView img1;
ImageButton fav;
Context context;
private listitem_gib currentItem; //<-- allows this viewholder to keep a reference to the bound item
public ViewHolder(View itemView, Context context) { //<-- no more adapter in constructor
super(itemView);
itemView.setOnClickListener(this);
this.context = context;
this.fav = (ImageButton) itemView.findViewById(R.id.btn_fav);
name = (TextView) itemView.findViewById(R.id.Main_Text) ;
num = (TextView) itemView.findViewById(R.id.Second_Text) ;
img1 = (ImageView) itemView.findViewById(R.id.img1) ;
}
void bind (listitem_gib item) { //<--bind method allows the ViewHolder to bind to the data it is displaying
name.setText(item.getName());
num.setText(item.getnum());
Picasso.with(this.context).load("http://i-geeky.info/android/image/" + item.getimg()).into(holder.img1);
currentItem = item; //<-- keep a reference to the current item
}
@Override
public void onClick(View v) {
Intent intent = new Intent(this.context,Rewaya_info.class);
intent.putExtra("name",currentItem.getName()); // <-- makes use of currentItem instead of adapter
intent.putExtra("url",currentItem.geturl());
intent.putExtra("img",currentItem.getimg());
intent.putExtra("num",currentItem.getnum());
intent.putExtra("size",currentItem.getsize());
this.context.startActivity(intent);
}
}
- Взгляните на этот ответ для Получить элемент и его позицию в RecyclerView, чтобы обеспечить лучший подход.
- Если вы можете, попробуйте избегать передачи вашего контекста.
- Сохранять поля
private
Удачи!