Search code examples
androidfirebase-realtime-databaseandroid-recyclerviewfirebaseui

How to set two different adapter in a single recyclerView?


I'm showing a list of data. By default, I show data using FirebaseRecyclerPagingAdapter as my list of data is large. I also have search options, when a user submits any query I searched the result in my firebase realtime-database in this case I used FirebaseRecyclerAdapter for showing my result. By default, I'm getting expected result but when anything is searched I'm not getting any output. Is it possible to set a different adapter to a single recycler view? Here is my code

private FirebaseRecyclerPagingAdapter<BookLight, BookViewHolder> mAdapter;
private FirebaseRecyclerAdapter<BookLight,BookViewHolder> mAdapterNopage;
private static final String ALL_TYPE="all";


@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
recyclerView = view.findViewById(R.id.recyclerviewid_grp);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this.getActivity()));

        loadData(ALL_TYPE);

        return view;
    }

private void loadData(String queryBook){

        Query query;
        if(queryBook.equals(ALL_TYPE)){
          query=FirebaseDatabase.getInstance().getReference()
                    .child("GroupMembersBooks")
                    .child(groupDetails.getGroupID())
                    .child("books");
        mAdapter = new FirebaseRecyclerPagingAdapter<BookLight, BookViewHolder>(options) {
      //other stuffs 
      recyclerView.setAdapter(mAdapter);
      };
   }
    else{
            Log.e(TAG, "loadData: "+queryBook);
            query=FirebaseDatabase.getInstance().getReference()
                    .child("GroupMembersBooks")
                    .child(groupDetails.getGroupID())
                    .child("books")
                    .orderByChild("bookName")
                    .startAt(queryBook);
         mAdapterNopage = new FirebaseRecyclerAdapter<BookLight, BookViewHolder>(options) {
     //other stuffs
     };
    recyclerView.setAdapter(mAdapterNopage)
   }
 }

    @Override
    public void onCreateOptionsMenu(Menu menu,MenuInflater menuInflater) {
        menuInflater.inflate(R.menu.group_timeline_menu,menu);
        SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
        searchView = (SearchView) menu.findItem(R.id.action_book_search).getActionView();
        searchView.setSearchableInfo(searchManager
                .getSearchableInfo(getActivity().getComponentName()));
        searchView.setMaxWidth(Integer.MAX_VALUE);

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                loadData(query);
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                return false;
            }
        });

        super.onCreateOptionsMenu(menu,menuInflater);
    }

Solution

  • Use swapAdapter

    recyclerView.swapAdapter(yourAdapter, false)
    

    For more information about swapAdapter refer here swapAdapter