我有一个类型为[a,b,c,d]的项目列表,指示项目的状态。当我单击ButtonA时,我想在recyclerview中显示类型为[a,b]的项目,然后单击ButtonB上显示类型为[c,d]的项目。我当前的解决方案是使用两个列表和两个适配器,我想知道是否有更好的方法,谢谢。
答案 0 :(得分:1)
RecyclerAdapter的工作是显示传递给它的数据。 不幸的是,您没有提供任何代码,因此我假设按钮在RecyclerView之外。
在RecyclerAdapater内放置一个方法,您可以从外部调用该方法。 notifyDataSetChanged()
使用您提供的新数据重新运行onBindViewHolder()
。
public void updateList(List<YourObjectType> yourObjects) {
this.yourObjects = yourObjects;
notifyDataSetChanged();
}
答案 1 :(得分:1)
这真的很容易!我想在您的对象模型中您有Boolean字段。您可以使用Filterable接口。 只需在activity / fragment或viewModel中实现它,即可根据布尔值或ur按钮各自的clicklistener中的任何其他条件过滤传递给适配器的列表。它非常简单直观。
或者只是分享您的代码,我可以为您做。我真的很想要积分))
答案 2 :(得分:0)
我通过在适配器中实现Filterable接口来解决我的问题。在活动中的onCreate中,在将初始适配器添加到recyclerview之后,我添加了以下内容:
adapter.getFilter().filter("u");
这是我的适配器代码:
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
if (charSequence.equals("u")) {
List<Transaction> filteredList = new ArrayList<>();
for (Transaction trans : allTrans) {
if (trans.getTr_stt().equalsIgnoreCase("0") ||
trans.getTr_stt().equalsIgnoreCase("2") ||
trans.getTr_stt().equalsIgnoreCase("5")) {
filteredList.add(trans);
}
}
filteredTrans = filteredList;
} else {
List<Transaction> filteredList = new ArrayList<>();
for (Transaction trans : allTrans) {
if (trans.getTr_stt().equalsIgnoreCase("1") ||
trans.getTr_stt().equalsIgnoreCase("3") ||
trans.getTr_stt().equalsIgnoreCase("4")) {
filteredList.add(trans);
}
}
filteredTrans = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = filteredTrans;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
filteredTrans = (ArrayList<Transaction>) filterResults.values;
notifyDataSetChanged();
}
};
}