无法对对象类型 ArrayList 实现 Filterable

Unable to implement Filterable to Object type ArrayList

我正在尝试在包含 <Object> 的 recyclerview 中实现 Filterable,这是代码

private Filter exampleFilter = new Filter() {
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        ArrayList<Object> filteredList = new ArrayList<>();
        if (constraint == null || constraint.length() == 0) {
            filteredList.addAll(mRecyclerViewItemsAll);
        } else {
            String filterPattern = constraint.toString().toLowerCase().trim();
            for (Object item : mRecyclerViewItemsAll) {
                if (item.getVideo_name().toLowerCase().contains(filterPattern)) {
                    filteredList.add(item);
                }
            }
        }
        FilterResults results = new FilterResults();
        results.values = filteredList;
        return results;
    }
    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        mRecyclerViewItems.clear();
        mRecyclerViewItems.addAll((List) results.values);
        notifyDataSetChanged();
    }
};

当我尝试上面的代码时,我得到 cannot resolve method getVideo_name() in Object

那么我该如何实现 Filterable。我在 <String> 中使用了相同的代码并且有效。

回收站视图适配器:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements Filterable {
    private static final int MENU_ITEM_VIEW_TYPE = 0;
    private static final int UNIFIED_NATIVE_AD_VIEW_TYPE = 1;

    private final Context mContext;
    private final ArrayList<Object> mRecyclerViewItems;
    ArrayList<Object> mRecyclerViewItemsAll;

    public RecyclerViewAdapter(Context context, ArrayList<Object> recyclerViewItems) {
        this.mContext = context;
        this.mRecyclerViewItems = recyclerViewItems;
        this.mRecyclerViewItemsAll = new ArrayList<>(recyclerViewItems);
    }

    @Override
    public Filter getFilter() {
        return exampleFilter;
    }
    private Filter exampleFilter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            ArrayList<Object> filteredList = new ArrayList<>();
            if (constraint == null || constraint.length() == 0) {
                filteredList.addAll(mRecyclerViewItemsAll);
            } else {
                String filterPattern = constraint.toString().toLowerCase().trim();
                for (Object item : mRecyclerViewItemsAll) {
                    if (item.getVideo_name().toLowerCase().contains(filterPattern)) {
                        filteredList.add(item);
                    }
                }
            }
            FilterResults results = new FilterResults();
            results.values = filteredList;
            return results;
        }
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            mRecyclerViewItems.clear();
            mRecyclerViewItems.addAll((List) results.values);
            notifyDataSetChanged();
        }
    };

    public class VideoAdapterViewHolder extends RecyclerView.ViewHolder{
        
    }

    @Override
    public int getItemCount() {
        return mRecyclerViewItems.size();
    }

    @Override
    public int getItemViewType(int position) {
        Object recyclerViewItem = mRecyclerViewItems.get(position);
        if (recyclerViewItem instanceof UnifiedNativeAd) {
            return UNIFIED_NATIVE_AD_VIEW_TYPE;
        }
        return MENU_ITEM_VIEW_TYPE;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        int viewType = getItemViewType(position);
        
    }

    private void populateNativeAdView(UnifiedNativeAd nativeAd, UnifiedNativeAdView adView) {
        
}

这里是 MainActivity

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.actionbar_menu, menu);
        MenuItem searchItem = menu.findItem(R.id.action_search);
        SearchView searchView = (SearchView) searchItem.getActionView();
        searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                      return false;
                }
              @Override
            public boolean onQueryTextChange(String newText) {
                recyclerViewAdapter.getFilter().filter(newText);
                      return false;
                }
          });
        return true;
    }

谁能帮我看看我做错了什么以及如何改正它。

cannot resolve method getVideo_name() in Object

您的列表是 Object 的类型,它是 Java 中的超级 class 并且不包含名为 getVideo_name()

的方法

对象class有预定义的方法即:

toString()
hashCode()
clone()
equals(Object obj)
getClass()
finalize()
wait()
notify()
notifyAll()

你可以做的是创建你的 class 默认情况下是 Object class 的子类型并定义 class behavious(methods)

例如:

class MyData {
    private String name;

    public String getVideoName() {
        return this.name;
    }

    public void setVideoName(String name) {
        this.name = name;
    }

}

然后像这样使用它:

private final ArrayList<MyData> mRecyclerViewItems;