如何在单个 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
回调。
我正在显示数据列表。默认情况下,我使用 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
回调。