Reputation: 23
HI I'm new to android and I'm fetching data from db and displaying in recycler view. How to get the value of the item clicked. I'm able to get the position but I'm not sure how to get the value.
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import java.util.Collections;
import java.util.List;
public class AdapterSearch extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private LayoutInflater inflater;
List<DataSearch> data= Collections.emptyList();
DataSearch current;
// create constructor to initialize context and data sent from MainActivity
public AdapterSearch(Context context, List<DataSearch> data){
this.context=context;
inflater= LayoutInflater.from(context);
this.data=data;
}
// Inflate the layout when ViewHolder created
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view=inflater.inflate(R.layout.container_search, parent,false);
MyHolder holder=new MyHolder(view);
return holder;
}
// Bind data
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
// Get current position of item in RecyclerView to bind data and assign values from list
MyHolder myHolder= (MyHolder) holder;
DataSearch current=data.get(position);
myHolder.textsanctname.setText(current.sanctname);
myHolder.textstate.setText("State " + current.state);
myHolder.textType.setText("Category " + current.catagory);
}
// return total item from List
@Override
public int getItemCount() {
return data.size();
}
class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
TextView textsanctname;
TextView textstate;
TextView textType;
// create constructor to get widget reference
public MyHolder(View itemView) {
super(itemView);
textsanctname= (TextView) itemView.findViewById(R.id.textsanctname);
textstate = (TextView) itemView.findViewById(R.id.textstate);
textType = (TextView) itemView.findViewById(R.id.textType);
itemView.setOnClickListener(this);
}
// Click event for all items
@Override
public void onClick(View v) {
Toast.makeText(context, "You clicked "+getPosition(),Toast.LENGTH_SHORT).show();
}
}
}
Thanks in advance.
Upvotes: 0
Views: 1627
Reputation: 591
// Click event for all items
@Override
public void onClick(View v) {
DataSearch clickedData = data.get(getPosition());
Toast.makeText(context, "You clicked "+clickedData.getXXX(),Toast.LENGTH_SHORT).show();
}
Assign the value into a variable and you may display the value in Toast.
Upvotes: 0
Reputation: 207
you need to create a Model class with getter and setter
Modelclass.java
public class FeaturedContentModel {
String featuredContent;
public String getFeaturedContent() {
return featuredContent;
}
public void setFeaturedContent(String featuredContent) {
this.featuredContent = featuredContent;
}
}
In your adapter implement on click listener
MyAdapter.java
public class FeaturedContentAdapter extends RecyclerView.Adapter<FeaturedContentAdapter.ViewHolder> {
ArrayList<FeaturedContentModel> featuredContentModelArrayList;
FeaturedContentModel featuredContentModel;
Context mContext;
FeaturedContentAdapter.OnClickInterface onClickInterface;
public FeaturedContentAdapter(ArrayList<FeaturedContentModel> featuredContentModelArrayList, Context mContext, OnClickInterface onClickInterface) {
this.featuredContentModelArrayList = featuredContentModelArrayList;
this.mContext = mContext;
this.onClickInterface = onClickInterface;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.featured_content_single_row, parent, false);
return new FeaturedContentAdapter.ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
featuredContentModel = featuredContentModelArrayList.get(position);
holder.tv_featured_content_name.setText(featuredContentModel.getFeaturedContent());
}
@Override
public int getItemCount() {
return featuredContentModelArrayList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView tv_featured_content_name;
public ViewHolder(View itemView) {
super(itemView);
tv_featured_content_name = (TextView) itemView.findViewById(R.id.tv_featured_contents_name);
itemView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
// get position
int pos = getAdapterPosition();
FeaturedContentModel featuredContentModel=featuredContentModelArrayList.get(pos);
onClickInterface.setOnClick(featuredContentModel);
// check if item still exists
if(pos != RecyclerView.NO_POSITION){
FeaturedContentModel clickedDataItem = featuredContentModelArrayList.get(pos);
Toast.makeText(v.getContext(), "Clicked ", Toast.LENGTH_SHORT).show();
}
}
});
}
}
public interface OnClickInterface{
void setOnClick(FeaturedContentModel featuredContentModel);
}
}
Main Activity.java
RecyclerView.Adapter adapter = new FeaturedContentAdapter(featuredContentModelArrayList, FeaturedContent.this, new FeaturedContentAdapter.OnClickInterface() {
@Override
public void setOnClick(FeaturedContentModel featuredContentModel) {
startActivity(new Intent(FeaturedContent.this,DetailsContentActivity.class).putExtra("title",featuredContentModel.getFeaturedContent()));
}
});
featuredContentsRecyclerView.setAdapter(adapter);
Upvotes: 2
Reputation: 336
Change your code to this. Here, if you clicked on "textsanctname" view then the values will be shown in a toast
// Bind data
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
// Get current position of item in RecyclerView to bind data and assign values from list
MyHolder myHolder= (MyHolder) holder;
DataSearch current=data.get(position);
myHolder.textsanctname.setText(current.sanctname);
myHolder.textstate.setText("State " + current.state);
myHolder.textType.setText("Category " + current.catagory);
myHolder.textsanctname.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(context, current.sanctname +" " +current.state+ " "+current.catagory,Toast.LENGTH_SHORT).show();
}
});
}
Upvotes: 0
Reputation: 2345
Find the solution
Write down this class
public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
private OnItemClickListener mListener;
public interface OnItemClickListener {
public void onItemClick(View view, int position);
public void onLongItemClick(View view, int position);
}
GestureDetector mGestureDetector;
public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
mListener = listener;
mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
@Override
public void onLongPress(MotionEvent e) {
View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
if (child != null && mListener != null) {
mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child));
}
}
});
}
@Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
View childView = view.findChildViewUnder(e.getX(), e.getY());
if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
return true;
}
return false;
}
@Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { }
@Override
public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){}
}
In your activity write
recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, recyclerView, new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Log.d("position",position);
}
@Override
public void onLongItemClick(View view, int position) {
// do whatever
}
})
);
Upvotes: 0