Clicking Cardview To Load A Fragment
I'm having trouble with implementing clickable cards with my RecyclerView. I want to get the position of which card was clicked and then load the proper fragment. I did take a look
Solution 1:
todo this you need to add the OnClickListener to your ViewHolder with an own Clicklistener, like this:
new Interface:
publicinterfacePersonViewHolderClickListener {
voidonItemClick(long id);
}
and change your RVAdapter class like this:
protected Context mContext;
RVAdapter(Context context, List<Chapter> chapters) {
mContext = context;
this.chapters = chapters;
}
publicstaticclassPersonViewHolderextendsRecyclerView.ViewHolder implementsView.OnClickListener {
TextView chapterName;
TextView chapterNumber;
// ImageView chapterPhoto;privatelong PERSONId;
public PersonViewHolderClickListener clickListener;
publicPersonViewHolder(View itemView,PersonViewHolderClickListener clickListener) {
super(itemView);
cv = (CardView) itemView.findViewById(R.id.cv);
chapterName = (TextView) itemView.findViewById(R.id.chapter_name);
chapterNumber = (TextView) itemView.findViewById(R.id.chapter_number);
// chapterPhoto = (ImageView) itemView.findViewById(R.id.person_photo);this.clickListener = clickListener;
view.setOnClickListener(this);
}
@OverridepublicvoidonClick(View v) {
clickListener.onItemClick(PERSONId);
}
}
@Overridepublic PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
Viewv= LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
PersonViewHolderpvh=newPersonViewHolder(v, newPersonViewHolderClickListener() {
@OverridepublicvoidonItemClick(long id) {
Intentintent=newIntent(mContext, YOURActivity.class);
intent.putExtra(EXTRA_PERSON_ID, id);
mContext.startActivity(intent);
}
});
return pvh;
}
@OverridepublicvoidonBindViewHolder(PersonViewHolder personViewHolder, int i) {
personViewHolder.chapterName.setText(chapters.get(i).chapterName);
personViewHolder.chapterNumber.setText(chapters.get(i).chapterNumber);
// personViewHolder.chapterPhoto.setImageResource(persons.get(i).photoId);
personViewHolder.PERSONId = i;
}
Solution 2:
My full working code, with thanks to @fmt.Println.MKO.
RVAdapter.java:
import android.content.Context;
import android.content.Intent;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
publicclassRVAdapterextendsRecyclerView.Adapter<RVAdapter.PersonViewHolder> implementsView.OnClickListener {
Context mContext;
RVAdapter(Context context, List<Chapter> chapters) {
mContext = context;
this.chapters = chapters;
}
publicstatic CardView cv;
publicstaticint position;
publicclassPersonViewHolderextendsRecyclerView.ViewHolder {
TextView chapterName;
TextView chapterNumber;
// ImageView chapterPhoto;publicPersonViewHolder(View itemView) {
super(itemView);
cv = (CardView) itemView.findViewById(R.id.cv);
chapterName = (TextView) itemView.findViewById(R.id.chapter_name);
chapterNumber = (TextView) itemView.findViewById(R.id.chapter_number);
// chapterPhoto = (ImageView) itemView.findViewById(R.id.person_photo);
itemView.setOnClickListener(RVAdapter.this);
position = getPosition();
}
}
@OverridepublicvoidonClick(View v) {
Intentintent=newIntent(mContext, ChapterActivity.class);
mContext.startActivity(intent);
}
List<Chapter> chapters;
@OverridepublicvoidonAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
@Overridepublic PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
Viewv= LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
PersonViewHolderpvh=newPersonViewHolder(v);
return pvh;
}
@OverridepublicvoidonBindViewHolder(PersonViewHolder personViewHolder, int i) {
personViewHolder.chapterName.setText(chapters.get(i).chapterName);
personViewHolder.chapterNumber.setText(chapters.get(i).chapterNumber);
// personViewHolder.chapterPhoto.setImageResource(persons.get(i).photoId);
}
@OverridepublicintgetItemCount() {
return chapters.size();
}
}
The fragment with the RecyclerView:
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
publicclassUnitOneFragmentextendsandroid.support.v4.app.Fragment {
private List<Chapter> chapters;
private RecyclerView rv;
private RecyclerView.LayoutManager llm;
publicUnitOneFragment() {
// Required empty public constructor
}
@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragmentViewv= inflater.inflate(R.layout.fragment_unit_one, container, false);
rv = (RecyclerView) v.findViewById(R.id.rv);
rv.setHasFixedSize(true);
llm = newLinearLayoutManager(getActivity());
rv.setLayoutManager(llm);
initializeData();
initializeAdapter();
return v;
}
privatevoidinitializeData() {
chapters = newArrayList<>();
chapters.add(newChapter("Human Prehistory to the Early Civilizations", "Chapter One"));
chapters.add(newChapter("Classical China", "Chapter Two"));
chapters.add(newChapter("Classical India", "Chapter Three"));
chapters.add(newChapter("Classical Greece and Rome", "Chapter Four"));
chapters.add(newChapter("Classical Period: Declines and Diversities", "Chapter Five"));
}
privatevoidinitializeAdapter() {
RVAdapteradapter=newRVAdapter(getActivity(), chapters);
rv.setAdapter(adapter);
}
}
classChapter {
String chapterName;
String chapterNumber;
// int photoId;
Chapter(String chaptername, String chapternumber) {
this.chapterName = chaptername;
this.chapterNumber = chapternumber;
// this.photoId = photoId;
}
}
Post a Comment for "Clicking Cardview To Load A Fragment"