无法将Filterable实现到对象类型的ArrayList。

huangapple go评论133阅读模式
英文:

Unable to implement Filterable to Object type ArrayList

问题

I understand you'd like me to provide a translation of the code you've provided. Here's the translated code:

  1. 正在尝试在我的RecyclerView中实现Filterable其中包含`<Object>`以下是代码
  2. ```java
  3. private Filter exampleFilter = new Filter() {
  4. @Override
  5. protected FilterResults performFiltering(CharSequence constraint) {
  6. ArrayList<Object> filteredList = new ArrayList<>();
  7. if (constraint == null || constraint.length() == 0) {
  8. filteredList.addAll(mRecyclerViewItemsAll);
  9. } else {
  10. String filterPattern = constraint.toString().toLowerCase().trim();
  11. for (Object item : mRecyclerViewItemsAll) {
  12. if (item.getVideo_name().toLowerCase().contains(filterPattern)) {
  13. filteredList.add(item);
  14. }
  15. }
  16. }
  17. FilterResults results = new FilterResults();
  18. results.values = filteredList;
  19. return results;
  20. }
  21. @Override
  22. protected void publishResults(CharSequence constraint, FilterResults results) {
  23. mRecyclerViewItems.clear();
  24. mRecyclerViewItems.addAll((List) results.values);
  25. notifyDataSetChanged();
  26. }
  27. };

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

所以我该如何实现Filterable。我已经使用<String>相同的代码,并且它有效。

RecyclerView适配器:

  1. public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements Filterable {
  2. private static final int MENU_ITEM_VIEW_TYPE = 0;
  3. private static final int UNIFIED_NATIVE_AD_VIEW_TYPE = 1;
  4. private final Context mContext;
  5. private final ArrayList<Object> mRecyclerViewItems;
  6. ArrayList<Object> mRecyclerViewItemsAll;
  7. public RecyclerViewAdapter(Context context, ArrayList<Object> recyclerViewItems) {
  8. this.mContext = context;
  9. this.mRecyclerViewItems = recyclerViewItems;
  10. this.mRecyclerViewItemsAll = new ArrayList<>(recyclerViewItems);
  11. }
  12. @Override
  13. public Filter getFilter() {
  14. return exampleFilter;
  15. }
  16. private Filter exampleFilter = new Filter() {
  17. @Override
  18. protected FilterResults performFiltering(CharSequence constraint) {
  19. ArrayList<Object> filteredList = new ArrayList<>();
  20. if (constraint == null || constraint.length() == 0) {
  21. filteredList.addAll(mRecyclerViewItemsAll);
  22. } else {
  23. String filterPattern = constraint.toString().toLowerCase().trim();
  24. for (Object item : mRecyclerViewItemsAll) {
  25. if (item.getVideo_name().toLowerCase().contains(filterPattern)) {
  26. filteredList.add(item);
  27. }
  28. }
  29. }
  30. FilterResults results = new FilterResults();
  31. results.values = filteredList;
  32. return results;
  33. }
  34. @Override
  35. protected void publishResults(CharSequence constraint, FilterResults results) {
  36. mRecyclerViewItems.clear();
  37. mRecyclerViewItems.addAll((List) results.values);
  38. notifyDataSetChanged();
  39. }
  40. };
  41. public class VideoAdapterViewHolder extends RecyclerView.ViewHolder {
  42. }
  43. @Override
  44. public int getItemCount() {
  45. return mRecyclerViewItems.size();
  46. }
  47. @Override
  48. public int getItemViewType(int position) {
  49. Object recyclerViewItem = mRecyclerViewItems.get(position);
  50. if (recyclerViewItem instanceof UnifiedNativeAd) {
  51. return UNIFIED_NATIVE_AD_VIEW_TYPE;
  52. }
  53. return MENU_ITEM_VIEW_TYPE;
  54. }
  55. @Override
  56. public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
  57. }
  58. @Override
  59. public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
  60. int viewType = getItemViewType(position);
  61. }
  62. private void populateNativeAdView(UnifiedNativeAd nativeAd, UnifiedNativeAdView adView) {
  63. }
  64. }

这是MainActivity

  1. @Override
  2. public boolean onCreateOptionsMenu(Menu menu) {
  3. MenuInflater inflater = getMenuInflater();
  4. inflater.inflate(R.menu.actionbar_menu, menu);
  5. MenuItem searchItem = menu.findItem(R.id.action_search);
  6. SearchView searchView = (SearchView) searchItem.getActionView();
  7. searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
  8. searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
  9. @Override
  10. public boolean onQueryTextSubmit(String query) {
  11. return false;
  12. }
  13. @Override
  14. public boolean onQueryTextChange(String newText) {
  15. recyclerViewAdapter.getFilter().filter(newText);
  16. return false;
  17. }
  18. });
  19. return true;
  20. }

希望这个翻译有帮助。如果您有其他问题,请随时提问。

英文:

Am trying to implement Filterable in my recyclerview which contains &lt;Object&gt; here is the code

  1. private Filter exampleFilter = new Filter() {
  2. @Override
  3. protected FilterResults performFiltering(CharSequence constraint) {
  4. ArrayList&lt;Object&gt; filteredList = new ArrayList&lt;&gt;();
  5. if (constraint == null || constraint.length() == 0) {
  6. filteredList.addAll(mRecyclerViewItemsAll);
  7. } else {
  8. String filterPattern = constraint.toString().toLowerCase().trim();
  9. for (Object item : mRecyclerViewItemsAll) {
  10. if (item.getVideo_name().toLowerCase().contains(filterPattern)) {
  11. filteredList.add(item);
  12. }
  13. }
  14. }
  15. FilterResults results = new FilterResults();
  16. results.values = filteredList;
  17. return results;
  18. }
  19. @Override
  20. protected void publishResults(CharSequence constraint, FilterResults results) {
  21. mRecyclerViewItems.clear();
  22. mRecyclerViewItems.addAll((List) results.values);
  23. notifyDataSetChanged();
  24. }
  25. };

When i try above code i get cannot resolve method getVideo_name() in Object

So how do i implement Filterable. I have used same code with &lt;String&gt; and it worked.

Recycler view adapter:

  1. public class RecyclerViewAdapter extends RecyclerView.Adapter&lt;RecyclerView.ViewHolder&gt; implements Filterable {
  2. private static final int MENU_ITEM_VIEW_TYPE = 0;
  3. private static final int UNIFIED_NATIVE_AD_VIEW_TYPE = 1;
  4. private final Context mContext;
  5. private final ArrayList&lt;Object&gt; mRecyclerViewItems;
  6. ArrayList&lt;Object&gt; mRecyclerViewItemsAll;
  7. public RecyclerViewAdapter(Context context, ArrayList&lt;Object&gt; recyclerViewItems) {
  8. this.mContext = context;
  9. this.mRecyclerViewItems = recyclerViewItems;
  10. this.mRecyclerViewItemsAll = new ArrayList&lt;&gt;(recyclerViewItems);
  11. }
  12. @Override
  13. public Filter getFilter() {
  14. return exampleFilter;
  15. }
  16. private Filter exampleFilter = new Filter() {
  17. @Override
  18. protected FilterResults performFiltering(CharSequence constraint) {
  19. ArrayList&lt;Object&gt; filteredList = new ArrayList&lt;&gt;();
  20. if (constraint == null || constraint.length() == 0) {
  21. filteredList.addAll(mRecyclerViewItemsAll);
  22. } else {
  23. String filterPattern = constraint.toString().toLowerCase().trim();
  24. for (Object item : mRecyclerViewItemsAll) {
  25. if (item.getVideo_name().toLowerCase().contains(filterPattern)) {
  26. filteredList.add(item);
  27. }
  28. }
  29. }
  30. FilterResults results = new FilterResults();
  31. results.values = filteredList;
  32. return results;
  33. }
  34. @Override
  35. protected void publishResults(CharSequence constraint, FilterResults results) {
  36. mRecyclerViewItems.clear();
  37. mRecyclerViewItems.addAll((List) results.values);
  38. notifyDataSetChanged();
  39. }
  40. };
  41. public class VideoAdapterViewHolder extends RecyclerView.ViewHolder{
  42. }
  43. @Override
  44. public int getItemCount() {
  45. return mRecyclerViewItems.size();
  46. }
  47. @Override
  48. public int getItemViewType(int position) {
  49. Object recyclerViewItem = mRecyclerViewItems.get(position);
  50. if (recyclerViewItem instanceof UnifiedNativeAd) {
  51. return UNIFIED_NATIVE_AD_VIEW_TYPE;
  52. }
  53. return MENU_ITEM_VIEW_TYPE;
  54. }
  55. @Override
  56. public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
  57. }
  58. @Override
  59. public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
  60. int viewType = getItemViewType(position);
  61. }
  62. private void populateNativeAdView(UnifiedNativeAd nativeAd, UnifiedNativeAdView adView) {
  63. }

And here is MainActivity

  1. @Override
  2. public boolean onCreateOptionsMenu(Menu menu) {
  3. MenuInflater inflater = getMenuInflater();
  4. inflater.inflate(R.menu.actionbar_menu, menu);
  5. MenuItem searchItem = menu.findItem(R.id.action_search);
  6. SearchView searchView = (SearchView) searchItem.getActionView();
  7. searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
  8. searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
  9. @Override
  10. public boolean onQueryTextSubmit(String query) {
  11. return false;
  12. }
  13. @Override
  14. public boolean onQueryTextChange(String newText) {
  15. recyclerViewAdapter.getFilter().filter(newText);
  16. return false;
  17. }
  18. });
  19. return true;
  20. }

Can someone help me what wrong am doing and how to correct it.

答案1

得分: 0

无法解析方法getVideo_name()中的Object

您的列表的类型是Object,这是Java中的超类,并且不包含名为getVideo_name()的方法。

Object类具有预定义的方法,例如:

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

您可以创建一个自定义类,它默认是Object类的子类,并定义类的行为(方法)。

例如:

  1. class MyData {
  2. private String name;
  3. public String getVideoName() {
  4. return this.name;
  5. }
  6. public void setVideoName(String name) {
  7. this.name = name;
  8. }
  9. }

然后像这样使用它:

  1. private final ArrayList<MyData> mRecyclerViewItems;
英文:

> cannot resolve method getVideo_name() in Object

Your list is type of Object which is super class in Java and does not contain method called getVideo_name()

Object class has predefined method namely:

  1. toString()
  2. hashCode()
  3. clone()
  4. equals(Object obj)
  5. getClass()
  6. finalize()
  7. wait()
  8. notify()
  9. notifyAll()

What you can do is to create your class that is by default subtype of Object class and define class behavious(methods)

For example:

  1. class MyData {
  2. private String name;
  3. public String getVideoName() {
  4. return this.name;
  5. }
  6. public void setVideoName(String name) {
  7. this.name = name;
  8. }
  9. }

And then use it like :

  1. private final ArrayList&lt;MyData&gt; mRecyclerViewItems;

huangapple
  • 本文由 发表于 2020年7月23日 02:51:59
  • 转载请务必保留本文链接:https://go.coder-hub.com/63041276.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定