1

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 home on first loading here the other items on scrolling down (and it faces the the same problem with it's first item) here the other items on scrolling down here the first screen after I scroll down and back with scroll up the horizontal items disappears here the first screen after i scroll down and back with scroll up 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 here the second screen if i scroll down again

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

Amin
  • 463
  • 2
  • 11
  • 29

0 Answers0