如何使用适配器输入作为字符串和光标修改 getItemViewType()?

问题描述

我创建了一个回收器视图并想在其中放入两个列表。 第一个列表只是一个被更改为字体的字符串,我已经在 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