Search code examples
javaandroidandroid-tablayouttabitem

One List of Users for 2 TabItem


I have a List of Users with 2 TabItem. The first TabItem is MyUsers and the second one is Favorites. I use a foreach loop to sort the Users. Now, that I want, is to display the Users List into MyUsers and after my loop display the sorted Users into Favorites.

UserFragment.java

public class UserFragment extends Fragment implements MyUserRecyclerViewAdapter.OnItemListener {

@BindView(R.id.tabs)
TabLayout mTabLayout;
@BindView(R.id.tabItem)
TabItem mTabItemMyUsers;
@BindView(R.id.tabItem2)
TabItem mTabItemFavorites;

private UserApiService mApiService;
private List<User> mUsers;
private List<User> mFavorites;
private RecyclerView mRecyclerView;

private int mPosition;

public static UserFragment newInstance(int position) {
    UserFragment userFragment = new UserFragment();

    Bundle args = new Bundle();
    args.putInt("position", position);
    userFragment.setArguments(args);

    return userFragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mApiService = DI.getUserApiService();

    mPosition = getArguments().getInt("position", 0);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_user_list, container, false);
    Context context = view.getContext();
    mRecyclerView = (RecyclerView) view;
    mRecyclerView.setLayoutManager(new LinearLayoutManager(context));
    mRecyclerView.addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL));

    initList();
    isUserFavorite();
    return view;
}


public void isUserFavorite() {
    mFavorites = new ArrayList<>();

    for (User user : mUsers) {
        if (user.isFavorite()) {
            mFavorites.add(user);
        }
    }
    mRecyclerView.setAdapter(new MyUserRecyclerViewAdapter(mFavorites, this));

}

private void initList() {
    mUser = mApiService.getUsers();
    mRecyclerView.setAdapter(new MyUserRecyclerViewAdapter(mUsers, this));

}

@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

@Override
public void onStop() {
    super.onStop();
    EventBus.getDefault().unregister(this);
}

Solution

  • If I understood your question right. You will be creating two lists, one unordered list of users as received and second with list of users marked as favorites. And then you want to switch which list to show in the single RecyclerView in your fragment's layout by clicking on one of the two tabs in your TabLayout in the same layout.

    You should simply populate the lists first instead of setting them both into RecyclerView at once, then manage tab selections on your mTabLayout using an addOnTabSelectedListener inside which you can choose the list to set into your recyclerview, since you have already defined a LayoutManager for your list, next finally use notifyDataSetChanged() on your adapter to to update the views.

    So keeping most of your logic the same your code would need to be refactored to something like this:

    ...
    @Override
    public View onCreateView(La...) {
    ...
        mRecyclerView.setLayoutManager(new LinearLayoutManager(context));
    ...
        initList();
        isUserFavorite();
        initSelection();
        return view;
    }
    
    public void isUserFavorite() {
        mFavorites = new ArrayList<>();
        for (User user : mUsers) {
            if (user.isFavorite()) {
                mFavorites.add(user);
            }
        }    
    }
    
    private void initList() {
        mUser = mApiService.getUsers();    
    }
    
    
    public void initSelection() {
      mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            // assuming users is at tab index 0 and favorites is at tab Index 1
            if(tab.getPosition() == 1) {
                selectFavorites();
            } else {
                selectUsers();
            }
        }
        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
        }
        @Override
        public void onTabReselected(TabLayout.Tab tab) {
        }
      });
      // if you wish to select the users tab at 0 by default
      Objects.requireNonNull(mTabLayout.getTabAt(0)).select();
    }
    
    private void selectFavorites() {
        // whichever adapter you were using to show favorites
        MyUserRecyclerViewAdapter mFavAdapter = new MyUserRecyclerViewAdapter(mFavorites, context);
        mRecyclerView.setAdapter(mFavAdapter);
        mFavAdapter.notifyDataSetChanged();
    }
    
    private void selectUsers() {
        // whichever adapter you were using to show all users
        MyNeighbourRecyclerViewAdapter mUsersAdapter = new MyNeighbourRecyclerViewAdapter(mUsers, context);
        mRecyclerView.setAdapter(mUsersAdapter);
        mFavAdapter.notifyDataSetChanged();
    }
    

    Hope this was what you were looking for.