【问题标题】:When getItemCount and getItemViewType method get called in Recycler Adapter当在 Recycler Adapter 中调用 getItemCount 和 getItemViewType 方法时
【发布时间】:2015-11-14 10:52:23
【问题描述】:

我在 stackoverflow 中看到了类似的问题,但他们没有对我的问题给出明确的答案。在阅读我的完整问题之前,不要将其标记为重复。我也看到了this 链接、thisthis。 感谢您花时间阅读本文。

我在源代码下面给出了我的三个问题,请看一下。

我会让它变得简单。我正在尝试在 Recycler Adapter 中使用 two ViewHolder,我将在 ViewPager 中将其用于 TabLayout。两个 View Holder 都具有 不同 Xml 和不同的元素(即 textview 、 imageview 等),但在其中遇到了一些混乱。

我实现了我的 RecyclerView 适配器类如下

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 


    public class MainViewHolder extends  RecyclerView.ViewHolder {
       public MainViewHolder(View v) {
        super(v);
       }


    class ViewHolder0 extends MainViewHolder { 
        ... 
    } 

    class ViewHolder2 extends MainViewHolder { 
        ... 
    } 

    @Override 
    public int getItemViewType(int position) {
        /**** I don't know where and when this method will be called and what will be the value present in the variable "position" ****/
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
         switch (viewType) {
             case 0: return new ViewHolder0(...); 
             case 2: return new ViewHolder2(...); 
             ... 
         } 
    } 
      public int getItemCount() {
             /**** I don't know where and when this method will be called and   what will be the value present in the variable "position" ****/ 
     }
} 

我的问题是,

第一季度。何时何地调用 getViewType,“position”变量中的内容以及我们需要返回什么

第二季度。何时何地调用 getItemCount 以及如何正确返回(因为我正在使用 两个视图持有者,每个持有者都有不同的计数

第三季度。我创建了单独的 Recyclerview 适配器类,但它给出了一个错误,即 RecyclerViewAdapter 类 冲突 与另一个类。 (因为我在 TabLayout 的相同活动中使用它们,我认为抛出了错误,我正确吗?或者有什么方法可以创建单独的适配器类)

如果你能解释 RecyclerViewAdapter 的全过程,那就太棒了:) 但是请澄清我上面的困惑。

欢迎任何类型的帮助,在此先感谢... :)

【问题讨论】:

  • getItemCount 返回RecyclerView 中的项目总数,getViewType 使用值 [0..cnt-1] 调用其中 cntgetItemCount 返回
  • @pskink 当我在同一个 Adapter 中使用两个或多个 Holder 时,每个 Holder 在 OnCreate 和 OnBind 中都有其单独的 Count 和 Seperate 操作,我该如何识别和编码?
  • 在这些方法里面加一些Log.d,这是最好的学习方法
  • @pskink Cool.. 这真是太棒了。 :D

标签: android adapter android-recyclerview


【解决方案1】:

第一季度) 每次创建自定义视图时,都会在 onCreateViewHolder() 方法之前调用 getViewType() 方法。

您需要使用您的自定义列表项 List&lt;CustomItem&gt; list=method_to_return_your_list() 创建一个列表,并且每个列表项都使用 getViewType() getter 方法。

在你的 getItemViewType() 中

public int getItemViewType(int position) {
    return list.get(position).getViewType();
   /*this returns the view type of each element in the list*/
} 

考虑到 onCreateViewHolder() 方法中的 switch case 语句,这可以是 0 或 1

第二季度) getItemCount() 方法应该返回列表项的数量。

public int getItemCount() {
         return list.size();
 }

第三季度) 不要为同一个 recyclerview 创建另一个 recyclerview 适配器

我也忘记了。 而不是创建新的 ViewHolders ,只需更改视图持有者中的 itemView 就像

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
     switch (viewType) {
         case 0: return new ViewHolder(itemView0); 
         case 2: return new ViewHolder(itemView1); 
         ... 
     } 
} 

【讨论】:

  • 感谢您的回答,您能否解释一下有关 getItemViewType() 的更多信息,1. 将使用整数参数调用此 getItemViewType 的对象和位置。我的意思是什么将处于“位置”。是每次为每个 ViewHolders 调用它还是为 OnBind 方法调用它?它的目的是什么?
  • 这可以是 CustomItem 类中的 getter 方法,它是数据列表 List 列表的类型;创建列表元素时必须设置它,例如 CustomItem item=new CustomItem();item.setViewType=0;list.add(item);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多