android– 如何在RealmRecyclerViewAdapter中实现可过滤

android– 如何在RealmRecyclerViewAdapter中实现可过滤,第1张

概述我正在使用RealmRecyclerViewAdapter.我的问题是实现一个不起作用的Filterable.这是代码:privateclassAirportAdapterextendsRealmRecyclerViewAdapter<AirportR,RecyclerView.ViewHolder>implementsFilterable{Contextcontext;OrderedRealmCollection<Airport

我正在使用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中实现可过滤所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1104043.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存