首页 > 解决方案 > 如何使用适配器输入作为字符串和光标修改 getItemViewType()?

问题描述

我创建了一个回收站视图,并希望在其中放置两个列表。第一个列表只是一个转换为字体的字符串,我在 onBindView 方法中实现了它。第二个列表是光标,其中包括用户最喜欢的字体。

我在 SO 上遵循了这个答案,但我不知道如何修改 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, parent, 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("⚫&quot;);
            ((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 开发人员,我仍在学习这些东西。很抱歉,如果我的代码太糟糕而无法理解

标签: javaandroidandroid-recyclerviewadaptersimplecursoradapter

解决方案


用这个替换你的 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;
    }

你也可以参考我的回答这个


推荐阅读