implement search in recyclerview with embedded native ads

89 Views Asked by At

I want to implement a search in the recycler view in which I use Object as Class in List because I embedded native ads within.

I used this as a reference to embedded ads in recycler view Reference:-

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

I tried casting Object as my model class but it gave this error

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

There are 1 best solutions below

0
On

Your list contains News and Ads. Therefore you should control your item type before use it.

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

Change this code like below :

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