如何在单个 recyclerView 中设置两个不同的适配器?

How to set two different adapter in a single recyclerView?

我正在显示数据列表。默认情况下,我使用 FirebaseRecyclerPagingAdapter 显示数据,因为我的数据列表很大。我也有搜索选项,当用户提交任何查询时,我在我的 firebase realtime-database 中搜索结果,在这种情况下,我使用 FirebaseRecyclerAdapter 来显示我的结果。默认情况下,我得到了预期的结果,但是当搜索任何内容时,我没有得到任何输出。是否可以将不同的适配器设置为单个回收器视图?这是我的代码

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);
    }

使用swapAdapter

recyclerView.swapAdapter(yourAdapter, false)

有关 swapAdapter 的更多信息,请参阅此处 swapAdapter

recyclerView.setAdapter(adapter)

它无所不能

您可以使用 swapAdapter,因为您对两个适配器使用相同的ViewHolder

来自文档:

void swapAdapter (Adapter adapter, boolean removeAndRecycleExistingViews)

Swaps the current adapter with the provided one. It is similar to setAdapter(Adapter) but assumes existing adapter and the new adapter uses the same RecyclerView.ViewHolder and does not clear the RecycledViewPool.

请注意,它仍会调用 onAdapterChanged 回调。