how to implement filterable in RealmRecyclerViewAdapter

匿名 (未验证) 提交于 2019-12-03 01:49:02

问题:

I'm using well RealmRecyclerViewAdapter. My problem is to implement a Filterable that not works. This is the code:

 private class AirportAdapter extends RealmRecyclerViewAdapter implements Filterable {     Context context;     OrderedRealmCollectionlistAirports;      public AirportAdapter(Context activity, OrderedRealmCollectionairports)     {         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;          OrderedRealmCollectionoriginalList;         OrderedRealmCollectionfilteredList;           private AirportFilter(AirportAdapter adapter, OrderedRealmCollection 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) 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);          }     } } 

and I give back the error:

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 

how could I save the result after I filter it and update the adapter?

Thanks

回答1:

Move the filtering to publishResults and use the UI thread Realm's queries to evaluate the new results.

private class AirportAdapter         extends RealmRecyclerViewAdapter         implements Filterable {     Realm realm;      public AirportAdapter(Context context, Realm realm, OrderedRealmCollection 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 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);         }     } } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!