2

I have a nested recycler view. One of the items of parent recycler view is a horizontal recycler view and another item is a vertical recycler view.

The onBindViewHolder of child recycler view is called for all items even for those not visible currently.

But it works fine for child horizontal recycler view.

Even this post wasn't helpful for the same: Recyclerview onBindViewHolder called for all items when inside LinearLayout with weights

Here is the code for same: Parent recyclerview xml:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:bind="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools">

    <data>

        <import type="android.view.View"/>



        <variable
            name="viewModel"
            type="com.activities.ui.srp.SRPActivityVM"/>

    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:animateLayoutChanges="true"
            android:background="@color/blue"
            android:minHeight="?android:attr/actionBarSize"
            android:theme="@style/Theme.Toolbar"
            bind:layout_scrollFlags="scroll|enterAlways"
            bind:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/screen_bg">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/activity_srp_main_recyclerVw"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:clipToPadding="false"
                android:paddingTop="@{viewModel.quickFilters.size>0?@dimen/_100sdp : @dimen/_65sdp}"
                bind:populateItems="@{viewModel.srpData}"
                tools:listitem="@layout/item_srp_lyt"
                >

            </android.support.v7.widget.RecyclerView>

        </FrameLayout>
    </LinearLayout>


</layout>

Child RecyclerView XML, same layout has been used for both horizontal and vertical child recyclerview :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:orientation="vertical"
              xmlns:tools="http://schemas.android.com/tools">

    <TextView
        android:id="@+id/item_srp_recyclervw_header"
        android:text="Recommended for you"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:fontFamily="@font/quicksand_bold"
        android:letterSpacing="-0.03"
        android:textColor="#333333"
        android:visibility="gone"
        android:layout_marginStart="@dimen/_16sdp"
        android:layout_marginEnd="@dimen/_16sdp"
        android:layout_marginTop="@dimen/_16sdp"
        android:layout_marginBottom="@dimen/_8sdp"
        android:textSize="18sp"
        />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/item_srp_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    </android.support.v7.widget.RecyclerView>
</LinearLayout>

Parent RecyclerView Adapter:

public class SRPBaseAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

  private final SRPActivity baseActivity;
  private SRPModel.Data srpData;
  private int LIST_ITEM_COUNT = 2;

  private TagsAdapter tagsAdapter;
  private SRPListAdapter srpListAdapter;


  public SRPBaseAdapter(SRPActivity baseActivity, SRPModel.Data srpData) {
    this.baseActivity = baseActivity;
    this.srpData = srpData;
  }

  public void injectAdapter(TagsAdapter tagsAdapter, SRPListAdapter srpListAdapter) {
    this.tagsAdapter = tagsAdapter;
    this.srpListAdapter = srpListAdapter;
  }

  @IntDef({ViewType.TAG, ViewType.ITEM_LIST, ViewType.DEFAULT})
  @Retention(RetentionPolicy.SOURCE)
  public @interface ViewType {
    int TAG = 0;
    int ITEM_LIST = 1;
    int DEFAULT = 2;
  }

  @NonNull
  @Override
  public RecyclerView.ViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, final int viewType) {
    LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
    switch (viewType) {
      case ViewType.TAG:
        View itemLayoutView = layoutInflater.inflate(R.layout.item_srp_recyclevw, parent, false);
        return new TagsViewHolder(itemLayoutView);
      case ViewType.ITEM_LIST:
        itemLayoutView = layoutInflater.inflate(R.layout.item_srp_recyclevw, parent, false);
        return new ItemsViewHolder(itemLayoutView);
      default:
        itemLayoutView = layoutInflater.inflate(R.layout.item_default_lyt, parent, false);
        return new DefaultHolder(itemLayoutView);
    }
  }

  public void addItems(SRPModel.Data srpData) {
    if (srpData != null) {
      this.srpData.getActivityItems().addAll(srpData.getActivityItems());
      this.srpData.getTags().addAll(srpData.getTags());
      notifyDataSetChanged();
    }
  }

  public void clearItems() {
    if (srpData.getActivityItems() != null)
      srpData.getActivityItems().clear();
    if (srpData.getTags() != null)
      srpData.getTags().clear();
  }


  @Override
  public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, final int position) {
    switch (getItemViewType(position)) {
      case ViewType.TAG:
        ((TagsViewHolder) holder).populateItems(srpData.getTags());
        break;
      case ViewType.ITEM_LIST:
        ((ItemsViewHolder) holder).populateItems(srpData.getActivityItems());
        break;
    }
  }

  @Override
  public int getItemCount() {
    return LIST_ITEM_COUNT;
  }

  @Override
  public int getItemViewType(int position) {
    if (srpData != null) {
      switch (position) {
        case 0:
          if (srpData.getTags() != null && srpData.getTags().size() > 0)
            return ViewType.TAG;
        case 1:
          if (srpData.getActivityItems() != null && srpData.getActivityItems().size() > 0)
            return ViewType.ITEM_LIST;
      }
    }
    return ViewType.DEFAULT;
  }

  public class ItemsViewHolder extends RecyclerView.ViewHolder {

    private RecyclerView recyclerVw;

    public ItemsViewHolder(final View itemView) {
      super(itemView);
      itemView.findViewById(R.id.item_srp_recyclervw_header).setVisibility(View.VISIBLE);
      recyclerVw = itemView.findViewById(R.id.item_srp_recycler_view);
    }

    public void populateItems(List<SRPModel.ActivityItem> itemList) {
      LinearLayoutManager mLyoutManager = new LinearLayoutManager(baseActivity);
      mLyoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
      recyclerVw.setLayoutManager(mLyoutManager);
      recyclerVw.setItemAnimator(new DefaultItemAnimator());
      recyclerVw.setAdapter(srpListAdapter);
      srpListAdapter.clearItems();
      srpListAdapter.addItems(srpData.getActivityItems());
      srpListAdapter.setListener(baseActivity);
    }
  }

  public class TagsViewHolder extends RecyclerView.ViewHolder {
    private RecyclerView recyclerVw;

    public TagsViewHolder(final View itemView) {
      super(itemView);
      recyclerVw = itemView.findViewById(R.id.item_srp_recycler_view);
    }

    public void populateItems(List<SRPModel.Tag> tagList) {
      LinearLayoutManager mLyoutManager = new LinearLayoutManager(baseActivity);
      mLyoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
      recyclerVw.setLayoutManager(mLyoutManager);
      recyclerVw.setItemAnimator(new DefaultItemAnimator());
      recyclerVw.setAdapter(tagsAdapter);
      tagsAdapter.clearItems();
      tagsAdapter.addItems(srpData.getTags());
      tagsAdapter.setListener(baseActivity);
    }
  }


  private class DefaultHolder extends RecyclerView.ViewHolder {
    public DefaultHolder(View inflate) {
      super(inflate);
    }
  }

}
Ashok Singhal
  • 520
  • 1
  • 5
  • 10

0 Answers0