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

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

问题描述

我正在使用RealmRecyclerViewAdapter。我的问题是实现一个可过滤不起作用。这是代码:

 私人类AirportAdapter扩展RealmRecyclerViewAdapter< AirportR,RecyclerView.ViewHolder>实现可过滤
{
上下文上下文;
OrderedRealmCollection< AirportR> listAirports;

公共AirportAdapter(上下文活动,OrderedRealmCollection< AirportR>机场)
{
super(activity,airports,true);
this.context = activity;
this.listAirports = airports;

$ b @Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType)
{
View view = LayoutInflater.from(parent.getContext ())。inflate(R.layout.airport_show,parent,false);
AirportClass持有人=新AirportClass(查看);
回报持有人;


$ b @Override
public void onBindViewHolder(RecyclerView.ViewHolder持有者,int位置)
{
AirportR airportR = listAirports.get (位置);

AirportClass mHolder =(AirportClass)持有者;

mHolder.country.setText(airportR.getIsoCountry());
mHolder.name.setText(airportR.getName());
}

public Filter getFilter()
{
AirportFilter filter = new AirportFilter(this,listAirports);
返回过滤器;
}


私人课程AirportFilter延伸过滤器
{
私人最终AirportAdapter适配器;

OrderedRealmCollection< AirportR> originalList;
OrderedRealmCollection< AirportR> filteredList; (AirportAdapter adapter,OrderedRealmCollection< AirportR> originalList)
{
super();


private AirportFilter
this.adapter = adapter;
this.originalList = originalList;



@Override
保护FilterResults performFiltering(CharSequence约束)
{
filteredList.clear();
final FilterResults results = new FilterResults();

if(constraint.length()== 0)
{
filteredList.addAll(originalList);
}
else
{
final String filterPattern = constraint.toString()。toLowerCase()。trim(); (最终AirportR机场R:原始列表)

如果(airportR.getName()。toLowerCase()。contains(filterPattern))
{
filteredList.add(airportR);
}
}
}
results.values = filteredList;
results.count = filteredList.size();
返回结果;

$ b @Override
protected void publishResults(CharSequence constraint,FilterResults results)
{
adapter.listAirports.addAll((OrderedRealmCollection< AirportR>) results.values);
adapter.notifyDataSetChanged();




$ b private class AirportClass extends RecyclerView.ViewHolder
{
TextView name,country;
ImageView图像;

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





$ b

和I返回错误:

  java.lang.UnsupportedOperationException:此方法不受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 
扩展RealmRecyclerViewAdapter< AirportR,RecyclerView.ViewHolder>
实现可过滤{
领域;

public AirportAdapter(Context context,Realm realm,OrderedRealmCollection< AirportR> airports){
super(context,airports,true);
this.realm = realm;

$ b @Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType){
View view = LayoutInflater.from(parent.getContext())。 inflate(R.layout.airport_show,parent,false);
AirportClass持有人=新AirportClass(查看);
回报持有人;

$ b @Override
public void onBindViewHolder(RecyclerView.ViewHolder holder,int position){
AirportR airportR = getData()。get(position);

AirportClass mHolder =(AirportClass)持有者;

mHolder.country.setText(airportR.getIsoCountry());
mHolder.name.setText(airportR.getName());
}

public void filterResults(String text){
text = text == null? null:text.toLowerCase()。trim();
if(text == null ||.equals(text)){
updateData(realm.where(AirportR.class).findAll());
} else {
updateData(realm.where(AirportR.class)
.contains(fieldToQueryBy,text,Case.INSENSITIVE)// TODO:change field
.findAll ());


$ b $ public FilterFilter(){
AirportFilter filter = new AirportFilter(this);
返回过滤器;
}

私人类AirportFilter
扩展过滤器{
私人最终AirportAdapter适配器;

私人AirportFilter(AirportAdapter适配器){
super();
this.adapter = adapter;

$ b @Override
protected FilterResults performFiltering(CharSequence constraint){
return new FilterResults();

$ b @Override
protected void publishResults(CharSequence constraint,FilterResults results){
adapter.filterResults(constraint.toString());



私人类AirportClass
扩展RecyclerView.ViewHolder {
TextView name,country;
ImageView图像;

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


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

        }
    }
}

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

解决方案

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.country.setText(airportR.getIsoCountry());
        mHolder.name.setText(airportR.getName());
    }

    public void filterResults(String text) {
        text = text == null ? null : text.toLowerCase().trim();
        if(text == null || "".equals(text)) {
            updateData(realm.where(AirportR.class).findAll());
        } else {
            updateData(realm.where(AirportR.class)
                                .contains("fieldToQueryBy", text, Case.INSENSITIVE) // TODO: change field
                                .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);
        }
    }
}

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

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