1

Got the solution thanks to thomaspsk

So I am parsing link urls from online database and displaying it in recycler view. I also want to send those urls through Intent's putExtra() method

I tried it using

Bundle bundle = intent.putExtra("image_link",my_data.getImage_link());

but it is not working

here is a full adapter code.
Please also check if I am using click listener on the right position.
I saw some people using it under ViewHolder.

import android.content.Intent;

import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.content.Context;
import android.widget.ImageView;
import android.widget.TextView;
import android.view.LayoutInflater;

import java.util.List;

import com.bumptech.glide.Glide;

import android.view.View;
import android.view.ViewGroup;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private Context context;
    private List<MyData> my_data;

    public MyAdapter(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.recycler_child, parent, false);

        final ViewHolder holder = new ViewHolder(itemView);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = holder.getAdapterPosition();
                Intent intent = new Intent(context, article.class);
                Bundle bundle = intent.putExtra("image_link", my_data.getImage_link());
                context.startActivity(intent);
            }
        });

        return new ViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.description.setText(my_data.get(position).getDescription());
        Glide.with(context).load(my_data.get(position).getImage_link()).into(holder.imageView);
    }

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


    public class ViewHolder extends RecyclerView.ViewHolder {

        public TextView description;
        public ImageView imageView;

        public ViewHolder(View itemView) {
            super(itemView);
            description = (TextView) itemView.findViewById(R.id.textView);
            imageView = (ImageView) itemView.findViewById(R.id.image);
        }
    }
}
Community
  • 1
  • 1
Nawaz
  • 63
  • 1
  • 2
  • 9

3 Answers3

0

To send the data using Bundle simple do the following :

Intent intent = new Intent(context,article.class);
Bundle bundle = new Bundle();
bundle.putString("IMAGE_LINK", my_data.getImage_link());
intent.putExtras(bundle); // or intent.putExtra("BUNDLE",bundle); and reveive there : Bundle b = getBundleExtra("BUNDLE");
context.startActivity(intent);

To retrieve the data in other activity you can follow :

Bundle bundle = getIntent().getExtras();
String imageLink = bundle.getString("IMAGE_LINK");
Amit Upadhyay
  • 7,179
  • 4
  • 43
  • 57
0

first you need to get the item from your list with get method and than URL from that item.

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_child,parent,false);

    final ViewHolder holder = new ViewHolder(itemView);
    itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int position = holder.getAdapterPosition();
            Intent intent = new Intent(context,article.class);
            intent.putExtra("image_link",my_data.get(position).getImage_link());
            context.startActivity(intent);

        }
    });

    return new ViewHolder(itemView);
}
farhan patel
  • 1,490
  • 2
  • 19
  • 30
0

code line private Context context; in your MyAdapter most likely not an Activity context.

You need to pass the Activity when creating MyAdapter with something like:

MyAdapter myAdapter = new MyAdapter(callerActivity, my_data);

But this susceptible to context leaks.


A better way is using a Listener which direct the onClick() to your Activity or Fragment.

First, create the listener in your Adapter:

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

  private List<MyData> my_data;

  public MyAdapter(List<MyData> my_data) {
    // this.context = context; // You don't need to use context here anymore.
    this.my_data = my_data;
  }

  ...

  // Define listener member variable
  private static OnItemClickListener mListener;

  // Define the listener interface
  public interface OnItemClickListener {
    void onItemClick(int position);
  }

  // Define the method that allows the parent activity or fragment to define the listener
  public void setOnItemClickListener(OnItemClickListener listener) {
    this.mListener = listener;
  }
  ...
}

Second, call the listener in your MyAdapter onCreateViewHolder() when item clicked:

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_child,parent,false);
  final ViewHolder holder = new ViewHolder(itemView);
  itemView.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
       onItemClick(holder.getAdapterPosition());
     }
   });

   return new ViewHolder(itemView);
}

Last, you need to implement MyAdapter.OnItemClickListener in your Activity or Fragment which use the adapter. Something like:

public class YourActivity extends Activity
    implements MyAdapter.OnItemClickListener {

   ...

  @Override 
  public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    // you need to add this after creating the adapter.
    // this only for example.
    MyAdapter myAdapter = new MyAdapter(my_data); // Don't use a context here anymore.
    myAdapter.setOnItemClickListener(this); // Set listener to parent.
  }

  // method implemented from MyAdapter.OnItemClickListener
  @Override 
  public void onItemClick(int position) {
    // Call the intent here
    Intent intent = new Intent(this, article.class);
    Bundle bundle = intent.putExtra("image_link",my_data.get(position).getImage_link());
    this.startActivity(intent);  
  }

  ...
}
ישו אוהב אותך
  • 28,609
  • 11
  • 78
  • 96
  • If I use OnClick listener on activity/adapter the getActivity position is not working If I use it on itemView with intent intent.putExtra("image_link",my_data.get(position).getImage_link()); – Nawaz Oct 23 '16 at 05:01
  • then the app is crashing if I click on any card – Nawaz Oct 23 '16 at 05:02
  • I forgot to change `my_data.getImage_link()` to `my_data.get(position).getImage_link()` in `onItemClick(int position)` method. – ישו אוהב אותך Oct 23 '16 at 05:37
  • But my activity is like public class MyAdapter extends RecyclerView.Adapter { – Nawaz Oct 24 '16 at 18:18
  • But my activity is like public class MyAdapter extends RecyclerView.Adapter { I can't implement click listener on RecyclerView.Adapter – Nawaz Oct 24 '16 at 18:20
  • you don't implement it, but create the interface for it. Implementation need to be done in Activity/Fragment which using the adapter. – ישו אוהב אותך Oct 25 '16 at 02:04