如何在RecyclerAdapter中按对象类型显示数据?

时间:2019-01-28 09:42:07

标签: android recycler-adapter

我有一个类型为[a,b,c,d]的项目列表,指示项目的状态。当我单击ButtonA时,我想在recyclerview中显示类型为[a,b]的项目,然后单击ButtonB上显示类型为[c,d]的项目。我当前的解决方案是使用两个列表和两个适配器,我想知道是否有更好的方法,谢谢。

enter image description here

3 个答案:

答案 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();
        }
    };
}