I am using a RecyclerView in my app but when I scroll on my RecyclerView my items will disappear! I used this code for a lot of RecyclerView but this time I don\'t know what
For using muntiple views in a recyclerView it is not appropriate to set VISIBLE or GONE for them and the best way is to use multiple viewHolder for recyclerView something like this:
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import free.calendar.app.codenevisha.com.hamrahcalendar.R;
import model.ReminderModel;
import utils.G;
import static utils.G.SEASON_WINTER;
public class SchedualAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private ArrayList<ReminderModel> items;
private Context mContext;
public SchedualAdapter(ArrayList<ReminderModel> items, Context mContext) {
this.items = items;
this.mContext = mContext;
}
public static class ViewHolderDefault extends RecyclerView.ViewHolder {
TextView txt_eventTitle;
TextView txt_dateNumber;
TextView txt_dateName;
public ViewHolderDefault(View v) {
super(v);
txt_eventTitle = (TextView) v.findViewById(R.id.txt_eventTitle);
txt_dateName = (TextView) v.findViewById(R.id.txt_dateName);
txt_dateNumber = (TextView) v.findViewById(R.id.txt_dateNumber);
}
}
public static class ViewHolderSeason extends RecyclerView.ViewHolder {
ImageView img_monthPic;
public ViewHolderSeason(View v) {
super(v);
img_monthPic = (ImageView) v.findViewById(R.id.img_monthPic);
}
}
@Override
public int getItemViewType(int position) {
/*
* 0 default
* 1 spring
* 2 Summer
* 3 fall
* 4 winter
*/
int state;
String title = G.COMMON_DAY;
if (items.get(position).getTitle().equals(G.SEASON_SPRING)) {
return 1;
} else if (items.get(position).getTitle().equals(G.SEASON_SUMMER)) {
return 2;
} else if (items.get(position).getTitle().equals(G.SEASON_FALL)) {
return 3;
} else if (items.get(position).getTitle().equals(SEASON_WINTER)) {
return 4;
}
return 0;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// Create a new View
final View v1 = LayoutInflater.from(mContext).inflate(R.layout.schedual_recycler_default_viewgroup, parent, false);
final View v2 = LayoutInflater.from(mContext).inflate(R.layout.schedual_recycler_seasion_viewgroup, parent, false);
if (viewType == 0) {
return new ViewHolderDefault(v1);
} else {
return new ViewHolderSeason(v2);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
switch (holder.getItemViewType()) {
case 0:
ViewHolderDefault viewHolderDefault = (ViewHolderDefault) holder;
viewHolderDefault.txt_dateNumber.setText(items.get(position).getDate());
viewHolderDefault.txt_dateNumber.setText(items.get(position).getDate());
break;
case 1:
ViewHolderSeason viewHolderSeason1 = (ViewHolderSeason) holder;
viewHolderSeason1.img_monthPic.setImageResource(R.drawable.spring);
break;
case 2:
ViewHolderSeason viewHolderSeason2 = (ViewHolderSeason) holder;
viewHolderSeason2.img_monthPic.setImageResource(R.drawable.summer);
break;
case 3:
ViewHolderSeason viewHolderSeason3 = (ViewHolderSeason) holder;
viewHolderSeason3.img_monthPic.setImageResource(R.drawable.fall);
break;
case 4:
ViewHolderSeason viewHolderSeason4 = (ViewHolderSeason) holder;
viewHolderSeason4.img_monthPic.setImageResource(R.drawable.winter);
break;
}
}
@Override
public int getItemCount() {
return items.size();
}
}
Instead of using simple position (which is actually adapterPosition AFAIK) you should try using getAdapterPosition/getLayoutPosition. Read about difference between them. This might help. If it not you cat try to use different ViewTypes of items. Good luck
To hide certain views with multiple items, it is better to hide the base layout by,
1. Give an id to the base layout of the view in XML.
2. Define the view inside your "RecyclerViewAdapter class"
LinearLayout mItems_timelineId;
mItems_timelineId = itemView.findViewById(R.id.items_timelineId);
3. Then remove the view wherever you wish to by,
mItems_timelineId.removeAllViews();
This is worked for me. Thank you.
Like the name implies, the recycler view reuses views types from existing items on the same type that have been drawn already in places that it to avoid drawing new ones which is resource intensive.
That being said this line here is your culprit holder.layoutTop.setVisibility(View.VISIBLE); Rather than use an if-else in onBindViewHolder explore the use of viewtypes. That is the correct way to implement different layouts in on recycler view items. This stackoverflow question should provide some insight How to create RecyclerView with multiple view type?
I had the same issue (https://github.com/square/picasso/issues/845) but in github found this and worked for me. Thaks to @raj9686
rv.getRecycledViewPool().setMaxRecycledViews(0, 0);