реализовать поиск в recyclerview со встроенной нативной рекламой

#android #android-recyclerview #native-ads #android-filterable

#Android #android-recyclerview #нативная реклама #android-фильтруемый

Вопрос:

Я хочу реализовать поиск в представлении recycler, в котором я использую Object как класс в списке, потому что я встроил нативную рекламу внутри.

Я использовал это как ссылку на встроенную рекламу в представлении recyclerview:-

  @Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            String key = constraint.toString();
            if (key.isEmpty()){
                mDataFiltered = mData;
            }else{
                List<Object> isFiltered = new ArrayList<>();
                for ( Object n : mData){
                    if (((News) n).getName().toLowerCase().contains(key.toLowerCase())){ //throw error at this line
                        isFiltered.add(n);
                    }
                }
                mDataFiltered = isFiltered;
            }

            FilterResults filterResults = new FilterResults();
            filterResults.values = mDataFiltered;
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            mDataFiltered = (List<Object>) results.values;
            notifyDataSetChanged();
        }
    };
}
  

Я попытался использовать объект в качестве класса моей модели, но он выдал эту ошибку

 java.lang.ClassCastException: com.google.android.gms.internal.ads.zzafx cannot be cast to com.jamuitoday.model.News
    at com.jamuitoday.adapter.RAdapter$1.performFiltering(RAdapter.java:211)
    at android.widget.Filter$RequestHandler.handleMessage(Filter.java:236)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:223)
    at android.os.HandlerThread.run(HandlerThread.java:67)
  

Ответ №1:

Ваш список содержит новости и объявления. Поэтому вы должны контролировать свой тип элемента, прежде чем использовать его.

 if (((News) n).getName().toLowerCase().contains(key.toLowerCase())){ //throw error at this line
    isFiltered.add(n);
}
  

Измените этот код, как показано ниже :

 if(n.getItemViewType(mData.indexOf(n)) == 0){ //MENU_ITEM_VIEW_TYPE
    if (((News) n).getName().toLowerCase().contains(key.toLowerCase())){
        isFiltered.add(n);
    }
}