
我正在使用RealmRecyclerVIEwAdapter.我的问题是实现一个不起作用的Filterable.这是代码:
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在过滤并更新适配器后,如何保存结果?
谢谢
解决方法:
将过滤移至publishResults并使用UI线程Realm的查询来评估新结果.
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.bind(airportR); } 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.findAllAsync()); } 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); } public voID bind(AirportR airportR) { country.setText(airportR.getIsoCountry()); name.setText(airportR.getname()); } }} 总结 以上是内存溢出为你收集整理的android – 如何在RealmRecyclerViewAdapter中实现可过滤全部内容,希望文章能够帮你解决android – 如何在RealmRecyclerViewAdapter中实现可过滤所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)