2017-07-24 4 views
-2

Dans mon application, je veux afficher les données récupérées du serveur.
Je veux filtrer les données sur vue recycleur basé sur Won attributComment traiter et filtrer les éléments de la liste avant de passer à recyclerView sur Android

Plus précisément, par défaut Afficher tous les articles correspondant à « won = false » à moins que « won = true » trouvé, si-moins un élément avec « won = true "trouvés, afficher uniquement" won = true "éléments.

Comment vérifier si la liste contient atleast une structure de données élément a une valeur vrai pour l'attribut gagné.

J'écris les codes ci-dessous pour montrer toutes les données.
Mes codes Adaptateur:

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

     } 
    } 
} 

Mon code d'activité:

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

classe Prix:

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

} 
+0

où vous gonflez toutes ces données sur la mise en page, puis vérifiez d'abord la condition. si Won est faux alors mettez leur visibilité GONE else Faites leur visibilité VISIBLE –

+0

@nihal_softy, pouvez-vous m'envoyer du code avec mes codes ci-dessus? S'il vous plaît – Jong

+0

Cela entraînerait une surcharge inutile sur la création de vue, puis de rendre invisible! – Mani

Répondre

0

Il n'y a rien de mal avec la logique RecyclerView plutôt tu sh ould filtrage du modèle response.body().getData().get(0).getAwards() pour avoir seulement "won": true

Remplacer ci-dessous le code avec onResponse() de Mon code d'activité:

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); 
} 
+0

J'utilise vos codes, mais ne me montre aucune donnée! – Jong

+0

Partagez-moi votre classe "Award" – Mani

+0

lorsque vous utilisez votre code, montrez simplement won == true items, si gagné == false ne pas afficher les éléments. Je veux quand gagné == faux. montrez cet articles – Jong

0

Vous pouvez utiliser l'interface Filterable:

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

intérieur adaptateur créer 2 listes de données, un original et un filtré:

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

Et créer la classe de filtre:

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

Et créer instace de filtre à l'intérieur adaptateur:

private ItemFilter mFilter = new ItemFilter(); 

Et remplacer la méthode getFilter:

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

Ensuite, vous pouvez utiliser le filtre comme celui-ci : awardModelAdapter.getFilter().filter(String.valueOf(true))