【问题标题】:How to process and filter List items before passing to recyclerView on Android如何在传递给 Android 上的 recyclerView 之前处理和过滤列表项
【发布时间】:2017-07-24 07:27:40
【问题描述】:

在我的应用程序中,我想显示从服务器检索到的数据。
我想根据 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);

        }
    }
}

我的活动代码:

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

奖项类别:

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;
    }

}

【问题讨论】:

  • 您在 Layout 上夸大所有这些数据的位置,然后首先检查条件。如果 Won 为假,则将其可见性消失,否则使它们可见性可见
  • @nihal_softy,你能把我上面的代码发给我吗?请
  • 这会导致视图创建不必要的开销,然后使其变为不可见!
  • @Mani 是的,你有点对,但问题是假设 use 想要在 won 为 false 时添加不同的逻辑。所以我必须在模型类中添加所有数据。
  • @nihal_softy:为此,我将提供另一种方法,该方法具有另一种 EMPTY_VIEW_TYPE 以用于满足条件标志的空视图类型会被夸大的情况

标签: android loops arraylist logic equals


【解决方案1】:

你可以使用Filterable接口:

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

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

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

并创建过滤器类:

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))

【讨论】:

  • 这很好用。谢谢你。当 recyclerView 加载时,我会在搜索视图显示之前快速闪烁整个 recyclerView。无论如何要消除它?
【解决方案2】:

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

我的活动代码的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);
}

【讨论】:

  • 分享你的“奖”课
  • 使用您的代码时,只显示 won == true 项目,如果 won == false 不显示项目。我想要什么时候赢==假。显示此项目
  • 我想当 won== false 时,显示 won==false 项目。如果 won == true,则显示 won==true 项目。请帮帮我我的朋友
  • 答案已更新!我强烈建议你理解代码库而不是盲目地复制粘贴答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-09
  • 2017-05-28
  • 2020-07-01
  • 2018-09-06
  • 1970-01-01
相关资源
最近更新 更多