I'm trying to make my home like google play home , using main RecyclerView as vertical and in it's items i make another horizontal RecyclerView and that works fine but when I scroll down the horizontal RecyclerView items disappears like the images below
here the home on first loading (I didn't know why the horizontal first item not appears from it's beginning and I need to scroll left to see it correctly)
here the other items on scrolling down (and it faces the the same problem with it's first item)
here the first screen after I scroll down and back with scroll up the horizontal items disappears
here the second screen if i scroll down again and the strange thing there is a vertical item works fine and it's items didn't disappear
I tried some solutions
first I added addOnScrollListener and use adpter.notifyDataSetChanged(); on scrolling and that prevents the disappearing of items but it didn't save my last horizontal scrolling on scrolling down it backs me always to the first item.
second I try the solution in this answer and it didn't help Why RecyclerView items disappear with scrolling
here is my code for the first solution
my_recycler_view.getRecycledViewPool().setMaxRecycledViews(0, 0);
my_recycler_view.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy > 0) {
// Scrolling up
adapter.notifyDataSetChanged();
} else {
adapter.notifyDataSetChanged();
adapter.stopHandler();
}
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == AbsListView.OnScrollListener.SCROLL_STATE_FLING) {
// Do something
} else if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
// Do something
} else {
// Do something
}
}
});
here is my first adapter code
public class HomeRecyclerViewDataAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private ArrayList<NewHomeItemsModel> dataList;
private Context mContext;
ViewPager viewPager;
HeaderPagerAdapter headerPagerAdapter;
int page = 0;
private Handler handler;
private int delay = 5000; //milliseconds
Runnable runnable = new Runnable() {
public void run() {
if (headerPagerAdapter.getCount() == page) {
page = 0;
} else {
page++;
}
viewPager.setCurrentItem(page, true);
handler.postDelayed(this, delay);
}
};
public HomeRecyclerViewDataAdapter(Context context, ArrayList<NewHomeItemsModel> dataList) {
this.dataList = dataList;
this.mContext = context;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view;
switch (i) {
case Constants.type_header:
view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.home_header_item, null);
HeaderHolder mh = new HeaderHolder(view);
return mh;
case Constants.type_categories:
view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.home_vertical_item, null);
ItemRowHolder mho = new ItemRowHolder(view);
return mho;
case Constants.type_suggestedProducts:
view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.home_vertical_item, null);
ItemRowHolder pro = new ItemRowHolder(view);
return pro;
}
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder itemRowHolder, int i) {
NewHomeItemsModel newHomeItemsModel = dataList.get(i);
Log.d("itemType",String.valueOf(newHomeItemsModel.getType()));
Activity activity = (Activity) mContext;
switch (newHomeItemsModel.getType()) {
case Constants.type_header:
headerPagerAdapter = new HeaderPagerAdapter(activity, newHomeItemsModel.getHeaderImages());
viewPager.setAdapter(headerPagerAdapter);
if (headerPagerAdapter.getCount() == page) {
page = 0;
}
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
page = position;
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
startHandler();
if (Constants.auto_header.equals("start")){
//startHandler();
}else{
//stopHandler();
}
break;
case Constants.type_categories:
final String sectionName = dataList.get(i).getTitle();
ArrayList singleSectionItems = dataList.get(i).getCategories();
((ItemRowHolder) itemRowHolder).itemTitle.setText(sectionName);
final CategoriesRecyAdapter itemListDataAdapter = new CategoriesRecyAdapter(mContext, singleSectionItems);
// ((ItemRowHolder) itemRowHolder).recycler_view_list.setHasFixedSize(true);
final GridLayoutManager manager = new GridLayoutManager(activity, 2 ,
GridLayoutManager.HORIZONTAL, false);
//((ItemRowHolder) itemRowHolder).recycler_view_list.smoothScrollToPosition(0);
((ItemRowHolder) itemRowHolder).recycler_view_list.setLayoutManager(manager);
((ItemRowHolder) itemRowHolder).recycler_view_list.setAdapter(itemListDataAdapter);
((ItemRowHolder) itemRowHolder).recycler_view_list.getRecycledViewPool().setMaxRecycledViews(0, 0);
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return itemListDataAdapter.isHeader(position) ? manager.getSpanCount() : 1;
}
});
// itemListDataAdapter.notifyDataSetChanged();
((ItemRowHolder) itemRowHolder).actionMore.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(), sectionName, Toast.LENGTH_SHORT).show();
}
});
break;
case Constants.type_suggestedProducts:
final String sectionNameProduct = dataList.get(i).getTitle();
ArrayList singleSectionItemsProducts = dataList.get(i).getProducts();
((ItemRowHolder) itemRowHolder).itemTitle.setText(sectionNameProduct);
final HomeActivityRecyAdpater productsListDataAdapter = new HomeActivityRecyAdpater( singleSectionItemsProducts
,mContext);
final LinearLayoutManager LManager = new LinearLayoutManager(activity,
LinearLayoutManager.HORIZONTAL, false);
((ItemRowHolder) itemRowHolder).recycler_view_list.setLayoutManager(LManager);
((ItemRowHolder) itemRowHolder).recycler_view_list.setAdapter(productsListDataAdapter);
((ItemRowHolder) itemRowHolder).recycler_view_list.getRecycledViewPool().setMaxRecycledViews(0, 0);
productsListDataAdapter.notifyDataSetChanged();
((ItemRowHolder) itemRowHolder).actionMore.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(), sectionNameProduct, Toast.LENGTH_SHORT).show();
}
});
break;
}
}
@Override
public int getItemViewType(int position) {
NewHomeItemsModel newHomeItemsModel = dataList.get(position);
if (newHomeItemsModel != null) {
return newHomeItemsModel.getType();
}
// return super.getItemViewType(position);
return 0;
}
@Override
public int getItemCount() {
return (null != dataList ? dataList.size() : 0);
}
public class ItemRowHolder extends RecyclerView.ViewHolder {
protected TextView itemTitle;
protected RecyclerView recycler_view_list;
protected TextView actionMore;
public ItemRowHolder(View view) {
super(view);
itemTitle = (TextView) view.findViewById(R.id.best_offers_title);
recycler_view_list = (RecyclerView) view.findViewById(R.id.offers_rv);
actionMore = (TextView) view.findViewById(R.id.best_offers_more_action);
}
}
public class HeaderHolder extends RecyclerView.ViewHolder {
protected ImageView headerImg;
public HeaderHolder(View view) {
super(view);
viewPager = view.findViewById(R.id.Header_view_pager_item);
// this.headerImg = (ImageView) view.findViewById(R.id.header_pager_image);
}
}
public class ProductsHolder extends RecyclerView.ViewHolder {
protected TextView itemTitleProduct;
protected RecyclerView recycler_view_list;
protected TextView actionMore;
public ProductsHolder(View view) {
super(view);
this.itemTitleProduct = (TextView) view.findViewById(R.id.best_offers_title);
this.recycler_view_list = (RecyclerView) view.findViewById(R.id.offers_rv);
this.actionMore = (TextView) view.findViewById(R.id.best_offers_more_action);
}
}
public void stopHandler(){
if (handler!=null){
handler.removeCallbacks(runnable);
handler=null;
}
}
public void startHandler(){
if (handler==null){
handler = new Handler();
handler.postDelayed(runnable, delay);
}
}
}
so hope if any one can help about this problem and the problem of first loading of horizontal list which not display the whole first item