我在stackoverflow中看到了类似的问题,但他们没有给出我的问题的明确答案。在阅读完整的问题之前,不要将其标记为重复。我也看到了this链接,this和this。 感谢您花时间阅读本文。
我在源代码下面提出了三个问题,请仔细看看。
我会让它变得简单。我正在尝试在Recycler Adapter中使用两个 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" ****/
}
}
我的问题是,
Q1。调用getViewType的时间和位置以及&#34; 位置&#34;变量以及我们需要返回什么
Q2。调用getItemCount的时间和地点以及如何正确返回 (因为我使用的是两个视图持有者,每个视图都有不同的数量)
Q3。我创建了单独的Recyclerview Adapter类,但它给出了一个错误,即RecyclerViewAdapter类与另一个类冲突。 (因为我在TabLayout的相同活动中使用它们,我认为错误被抛出,我是否正确?或者有没有办法创建单独的Adapter类)
如果你能解释一下RecyclerViewAdapter的全过程,那就太棒了:)但请澄清我上面的混淆。
欢迎任何类型的帮助,提前致谢......:)
答案 0 :(得分:7)
<强> Q1)强> 每次创建自定义视图时,都会在onCreateViewHolder()方法之前调用getViewType()方法。
您需要使用自定义列表项List<CustomItem> list=method_to_return_your_list()
创建一个列表,并使用getViewType()getter方法创建每个列表。
在你的get 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
<强> Q2)强> getItemCount()方法应该返回列表项的数量。
public int getItemCount() {
return list.size();
}
<强> Q3)强> 不要为同一个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);
...
}
}