如何在 RealmRecyclerViewAdapter 中实现可过滤 [英] how to implement filterable in RealmRecyclerViewAdapter

查看:32
本文介绍了如何在 RealmRecyclerViewAdapter 中实现可过滤的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我很好地使用了 RealmRecyclerViewAdapter.我的问题是实现一个不起作用的 Filterable.这是代码:

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

 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

在过滤结果并更新适配器后如何保存结果?

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

谢谢

推荐答案

将过滤移至 publishResults 并使用 UI 线程 Realm 的查询来评估新结果.

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

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());
        }
    }
}

这篇关于如何在 RealmRecyclerViewAdapter 中实现可过滤的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆