pratik
pratik

Reputation: 11

How to handle RecyclerView item onClick ,if it is using single Adapter class for multiple Activities

**I am using single MyAdapter class for two different Activities (VocabularyActivity and PracticeActivity).I want to open a different Intent for different items onClick defined in both the Activity .I have attached my code as well.I am trying to use context of both the Activities (VocabularyActivity and PracticeActivity) for item onClick,but unable to implement it. Please guide me through this. **

 //MyAdapter.java

package com.example.pkjha.recyclerview;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.List;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private List<ListItem> listItems;
    private Context context;

    public MyAdapter(List<ListItem> listItems, Context context) {
        this.listItems = listItems;
        this.context = context;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.listitem_recyclerview,parent,false);
        return new ViewHolder(v);
    }



   @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int position) {

        ListItem listItem=listItems.get(position);
        viewHolder.textViewHeader.setText(listItem.getFirstText());
        viewHolder.textViewDescription.setText(listItem.getSecondText());
    }




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




    public class ViewHolder extends RecyclerView.ViewHolder
    {
        public TextView textViewHeader,textViewDescription;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            textViewDescription=itemView.findViewById(R.id.firstText);
            textViewHeader=itemView.findViewById(R.id.secondText);
        }
    }
}

//VocabularyActivity.java


   package com.example.pkjha.recyclerview;

import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.MenuItem;

import java.util.ArrayList;
import java.util.List;

public class VocabularyActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private RecyclerView.Adapter adapter;
    private List<ListItem> listItemList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_vocabulary);

        recyclerView=(RecyclerView) findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);

        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        listItemList=new ArrayList<>();

        setNewData();

        adapter=new MyAdapter(listItemList,this);
        recyclerView.setAdapter(adapter);
    }
    private void setNewData() {

        ListItem listItem=new ListItem("Bird","1");
        listItemList.add(listItem);
        listItem=new ListItem("Animal","2");
        listItemList.add(listItem);
        listItem=new ListItem("Body","3");
        listItemList.add(listItem);

    }`
}

//PracticeActivity.java



package com.example.pkjha.recyclerview;

import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.MenuItem;

import java.util.ArrayList;
import java.util.List;

public class PracticeActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private RecyclerView.Adapter adapter;
    private List<ListItem> listItemList;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_practice);
        recyclerView=(RecyclerView) findViewById(R.id.recyclerView);

        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        listItemList=new ArrayList<>();

        setNewData();

        adapter=new MyAdapter(listItemList,this);
        recyclerView.setAdapter(adapter);
    }

    private void setNewData() {

        ListItem listItem=new ListItem("Chair","1");
        listItemList.add(listItem);
        listItem=new ListItem("Table","2");
        listItemList.add(listItem);
        listItem=new ListItem("Bed","3");
        listItemList.add(listItem);



    }

}

Upvotes: 1

Views: 66

Answers (4)

Drashti Joshi
Drashti Joshi

Reputation: 376

Try this

Adapter Class :

 public abstract class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

            private List<ListItem> listItems;
            private Context context;

            public MyAdapter(List<ListItem> listItems, Context context) {
                this.listItems = listItems;
                this.context = context;
            }

            @NonNull
            @Override
            public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.listitem_recyclerview, parent, false);
                return new ViewHolder(v);
            }


            @Override
            public void onBindViewHolder(@NonNull ViewHolder viewHolder, int position) {
                ListItem listItem = listItems.get(position);
                viewHolder.textViewHeader.setText(listItem.getFirstText());
                viewHolder.textViewDescription.setText(listItem.getSecondText());
            }


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


            public class ViewHolder extends RecyclerView.ViewHolder {
                public TextView textViewHeader, textViewDescription;

                public ViewHolder(@NonNull View itemView) {
                    super(itemView);

                    textViewDescription = itemView.findViewById(R.id.firstText);
                    textViewHeader = itemView.findViewById(R.id.secondText);

                    itemView.setOnClickListener(new View.OnClickListener() {
                      @Override
                      public void onClick(View v) {
                        onItemClick(getAdapterPosition());
                      }
                    });
                }
            }

            public abstract void onItemClick(int pos);

        }

VocabularyActivity:

MyAdapter mAdapter = new MyAdapter(mList, this) {
            public void onItemClick(int position) {
                // your intent
            }
        };

PractiseActivity:

MyAdapter mAdapter = new MyAdapter(mList, this) {
                public void onItemClick(int position) {
                    // your intent
                }
            };

Upvotes: 0

Faiz Mir
Faiz Mir

Reputation: 609

Open different activity by using adapter position by using same adapter

Simple and easy to implement

Step 1:

create two boolean variable in adapter class globally

boolean isVocabulary = false;
boolean isPractice = false;

Step 2:

Add this two variable is Adapter Constructor

 public MyAdapter(List<ListItem> listItems, Context context,boolean 
   isVocabulary,boolean isPractise) {
    this.listItems = listItems;
    this.context = context;
    this.isVocabulary = isVocabulary;
    this.isPractise = isPractise;
}

Step 3

Do this in OnBindViewHolder

   @Override
  public void onBindViewHolder(@NonNull ViewHolder viewHolder, int 
   position) {

    ListItem listItem=listItems.get(position);
    viewHolder.textViewHeader.setText(listItem.getFirstText());
    viewHolder.textViewDescription.setText(listItem.getSecondText());
    if(isVocabulary){
    viewHolder.textViewHeader.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            switch(viewHolder.position){
               case 0:
                //open first activity
                break;
                case 1:
                 //open second activity
                break;
             }
        }
    });
 }
   if(isPractice){
   viewHolder.textViewHeader.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            switch(viewHolder.position){
               case 0:
                //open first activity
                break;
                case 1:
                 //open second activity
                break;
             }
        }
    });

    }


  }

Step 4:

Calling Adapter

VocabularyActivity:

 //true for Vocabulary and false for Practise
 MyAdapter adapter = new MyAdapter(this,list,true,false)

PractiseActivity:

 //falsefor Vocabulary and truefor Practise
 MyAdapter adapter = new MyAdapter(this,list,false,true)

Upvotes: 0

Farrokh
Farrokh

Reputation: 1167

you can do this:
first declare some interface in your adapter and assign it to itemClick
and when create your adapter send your custom click event

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    public interface OnItemClickListener {
        void onItemClick(View view, ListItem item);
    }

    private List<ListItem> listItems;
    private Context context;
    private OnItemClickListener mClickListener;


    public MyAdapter(List<ListItem> listItems, Context context, OnItemClickListener listener) {
        this.listItems = listItems;
        this.context = context;
        this.mClickListener= listener;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.listitem_recyclerview,parent,false);
        return new ViewHolder(v);
    }



   @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder,final int position) {

        ListItem listItem=listItems.get(position);
        viewHolder.textViewHeader.setText(listItem.getFirstText());
        viewHolder.textViewDescription.setText(listItem.getSecondText());
        if(mClickListener !=null)
            viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.onItemClick(v, listItem);
            }
        });
    }




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




    public class ViewHolder extends RecyclerView.ViewHolder
    {
        public TextView textViewHeader,textViewDescription;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            textViewDescription=itemView.findViewById(R.id.firstText);
            textViewHeader=itemView.findViewById(R.id.secondText);
        }
    }
}

Upvotes: 0

Parul
Parul

Reputation: 397

You can create an interface and implement it in both activities and then, write your code of intents for both activities. Then, you can call the interface method from adapter using the context that you passed in adapter's constructor.

Upvotes: 1

Related Questions