swa95
swa95

Reputation: 23

display clicked value in recycler view in android

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

Answers (4)

Zarul Izham
Zarul Izham

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

Vishal Gedia
Vishal Gedia

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

Atahar Hossain
Atahar Hossain

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

Rajasekhar
Rajasekhar

Reputation: 2345

Find the solution

  1. 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){}
            }
    
    1. 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

Related Questions