【问题标题】:How to set two different adapter in a single recyclerView?如何在单个 recyclerView 中设置两个不同的适配器?
【发布时间】:2019-11-30 02:25:08
【问题描述】:

我正在显示数据列表。默认情况下,我使用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);
    }

【问题讨论】:

    标签: android firebase-realtime-database android-recyclerview firebaseui


    【解决方案1】:

    使用swapAdapter

    recyclerView.swapAdapter(yourAdapter, false)
    

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

    【讨论】:

    • 谢谢。对于默认情况,我使用recyclerView.setAdapter()recyclerView.swapAdapter() 进行搜索。但仍然没有得到任何结果。
    【解决方案2】:
    recyclerView.setAdapter(adapter)
    

    它会做所有的魔法

    【讨论】:

    • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
    • 它确实提供了答案,它可以用于交换适配器。
    【解决方案3】:

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

    来自文档:

    void swapAdapter (Adapter adapter, boolean removeAndRecycleExistingViews)
    

    用提供的适配器交换当前适配器。与 setAdapter(Adapter) 类似,但假设现有适配器和新适配器使用相同的 RecyclerView.ViewHolder,并且不清除 RecycledViewPool。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-02
      • 2018-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      • 2022-01-05
      相关资源
      最近更新 更多