Thursday, 2 May 2019

Nested Expandable RecyclerView lags on Expand and Collapse with too many number of child items freezes

I have created expandable recycle view in my app looks like below

It has parent Items Menu category and Category has child items as shown in image

enter image description here

Following is part of my parent adapter code.

 public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
    if (i > HEADER_COUNT - 1) {
        FoodMenuItem foodMenuItem = foodMenuItems.get(i - HEADER_COUNT);
        MenuViewHolder menuViewHolder = (MenuViewHolder) viewHolder;
        //menuViewHolder.rvMenu.setLayoutManager(new LinearLayoutManager(viewHolder.itemView.getContext(), LinearLayoutManager.VERTICAL, false));
        if (isVegOnly) {
            List<Item> items = new ArrayList<>();
            for (Item item : foodMenuItem.getItems()) {
                if (item.getType().equalsIgnoreCase(Item.FOOD_TYPE_VEG)) {
                    items.add(item);
                }
            }
            menuViewHolder.rvMenu.setAdapter(new FoodMenuChildRecycler(items, foodMenuParentListener, i, isAddAllowed));
            menuViewHolder.tvNumItems.setText("(" + items.size() + " items)");

        } else {
            menuViewHolder.rvMenu.setAdapter(new FoodMenuChildRecycler(foodMenuItem.getItems(), foodMenuParentListener, i, isAddAllowed));
            menuViewHolder.tvNumItems.setText("(" + foodMenuItem.getItems().size() + " items)");

        }
        menuViewHolder.ivArrow.setVisibility(menuViewHolder.rvMenu.getAdapter().getItemCount() > 0 ? View.VISIBLE : View.GONE);
        menuViewHolder.ivArrow.setImageResource(foodMenuItem.isExpanded() ? R.drawable.chev_up : R.drawable.chev_down);
        menuViewHolder.tvTitle.setText(foodMenuItem.getCategoryName());
        menuViewHolder.rvMenu.setNestedScrollingEnabled(false);
        if (foodMenuItem.isExpanded()) {
            menuViewHolder.rvMenu.setVisibility(View.VISIBLE);
        } else {
            menuViewHolder.rvMenu.setVisibility(View.GONE);
        }
    }

}

Following is code for child adapter onBindViewHolder

  public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
    ChildMenuHolder childMenuHolder = (ChildMenuHolder) viewHolder;
    Context context = viewHolder.itemView.getContext();
    Item item = itemList.get(i);
    childMenuHolder.tvTitle.setText(item.getTitle());
    childMenuHolder.txtQty.setText(String.valueOf(item.getQuatity()));
    childMenuHolder.txtCartInc.setVisibility(item.isAddedToCart() ? View.VISIBLE : View.GONE);
    childMenuHolder.txtQty.setVisibility(item.isAddedToCart() ? View.VISIBLE : View.GONE);
    childMenuHolder.txtCartDec.setVisibility(item.isAddedToCart() ? View.VISIBLE : View.GONE);
    childMenuHolder.btnAdd.setVisibility(!item.isAddedToCart() ? View.VISIBLE : View.GONE);
    childMenuHolder.btnAdd.setBackgroundResource(isAddAllowed ? R.drawable.rounded_bottom_edge_shape_food : R.drawable.rounded_bottom_edge_shape_disable);
    childMenuHolder.btnAdd.setTextColor(isAddAllowed ? ContextCompat.getColor(context, R.color.button_green) : ContextCompat.getColor(context, R.color.gray_a1));
    childMenuHolder.ivType.setColorFilter(item.getType().equalsIgnoreCase(Item.FOOD_TYPE_VEG) ? ContextCompat.getColor(context, R.color.selected_green) : ContextCompat.getColor(context, R.color.app_red));
}

Following code inside Parent adapter to expand & collapse

  public MenuViewHolder(@NonNull View itemView) {
        super(itemView);
        tvTitle = (TextView) itemView.findViewById(R.id.tvTitle);
        tvNumItems = (TextView) itemView.findViewById(R.id.tvNumItems);
        ivArrow = (ImageView) itemView.findViewById(R.id.ivArrow);
        rvMenu = (RecyclerView) itemView.findViewById(R.id.rvMenu);
        rvMenu.setLayoutManager(new LinearLayoutManager(itemView.getContext()));
       // rvMenu.setNestedScrollingEnabled(false);
        rlArrow = itemView.findViewById(R.id.rlArrow);
        rlArrow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (foodMenuParentListener != null) {
                    foodMenuParentListener.OnExpandClick(getAdapterPosition());
                }
            }
        });
        tvTitle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (foodMenuParentListener != null) {
                    foodMenuParentListener.OnExpandClick(getAdapterPosition());
                }
            }
        });
    }

No Since there are too many items in ChildRecycler adapter I facing a big lag issue when there are too many child items. It works properly when number of child items is less

How to fix this?



from Nested Expandable RecyclerView lags on Expand and Collapse with too many number of child items freezes

No comments:

Post a Comment