0

I want to add on item click listener to my RecyclerView so that when i click on a certain item, it starts a new Intent and retrieves data from a web server about that item. I've tried a lot of suggestions but non of them helped.

My RecylerView Class

public class GetPrice extends AppCompatActivity {
private RecyclerView recyclerView;
private GridLayoutManager gridLayoutManager;
private  CustomAdapter adapter;
private List<MyData> dataList;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.getpricerecycle);
    recyclerView =(RecyclerView) findViewById(R.id.recycler_view);

    dataList = new ArrayList<>();
    load_data_from_server(0);
    gridLayoutManager = new GridLayoutManager(this,1);
    recyclerView.setLayoutManager(gridLayoutManager);
    adapter = new CustomAdapter(this,dataList);
    recyclerView.setAdapter(adapter);

}

private void load_data_from_server(final int id) {
    AsyncTask<Integer,Void,Void> task = new AsyncTask<Integer, Void, Void>() {
        @Override
        protected Void doInBackground(Integer... params) {
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder().url("http://172.20.10.7/anfal/getPrice.php?id="+id).build();
            try {
                Response response = client.newCall(request).execute();
                JSONArray array = new JSONArray(response.body().string());
                for(int i=0;i<array.length();i++ ){
                    JSONObject jsonobject = array.getJSONObject(i);
                    MyData data=new MyData(jsonobject.getInt("id"),jsonobject.getString("name"),jsonobject.getString("price"),jsonobject.getString("image"));
                    dataList.add(data);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                System.out.println("End Of Content");
            }


            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            adapter.notifyDataSetChanged();
        }
    };
task.execute(id);

}

here is my coustm Adapter for the recycler view

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {                                                                 
        private Context context;
        private List<MyData> my_data;
        public CustomAdapter(Context context, List<MyData> my_data) {
        this.context = context;
        this.my_data = my_data;
    }

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

    }
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
           holder.name.setText(my_data.get(position).getName());
           holder.price.setText(my_data.get(position).getPrice());


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

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView name;
        public TextView price;
        public ImageView imageview;
        public ViewHolder(View itemView) {
            super(itemView);
            name=(TextView)itemView.findViewById(R.id.description);
            price=(TextView) itemView.findViewById(R.id.nameofp);
            imageview=(ImageView) itemView.findViewById(R.id.imgevie);
        }
    }

}
HotN
  • 4,216
  • 3
  • 40
  • 51
Omer Khalid
  • 33
  • 1
  • 2
  • 8

6 Answers6

7

The simplest way to implement item click of recyclerview is to implement in onBindViewHolder method of an adapter.

@Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) {
       vh.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //use position value  to get clicked data from list
            }
        });
    }
Patrick R
  • 6,621
  • 1
  • 24
  • 27
2

In your RecyclerView.Adapter simply create an interface you can use.

private onItemClickListener mItemClickListener;

public void setOnItemClickListener(onItemClickListener mItemClickListener) {
        this.mItemClickListener = mItemClickListener;
}

public interface onItemClickListener {
    void onItemClickListener(View view, int position, MyData myData);
}

In this case mItemClickListener is a global variable inside your adapter and the two methods go inside your adapter, too.

Then inside your ViewHolder apply a click listener to your itemView with itemView.setOnClickListener(this) (or whatever component you want clicked to retrieve the data)

@Override
public void onClick(View view) {
    if (mItemClickListener != null) {
        mItemClickListener.onItemClickListener(view, getAdapterPosition(), my_data.get(getAdapterPosition()));
    }
}

This will then pass the view that has been clicked, the position of said view and the object that is contained in your list within that position.

So in your Activity, you can then just simply call the interface.

adapter.setOnItemClickListener(new CustomAdapter.onItemItemClickListener() {
    @Override
    public void onItemClickListener(View view, int position, MyData data) {
    //do on item click functionality here
    }
});
Bradley Wilson
  • 1,197
  • 1
  • 13
  • 26
1

First way

recyclerViewObject.addOnItemTouchListener(
        new RecyclerItemClickListener(
            getContext(),
            recyclerViewObject,
            new RecyclerItemClickListener.OnItemClickListener() {
                @Override public void onItemClick(View view, int position) {
                    // view is the clicked view (the one you wanted
                    // position is its position in the adapter
                }
                @Override public void onLongItemClick(View view, int position) {
                }
            }
        )
    );

Second way

public interface PositionClickListener {
    void itemClicked(int position); }

in adapter

public class MyRecyclerAdapter extends RecyclerView.Adapter
{
    public final PositionClickListener listener;

    public MyRecyclerAdapter(PositionClickListener listener)
    {
         this.listener = listener;
    }

    private void createView(int position)
    {
        View v = new View();
        v.setOnClickListener(new OnClickListener(){
            listener.itemClicked(position);
        });
    }
}

Reference

Naveen Tamrakar
  • 3,349
  • 1
  • 19
  • 28
1

Actually the best practice with recyclerView and OnClickListener is to do this way :

In your activity:

//Add this line in the onCreate method
//Add more parameters if needed for your adapter
DataAdapter myDataAdapter = new DataAdapter (context, myClickListener);


private View.OnClickListener myClickListener = new View.OnClickListener()
{
    @Override
    public void onClick(View view)
    {
        int position = view.getTag()
        //Do something...
    }
};

And in your adapter

private View.OnClickListener myClickListener;
private Context context;

 public DataAdapter (Context context, View.OnClickListener myClickListener)
{
    this.context = context;
    this.myClickListener = myClickListener;
}

public class ViewHolder extends RecyclerView.ViewHolder 
{

    //Your attributes

    public myViewHolder(View v, View.OnClickListener myClickListener) 
    {
        super(v);
        v.setOnClickListener(myClickListener);
    }
}

@Override
public void onBindViewHolder(myViewHolder holder, int position)
{
    holder.itemView.setTag(position)
}

Of course it works for any kind of clickListener.

Hope this help !!

Ferdi
  • 768
  • 3
  • 14
1

You can just change ViewHolder

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

            name=(TextView)itemView.findViewById(R.id.description);
            price=(TextView) itemView.findViewById(R.id.nameofp);
            imageview=(ImageView) itemView.findViewById(R.id.imgevie);



            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                // Here is the action


                }
            });


        }
Enamul Haque
  • 4,789
  • 1
  • 37
  • 50
0

Add click event to itemView inside CustomAdapter.ViewHolder

I.e. itemView.setOnClickListener() And inside onClick() Method get position of clicked item like this:

getAdapterPosition()

Ganesh G
  • 1
  • 2