5

filterbar implementieren Ich bin mit gut RealmRecyclerViewAdapter. Mein Problem ist ein Filterable, dass nicht funktioniert zu implementieren. Dies ist der Code:wie in RealmRecyclerViewAdapter

private class AirportAdapter extends RealmRecyclerViewAdapter<AirportR,RecyclerView.ViewHolder> implements Filterable 
{ 
    Context context; 
    OrderedRealmCollection<AirportR>listAirports; 

    public AirportAdapter(Context activity, OrderedRealmCollection<AirportR>airports) 
    { 
     super(activity,airports, true); 
     this.context = activity; 
     this.listAirports = airports; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
    { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.airport_show, parent,false); 
     AirportClass holder = new AirportClass(view); 
     return holder; 

    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) 
    { 
     AirportR airportR = listAirports.get(position); 

     AirportClass mHolder = (AirportClass)holder; 

     mHolder.country.setText(airportR.getIsoCountry()); 
     mHolder.name.setText(airportR.getName()); 
    } 

    public Filter getFilter() 
    { 
     AirportFilter filter = new AirportFilter(this, listAirports); 
     return filter; 
    } 


    private class AirportFilter extends Filter 
    { 
     private final AirportAdapter adapter; 

     OrderedRealmCollection<AirportR>originalList; 
     OrderedRealmCollection<AirportR>filteredList; 


     private AirportFilter(AirportAdapter adapter, OrderedRealmCollection<AirportR> originalList) 
     { 
      super(); 
      this.adapter = adapter; 
      this.originalList = originalList; 

     } 


     @Override 
     protected FilterResults performFiltering(CharSequence constraint) 
     { 
      filteredList.clear(); 
      final FilterResults results = new FilterResults(); 

      if (constraint.length() == 0) 
      { 
       filteredList.addAll(originalList); 
      } 
      else 
      { 
       final String filterPattern = constraint.toString().toLowerCase().trim(); 

       for (final AirportR airportR : originalList) 
       { 
        if (airportR.getName().toLowerCase().contains(filterPattern)) 
        { 
         filteredList.add(airportR); 
        } 
       } 
      } 
      results.values = filteredList; 
      results.count = filteredList.size(); 
      return results; 
     } 

     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) 
     { 
      adapter.listAirports.addAll((OrderedRealmCollection<AirportR>) results.values); 
      adapter.notifyDataSetChanged(); 
     } 
    } 



    private class AirportClass extends RecyclerView.ViewHolder 
    { 
     TextView name, country; 
     ImageView image; 

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

      name = (TextView)itemView.findViewById(R.id.name); 
      country = (TextView)itemView.findViewById(R.id.country); 
      image = (ImageView)itemView.findViewById(R.id.imageView); 

     } 
    } 
} 

und ich gebe den Fehler zurück:

java.lang.UnsupportedOperationException: This method is not supported by RealmResults. 
        at io.realm.RealmResults.addAll(RealmResults.java:710) 
        at com.example.matteo.downloadairports.fragment.ListAirportFragment$AirportAdapter$AirportFilter.publishResults 

wie konnte ich das Ergebnis speichern, nachdem ich es filtern und den Adapter aktualisieren?

Dank

Antwort

6

die Filterung zu publishResults bewegen und den UI-Thread Realm-Abfragen verwenden die neuen Ergebnisse zu bewerten.

private class AirportAdapter 
     extends RealmRecyclerViewAdapter<AirportR, RecyclerView.ViewHolder> 
     implements Filterable { 
    Realm realm; 

    public AirportAdapter(Context context, Realm realm, OrderedRealmCollection<AirportR> airports) { 
     super(context, airports, true); 
     this.realm = realm; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.airport_show, parent, false); 
     AirportClass holder = new AirportClass(view); 
     return holder; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     AirportR airportR = getData().get(position); 

     AirportClass mHolder = (AirportClass) holder; 

     mHolder.country.setText(airportR.getIsoCountry()); 
     mHolder.name.setText(airportR.getName()); 
    } 

    public void filterResults(String text) { 
     text = text == null ? null : text.toLowerCase().trim(); 
     RealmQuery<AirportR> query = realm.where(AirportR.class); 
     if(!(text == null || "".equals(text))) { 
      query.contains("fieldToQueryBy", text, Case.INSENSITIVE) // TODO: change field 
     } 
     updateData(query.findAll()); 
    } 

    public Filter getFilter() { 
     AirportFilter filter = new AirportFilter(this); 
     return filter; 
    } 

    private class AirportFilter 
      extends Filter { 
     private final AirportAdapter adapter; 

     private AirportFilter(AirportAdapter adapter) { 
      super(); 
      this.adapter = adapter; 
     } 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      return new FilterResults(); 
     } 

     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      adapter.filterResults(constraint.toString()); 
     } 
    } 

    private class AirportClass 
      extends RecyclerView.ViewHolder { 
     TextView name, country; 
     ImageView image; 

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

      name = (TextView) itemView.findViewById(R.id.name); 
      country = (TextView) itemView.findViewById(R.id.country); 
      image = (ImageView) itemView.findViewById(R.id.imageView); 
     } 
    } 
} 
+1

es funktioniert super! Danke für deine wertvolle Hilfe! – ste9206

+0

Froh, dass ich konnte zu hören, wie Sie vereinfachen Realm verwenden: p – EpicPandaForce

+0

@EpicPandaForce - Könnten Sie mir zeigen, die update (listAirports); Wie kann ich die Listenansicht nach und vor dem Filter aktualisieren? – user2269164

Verwandte Themen