6

I need to pass data from recyclerView adapter to main activity on click on image of recyclerview. Can someone help?

public  class VideoAdapter extends RecyclerView.Adapter<VideoAdapter.VideoHolder> {
    private ArrayList<Video> mData;
    private ArrayList<Video> mData2;


    private Activity mACtivity;

    public VideoAdapter(ArrayList<Video> data, ArrayList<Video> data2, Activity activity) {
        this.mData = data;
        this.mData2 = data2;

        this.mACtivity = activity;
    }


    @Override
    public VideoHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.anteprima_list_item, parent, false);
        //view.setOnClickListener(mOnClickListener);

        return new VideoHolder(view);
    }

    @Override
    public void onBindViewHolder(VideoHolder holder, int position) {
        Video video = mData.get(position);
        final Video video2 = mData2.get(position);

        holder.setTitolo(video.getTitolo());
        holder.setSottoTitolo(video.getSottotitolo());

        holder.setData(video.getData());

        holder.setData(video.getData());


       /* holder.setAddress(restaurant.getAddress());
        holder.setCost("Average cost for 2: " + restaurant.getCurrency() + restaurant.getCost());
        holder.setRating(restaurant.getRating());*/

        Glide.with(mACtivity)
                .load(video2.getPic())
                .into(holder.restaurantImageView);

        holder.restaurantImageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // handle click event here
                System.out.println("PIC"+video2.getPic());
            }
        });

    }

    @Override
    public int getItemCount() {
        if (mData == null)
            return 0;
        return mData.size();
    }

    public class VideoHolder extends RecyclerView.ViewHolder {

        ImageView restaurantImageView;
        TextView restaurantNameTextView;
        TextView restaurantAddressTextView;
        TextView restaurantRatingTextView;
        TextView costTextView;
        TextView distanceTextView;
        LinearLayout linearlayout;

        public VideoHolder(View itemView) {
            super(itemView);
             linearlayout=(LinearLayout) itemView.findViewById((R.id.linearlayout));

            restaurantImageView = (ImageView) itemView.findViewById(R.id.imageview_restaurant);
            restaurantNameTextView = (TextView) itemView.findViewById(R.id.textview_restaurant_name);
            restaurantAddressTextView = (TextView) itemView.findViewById(R.id.restaurant_address_textview);
            distanceTextView = (TextView) itemView.findViewById(R.id.restaurant_distance_textview);
           /*  costTextView = (TextView) itemView.findViewById(R.id.cost_for_two_textview);

           restaurantRatingTextView = (TextView) itemView.findViewById(R.id.rating);*/


        }


        public void setTitolo(String titolo) {
            restaurantNameTextView.setText(titolo);
        }

        public void setSottoTitolo(String sottotitolo) {
            restaurantAddressTextView.setText(sottotitolo);
        }

        public void setData(String data) {
            distanceTextView.setText(data);
        }
      /*  public void setPic(String pic) {
            distanceTextView.setText(pic);
        }

         public void setCost(String cost) {
            costTextView.setText(cost);
        }

        public void setDistance(String distance) {
            distanceTextView.setText(distance);
        }*/
    }
}
Wool
  • 138
  • 1
  • 10
Sisso
  • 229
  • 1
  • 5
  • 12
  • Possible duplicate of [Go back to previous Activity with some \`put extra\` onClick of a recyclerView Item](https://stackoverflow.com/questions/29795760/go-back-to-previous-activity-with-some-put-extra-onclick-of-a-recyclerview-ite) – Deegriz Nov 08 '17 at 15:02
  • You need to open a new activity with a data from onClick? or you want to trigger some action in parent activity? – Rainmaker Nov 08 '17 at 15:08
  • @Rainmaker i want pass data to main activity!!can you help me please? – Sisso Nov 08 '17 at 15:09

4 Answers4

17

Create a listener Interface and let your MainActivity implement it. That way you can call your callback method in your onClick method.

Interface:

public interface OnImageClickListener {
    void onImageClick(String imageData);
}

MainActivity:

public class MainActivity implements OnImageClickListener {
    @Override
    public void onImageClick(String imageData) {
        // handle image data
    }
//...
}

Your VideoAdapter:

    //...
    private OnImageClickListener onImageClickListener;

    public VideoAdapter(ArrayList<Video> data, ArrayList<Video> data2, Activity activity, OnImageClickListener onImageClickListener) {
        this.mData = data;
        this.mData2 = data2;
        this.mACtivity = activity;
        this.onImageClickListener = onImageClickListener;
    }
    //...
    @Override
    public void onBindViewHolder(VideoHolder holder, int position) {
        //...
        holder.restaurantImageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onImageClickListener.onImageClick(video2.getPic());
            }
        });
        //...
    }
    //...
Chris Parker
  • 336
  • 3
  • 13
  • @Sisso I edited my answer and provided some code snippets. – Chris Parker Nov 08 '17 at 15:25
  • in onClick method of adapter i get onImageClickListener written in red by IDE...why? – Sisso Nov 08 '17 at 15:27
  • OnImageClickListener.onImageClick(video2.getPic()); i get onImageClick cannot be referenced from a static context...why? – Sisso Nov 08 '17 at 15:30
  • @Sisso You probably forgot to declare onImageClickListener as a member of your VideoAdapater. I updated my code in my answer. You need to declare it as a member variable and pass MainActivity which implements your OnImageClickListener interface as the 4rth argument of your VideoAdapter constructor. – Chris Parker Nov 08 '17 at 15:30
  • sorry, how i pass from my activity to adapter OnImageClickListener onImageClickListener? – Sisso Nov 08 '17 at 15:40
  • @Sisso First your Activity needs to implement the "OnImageClickListener" interface (see my example code). When you create your VideoAdapter you need to pass your Activity as the OnImageClickListener: `VideoAdapter adapter = new VideoAdapter(data, data2, this, this);` – Chris Parker Nov 08 '17 at 15:42
  • 1
    @Sisso `mAdapter = new VideoAdapter(videoList,videoList2, this, this);` Don't forget to add the OnImageClickListener as a 4rth argument in your VideoAdapter constructor (see my code) – Chris Parker Nov 08 '17 at 15:47
  • You're welcome buddy! I strongly recommend to improve your Java skills before diving too much into Android development, since this question was very basic Java knowledge. I think it might be good to create some command line Java applications to learn how to write Java. There are a lot of really good Java tutorials out there ;-) – Chris Parker Nov 08 '17 at 15:53
  • it is the first time that i work with Interface...THANKS AGAIN – Sisso Nov 08 '17 at 16:05
  • where can i create the interface ? – Fernando Torres Dec 24 '19 at 00:12
8

If you want to pass value from onclick to your Parent activity, use onMethodCallback in your MainActivity:

public class MainActivity extends Activity implements AdapterCallback {

    private MyAdapter mMyAdapter;

    @Override
    public void onMethodCallback(String yourValue) {
       // get your value here
    }

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        this.mMyAdapter = new MyAdapter(this);
    }
}

In your Adapter:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private AdapterCallback mAdapterCallback;

    public MyAdapter(Context context) {
        try {
            this.mAdapterCallback = ((AdapterCallback) context);
        } catch (ClassCastException e) {
            throw new ClassCastException("Activity must implement AdapterCallback.");
        }
    }

    @Override
    public void onBindViewHolder(final MyAdapter.ViewHolder viewHolder, final int i) {
        // simple example, call interface here
        // not complete
        viewHolder.itemView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                mAdapterCallback.onMethodCallback();
            }
        });
    }

    public static interface AdapterCallback {
        void onMethodCallback(String yourValue);
    }
}
Rainmaker
  • 10,294
  • 9
  • 54
  • 89
2

If you are working with kotlin, the solution is much simpler. Original Answer here

pass the lamda val itemClick: (Int) -> Unit to your adapter.

class MyRecyclerViewAdapter(params , val itemClick: (Int) -> Unit): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
internal inner class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) {
    ...
    itemView.setOnClickListener( {itemClick(layoutPosition)} )
  } 
}  

In your Activity use the returned value position

val myAdapter = MyRecyclerViewAdapter(params) { position ->
    // do something
}
pz64_
  • 2,212
  • 2
  • 20
  • 43
0

Write interface in your adapter like bellow :

interface clickItemListener {
    void onItemClick(String order);
}

And your constructor should be :

privat clickItemListener clickItemListeners;
public VideoAdapter(ArrayList<Video> data, ArrayList<Video> data2, Activity activity, clickItemListener clickItemListeners) {
    this.mData = data;
    this.mData2 = data2;
    this.mACtivity = activity;
    this.clickItemListeners = clickItemListeners;
}

Then you can pass to Activity :

yourLayout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    clickItemListeners.onItemClick(yourValue);
                }
            });

And implement your interface in your activity like bellow :

public class yourActivity extends AppCompatActivity implements
        YourAdapter.clickItemListener{
   @Override
    public void onItemClick(String order) {
       //You can get your value here
    }
}

Remember that you should pass activity to adapter like bellow :

YourAdapter adapter = new YourAdapter (... , ... , ... , activity.this);
  • i have problem into constructor of YourAdapter adapter = new YourAdapter (... , ... , ... , activity.this);...i pass activity but not clickitemlistener – Sisso Nov 08 '17 at 15:39
  • @Sisso change your activity.this to (clickItemListener)getContext()) – Khaliq Izrail Feb 24 '21 at 09:12