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