Reputation: 11
**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
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
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
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
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