Can I have more than one RecyclerViewAdapter class for different xml layout containing their own recyclerView?

Viewed 49

I already have a RecyclerViewAdapter class and now I want another activity opening on click of previous recyclerView's items which has its own recyclerView. But when I create another RecyclerViewAdapter and ViewHolder it shows me error that onCreateViewHolder method is clashing with the First Adapter class' method. How could I have more than one recyclerViewAdapter...I hope I explained what I want.Any help would be appreciated.

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {

    private Context mContext;
    private List<Main> mData;

    public RecyclerViewAdapter(Context mContext, List<Main> mData) {
        this.mContext = mContext;
        this.mData = mData;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view;
        LayoutInflater mInflator = LayoutInflater.from(mContext);
        view = mInflator.inflate(R.layout.single_view, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {

        holder.textView.setText(mData.get(position).getTitle());
        holder.imageView.setImageResource(mData.get(position).getThumbnail());
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                switch (mData.get(position).getTitle()){
                    case "Grocery & Staples":
                        //Toast.makeText(mContext, "1", Toast.LENGTH_SHORT).show();
                        Intent intent = new Intent(mContext, GroceryStaples.class);
                        mContext.startActivity(intent);
                        break;
                    case "Personal Care":
                        Toast.makeText(mContext, "2", Toast.LENGTH_SHORT).show();
                        break;
                    case "Household Items":
                        Toast.makeText(mContext, "3", Toast.LENGTH_SHORT).show();
                        break;
                    case "Beverages":
                        Toast.makeText(mContext, "4", Toast.LENGTH_SHORT).show();
                        break;
                    case "Breakfast & Dairy":
                        Toast.makeText(mContext, "5", Toast.LENGTH_SHORT).show();
                        break;
                    case "Instant Food":
                        Toast.makeText(mContext, "6", Toast.LENGTH_SHORT).show();
                        break;
                    case "Fruits & Vegetables":
                        Toast.makeText(mContext, "7", Toast.LENGTH_SHORT).show();
                        break;
                    default:
                        Toast.makeText(mContext, "NO", Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        });

    }

    @Override
    public int getItemCount() {
        return mData.size();
    }

    @Override
    public int getItemViewType(int position) {
        return super.getItemViewType(position);
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {

        //Main Activity
        ImageView imageView;
        TextView textView;        

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            mContext = itemView.getContext();
            //Main Activity
            imageView = itemView.findViewById(R.id.imageView);
            textView = itemView.findViewById(R.id.textView);


        }

    }

}

New Adapter:

public class RvAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {

    private Context mContext;
    private List<Main> mData;

    public RvAdapter(Context mContext, List<Main> mData){
        this.mContext = mContext;
        this.mData = mData;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view;
        LayoutInflater mInflator = LayoutInflater.from(mContext);
        view = mInflator.inflate(R.layout.rv_item_click, parent, false);
        return null
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerViewAdapter.MyViewHolder holder, int position) {

    }


    @Override
    public int getItemCount() {
        return 0;
    }

    public class ViewHolder extends RecyclerView.ViewHolder{

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
        }
    }
}
2 Answers

In your NewAdapter.java Replace:

public class RvAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>

with

public class RvAdapter extends RecyclerView.Adapter<RvAdapter.ViewHolder>

And Replace:

public void onBindViewHolder(@NonNull RecyclerViewAdapter.MyViewHolder holder, int position)

with

public void onBindViewHolder(@NonNull RvAdapter.ViewHolder holder, int position)

This is an example you can have more than 1 view.(with viewType)

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
class ViewHolder0 extends RecyclerView.ViewHolder {
    ...
    public ViewHolder0(View itemView){
    ...
    }
}

class ViewHolder2 extends RecyclerView.ViewHolder {
    ...
    public ViewHolder2(View itemView){
    ...
}

@Override
public int getItemViewType(int position) {
    // Just as an example, return 0 or 2 depending on position
    // Note that unlike in ListView adapters, types don't have to be contiguous
    return position % 2 * 2;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
     switch (viewType) {
         case 0: return new ViewHolder0(...);
         case 2: return new ViewHolder2(...);
         ...
     }
}

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
    switch (holder.getItemViewType()) {
        case 0:
            ViewHolder0 viewHolder0 = (ViewHolder0)holder;
            ...
            break;

        case 2:
            ViewHolder2 viewHolder2 = (ViewHolder2)holder;
            ...
            break;
    }
}
}

another sample with DataBinding & kotlin :

class ChatAdapter(val context: Context, var chats: ArrayList<ChatModel>) :
RecyclerView.Adapter<RecyclerView.ViewHolder>() {


override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    val inflater = LayoutInflater.from(context)
    // Inflate the custom layout
    if (viewType == 0) {
        val itemBinding = ChatServerItemBinding.inflate(inflater, parent, false)
        return ServerChatViewHolder(itemBinding, context)
    } else {
        val itemBinding = ChatUserItemBinding.inflate(inflater, parent, false)
        return UserChatViewHolder(itemBinding, context)
    }
}

override fun getItemCount(): Int {
    return chats.size
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    when (holder.itemViewType) {
        0 -> {
            holder as ServerChatViewHolder
            holder.bind(chats, position)
        }
        1 -> {
            holder as UserChatViewHolder
            holder.bind(chats, position)
        }
    }

}

override fun getItemViewType(position: Int): Int {
    if (chats[position].type==0)
        return 0

    return 1
}

class ServerChatViewHolder(
    var itemBinding: ChatServerItemBinding,
    var context: Context
) :
    RecyclerView.ViewHolder(itemBinding.root), View.OnClickListener {
    override fun onClick(p0: View?) {
        if (clickListener != null)
            clickListener!!.onItemClick(adapterPosition, p0!!, isSelected)
    }

    init {
        itemBinding.root.setOnClickListener(this)
    }

    fun bind(chats: ArrayList<ChatModel>, position: Int) {
        val chat = chats[position]
        val chatViewModel = ChatViewModel(context)
        chatViewModel.message.set(chat.message)
        chatViewModel.seen.set(chat.seen)
        chatViewModel.date.set(chat.date)

        itemBinding.chat = chatViewModel
    }
}


class UserChatViewHolder(
    var itemBinding: ChatUserItemBinding,
    var context: Context
) :
    RecyclerView.ViewHolder(itemBinding.root), View.OnClickListener {
    override fun onClick(p0: View?) {
        if (clickListener != null)
            clickListener!!.onItemClick(adapterPosition, p0!!, isSelected)
    }

    init {
        itemBinding.root.setOnClickListener(this)
    }

    fun bind(chats: ArrayList<ChatModel>, position: Int) {
        val chat = chats[position]
        val chatViewModel = ChatViewModel(context)
        chatViewModel.message.set(chat.message)
        chatViewModel.seen.set(chat.seen)
        chatViewModel.date.set(chat.date)
        itemBinding.chat = chatViewModel
    }
}

fun addChat(chatModel: ChatModel) {

    this.chats.add(chatModel)
    notifyDataSetChanged()

}

interface ClickListener {
    fun onItemClick(position: Int, v: View, isSelected: Boolean)
}

companion object {
    private var clickListener: ClickListener? = null

}
}
Related