복붙노트

[ANDROID] RealmRecyclerViewAdapter에서 필터링 구현하는 방법

ANDROID

RealmRecyclerViewAdapter에서 필터링 구현하는 방법

해결법


  1. 1.publishResults에 필터링을 이동하고 새로운 결과를 평가하기 위해 UI 스레드 영역의 쿼리를 사용합니다.

    publishResults에 필터링을 이동하고 새로운 결과를 평가하기 위해 UI 스레드 영역의 쿼리를 사용합니다.

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

  2. 2.어댑터가이 추가에 당신을 도울 수 있습니다

    어댑터가이 추가에 당신을 도울 수 있습니다

    fun filterResults(text: String?, realm: Realm) {
        var text = text
        text = text?.toLowerCase()?.trim { it <= ' ' }
        val query = realm.where(YourObject::class.java)
        if (!(text == null || "" == text)) {
            query.contains("username", text, Case.INSENSITIVE).or().contains("username2", text, Case.INSENSITIVE)
        }
        updateData(query.findAllAsync()) // or findAll()
    }
    
  3. from https://stackoverflow.com/questions/40630322/how-to-implement-filterable-in-realmrecyclerviewadapter by cc-by-sa and MIT license