问题描述
我创建了一个回收器视图并想在其中放入两个列表。 第一个列表只是一个被更改为字体的字符串,我已经在 onBindView 方法中实现了它。 第二个列表是光标,包含用户喜欢的字体。
我在 SO 上遵循了 this 答案,但我不知道我将如何修改 getItemViewType() 方法,以便我可以了解当前调用的是哪种列表类型。
我的适配器代码 这里的数据是包含字体列表的类
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final int VIEW_TYPE_TEXTVIEW = 0;
private final int VIEW_TYPE_ITEM_1 = 1;
private int total_no_of_row;
private Context context;
private String str;
private Cursor cursor;
private final LayoutInflater inflater;
public MyAdapter(Context context,int total_no_of_row,String str,Cursor cursor) {
this.context = context;
this.total_no_of_row = total_no_of_row;
this.str = str;
this.cursor = cursor;
inflater = LayoutInflater.from(context);
}
@Override
public int getItemViewType(int position) {
return super.getItemViewType(position);
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
if(viewType == VIEW_TYPE_TEXTVIEW) {
View view = inflater.inflate(R.layout.row_layout,parent,false);
return new Item1Holder(view);
}
else if (viewType == VIEW_TYPE_ITEM_1){
View view = inflater.inflate(R.layout.row_layout,false);
return new Item2Holder(view);
}
return null;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder,int position) {
if(holder instanceof Item1Holder){
data d = new data();
cursor.movetoPosition(position);
Log.d("this2",cursor.getInt(1)+"");
String temp = d.Convert(str,cursor.getInt(1));
((Item1Holder)holder).textView.setText(temp);
((Item1Holder)holder).rowNumber.setText("⚫");
((Item1Holder)holder).fav.setimageResource(R.drawable.ic_baseline_favorite_24);
}else if(holder instanceof Item2Holder){
data d = new data();
String temp = d.Convert(str,position);
((Item2Holder)holder).textView.setText(temp);
((Item2Holder)holder).rowNumber.setText((position + 1) + ".");
if (util.copY) {
if (position == util.CURRENT_POSITION) {
((Item2Holder)holder).imageView.setBackgroundResource(R.drawable.background_when_row_clicked);
} else {
((Item2Holder)holder).imageView.setBackgroundResource(R.drawable.background_when_row_clicked_two);
}
}
}
}
@Override
public int getItemCount() {
return total_no_of_row + cursor.getCount();
}
class Item1Holder extends RecyclerView.ViewHolder {
TextView textView;
ImageView imageView,fav;
TextView rowNumber;
public Item1Holder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.text_body);
imageView = itemView.findViewById(R.id.copy_png);
rowNumber = itemView.findViewById(R.id.row_number);
fav = itemView.findViewById(R.id.fav);
}
}
class Item2Holder extends RecyclerView.ViewHolder {
TextView textView;
ImageView imageView,fav;
TextView rowNumber;
public Item2Holder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.text_body);
imageView = itemView.findViewById(R.id.copy_png);
rowNumber = itemView.findViewById(R.id.row_number);
fav = itemView.findViewById(R.id.fav);
}
}
}
在主要活动中 这里 temp 是用户想要转换成字体的字符串
Cursor cursor = show();
myAdapter = new MyAdapter(this,500,temp,cursor);
recyclerView.setAdapter(myAdapter);
linearlayoutmanager linearlayoutmanager = new linearlayoutmanager(this);
recyclerView.setLayoutManager(linearlayoutmanager);
我不是专业的 android 开发人员,我仍在学习这些东西。如果我的代码太糟糕而无法理解,那么抱歉
解决方法
您在 onCreateViewHolder()
方法中传递 null,而在 getItemViewType()
方法中未指定位置。您所要做的就是更新您的代码。不要在 onCreateViewHolder 方法中传递空值。下面的代码,我已经尝试过,并且运行良好。快乐编码...
private static final int CATEGORY = 1;
private static final int NAME = 2;
private Collection<CategorizedName> data;
@Override
public int getItemViewType(int position) {
if (items.get(position) instanceof Category) {
return CATEGORY;
} else if (items.get(position) instanceof Name) {
return NAME;
}
throw new RuntimeException('error');
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup,int viewType) {
RecyclerView.ViewHolder viewHolder;
LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
switch (viewType) {
case CATEGORY:
View categoryView = inflater.inflate(R.layout.viewholder_category,viewGroup,false);
viewHolder = new CategoryViewHolder(categoryView);
break;
case NAME:
View nameView = inflater.inflate(R.layout.viewholder_name,false);
viewHolder = new NameViewHolder(nameView);
break;
}
return viewHolder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder,int position) {
switch (viewHolder.getItemViewType()) {
case USER:
CategoryViewHolder categoryViewHolder = (CategoryViewHolder) viewHolder;
bindCategoryViewHolder(categoryViewHolder,position);
break;
case IMAGE:
NameViewHolder nameViewHolder = (NameViewHolder) viewHolder;
bindNameViewHolder(nameViewHolder,position);
break;
}
}
,
用这个替换你的 getItemViewType()
@Override
public int getItemViewType(int position){
if(position < total_no_of_row){
return VIEW_TYPE_TEXTVIEW;
}
if(position - total_no_of_row < cursor.getCount()){
return VIEW_TYPE_ITEM_1;
}
return -1;
}
你也可以参考我的回答this