5

में फ़िल्टर करने योग्य को कार्यान्वित करने के लिए मैं अच्छी तरह से RealmRecyclerViewAdapter का उपयोग कर रहा हूं। मेरी समस्या Filterable को कार्यान्वित करना है जो काम नहीं करती है। इस कोड है: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); 

     } 
    } 
} 

और मैं त्रुटि वापस दे:

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 

मैं परिणाम के बाद मैं इसे फिल्टर करने और अनुकूलक अद्यतन कैसे बचा सकता है?

धन्यवाद

उत्तर

6

publishResults को छानने ले जाएँ और नए परिणामों का मूल्यांकन करने के लिए यूआई धागा क्षेत्र के प्रश्नों का उपयोग करें।

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

यह बहुत अच्छा काम करता है! आपकी बहुमूल्य मदद के लिए धन्यवाद! – ste9206

+0

सुनकर खुशी हुई कि मैं कैसे सरलता का उपयोग कर सकता हूं: पी – EpicPandaForce

+0

@EpicPandaForce - क्या आप मुझे अपडेटडेटा (सूचीआर्ट्स) दिखा सकते हैं; मैं फ़िल्टर के बाद और पहले सूचीदृश्य आइटम कैसे अपडेट कर सकता हूं? – user2269164