0

I have created a recycler view and want to put two lists in it. The first list is just a string that gets changed into fonts, which I have implemented in the onBindView method. The second list is the cursor which includes the favorite fonts of the users.

I followed this answer on SO but I don't have any idea how I'm going to modify the getItemViewType() method so that I can get to know which list type is currently calling for view.

My adapter code here data is the class that contains the list of fonts

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("⚫");
            ((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);
        }
    }


}

in main activity here temp is the string that users want to convert into the fonts

Cursor cursor = show();
myAdapter = new MyAdapter(this , 500 , temp , cursor);
recyclerView.setAdapter(myAdapter);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);

I'm not a professional android developer I'm still learning the stuff. so sorry if my code is too bad to understand

Tehleel Mir
  • 743
  • 8
  • 27

2 Answers2

0

You are passing null in the onCreateViewHolder() method, and not specified position in getItemViewType() method. All you have to do is, update your code. do not pass the null value in the onCreateViewHolder method. Below code, I've tried, and works perfectly. Happy coding...

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, viewGroup, 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;
  }
}
Harshil Kulkarni
  • 411
  • 5
  • 20
0

Replace your getItemViewType() with this

  @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;
    }

you can also refer to my answer this