如何在 Android 上传递给 recyclerView 之前处理和过滤列表项

How to process and filter List items before passing to recyclerView on Android

在我的应用程序中,我想显示从服务器检索的数据。
我想根据 Won 属性

在回收站视图上过滤数据

具体来说,默认情况下显示所有匹配 "won=false" 的项目,除非找到 "won=true",如果至少找到一个 "won=true" 的项目,则仅显示 "won=true"项。

如何检查列表数据结构是否包含至少一项具有属性 won 的值 true

我写下面的代码来显示所有数据。
我的适配器代码:

public class AwardModelAdater extends RecyclerView.Adapter<AwardModelAdater.ViewHolder> {

    private Context context;
    private List<Award> model;
    private int modelImage;

    public AwardModelAdater(Context context, List<Award> model) {
        this.context = context;
        this.model = model;
    }

    @Override
    public AwardModelAdater.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_award, parent, false);

        return new AwardModelAdater.ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final AwardModelAdater.ViewHolder holder, final int position) {

        if (model.get(position).getWon()) {
            modelImage = R.drawable.golden_globe_gold;
        } else {
            modelImage = R.drawable.golden_globe_silver;
        }

        if (model.get(position).getWon()) {
            Glide.with(context)
                    .load(modelImage)
                    .placeholder(R.drawable.default_image)
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .into(holder.row_awardImg);
        } else {
            Glide.with(context)
                    .load(modelImage)
                    .placeholder(R.drawable.default_image)
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .into(holder.row_awardImg);
        }

    }

    @Override
    public int getItemCount() {
        return model.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        private ImageView row_awardImg;

        public ViewHolder(View itemView) {
            super(itemView);

            row_awardImg = (ImageView) itemView.findViewById(R.id.row_awardImg);

        }
    }
}

我的activity代码:

SendData = new SerialDetailSendData();
SendData.setSeriesID(serialID);

InterfaceApi api = ApiClient.getClient().create(InterfaceApi.class);
Call<SeriesAwardResponse> call = api.getSeriesAward(SendData);

call.enqueue(new Callback<SeriesAwardResponse>() {
    @Override
    public void onResponse(Call<SeriesAwardResponse> call, Response<SeriesAwardResponse> response) {
        if (response.body().getData() != null) {
            awardModel.clear();
            awardModel.addAll(response.body().getData().get(0).getAwards());
            awardModelAdapter = new AwardModelAdater(context, awardModel);
            //dialogList_loadingProgress.hide();
            infoSerialFrag_AwardAcademyRecyclerView.setHasFixedSize(true);
            infoSerialFrag_AwardAcademyRecyclerView.setAdapter(awardModelAdapter);
        }
    }

    @Override
    public void onFailure(Call<SeriesAwardResponse> call, Throwable t) {
        //dialogList_loadingProgress.hide();
    }
});

奖励class:

public class Award {

    @SerializedName("description")
    @Expose
    private String description;
    @SerializedName("year")
    @Expose
    private Integer year;
    @SerializedName("celebrity")
    @Expose
    private Celebrity celebrity;
    @SerializedName("won")
    @Expose
    private Boolean won;

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Integer getYear() {
        return year;
    }

    public void setYear(Integer year) {
        this.year = year;
    }

    public Celebrity getCelebrity() {
        return celebrity;
    }

    public void setCelebrity(Celebrity celebrity) {
        this.celebrity = celebrity;
    }

    public Boolean getWon() {
        return won;
    }

    public void setWon(Boolean won) {
        this.won = won;
    }

}

RecyclerView 逻辑没有任何问题,您应该将 response.body().getData().get(0).getAwards() 模型过滤为只有 "won": true

将下面的代码替换为我的activity代码的onResponse()

if (response.body().getData() != null) {
    awardModel.clear();
    private List<Award> won = new ArrayList<>();
    private List<Award> lost = new ArrayList<>();
    for(Award award: response.body().getData().get(0).getAwards()){
        if(!award.won){
            lost.add(award);
        }else {
            won.add(award);
        }
    }
    if(won.size()>0)
    {
        awardModel.addAll(won);
    } else{
        awardModel.addAll(lost);
    }
    awardModelAdapter = new AwardModelAdater(context, awardModel);
    //dialogList_loadingProgress.hide();
    infoSerialFrag_AwardAcademyRecyclerView.setHasFixedSize(true);
    infoSerialFrag_AwardAcademyRecyclerView.setAdapter(awardModelAdapter);
}

可以使用Filterable接口:

public class AwardModelAdater extends RecyclerView.Adapter<AwardModelAdater.ViewHolder> implements Filterable {...}

内部适配器创建 2 个数据列表,一个原始的和一个过滤的:

private List<Award> model;
private List<Award> original;

并创建过滤器 class:

private class ItemFilter extends Filter {
    @Override
    protected FilterResults performFiltering(CharSequence charSequence) {
        String filterString = charSequence.toString().toLowerCase();
        FilterResults results = new FilterResults();
        final List<Award> list = original;
        int count = list.size();
        final List<Award> newList = new ArrayList<>(count);
        String filterableWon;
        for (int i = 0; i < count; i++) {
            Award a = list.get(i);
            filterableWon = String.valueOf(a.getWon());
            if (filterableWon.equals(filterString)) {
                newList.add(a);
            }
        }

        results.values = newList;
        results.count = newList.size();

        return results;
    }

    @Override
    protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
        model = (List<Award>) filterResults.values;
        notifyDataSetChanged();
    }
}

并在适配器内部创建过滤器实例:

private ItemFilter mFilter = new ItemFilter();

并覆盖 getFilter 方法:

@Override
public Filter getFilter() {
    return mFilter;
}

然后你可以像这样使用过滤器: awardModelAdapter.getFilter().filter(String.valueOf(true))