Search code examples
javaandroidandroid-recyclerviewonclicklistenerandroid-adapter

RecyclerView and onclicklistner operation


I'm fetching RSS feed into my APP and trying to open an intent(Web browser) when a one of the news of recyclerView is clicked, but it dosn't work. and that's my code:

public class MainActivity extends AppCompatActivity {
    RecyclerView recyclerView;
    ArrayList<FeedItem> feedItems;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
        //Call Read rss asyntask to fetch rss
        ReadRss readRss = new ReadRss(this, recyclerView);
        readRss.execute();

        recyclerView.setOnClickListener(new AdapterView.OnItemClickListener(){
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id){
                **FeedItem current=feedItems.get(position);
                Uri uri = Uri.parse(current.getLink());
                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                startActivity(intent);**
            }
        });
    }
}

I did even try to put the same code in my holder class but in there the startActivity() method don't work: the above code is kinda the same but in another class:

public class FeedsAdapter extends RecyclerView.Adapter<FeedsAdapter.MyViewHolder> implements View.OnClickListener {

    ArrayList<FeedItem> feedItems;
    Context context;
    public FeedsAdapter(Context context, ArrayList<FeedItem>feedItems){
        this.feedItems=feedItems;
        this.context=context;
    }
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(context).inflate(R.layout.custum_row_news_item,parent,false);
        view.setClickable(true);
        view.setOnClickListener(this);
        MyViewHolder holder=new MyViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        YoYo.with(Techniques.FadeIn).playOn(holder.cardView);
        FeedItem current=feedItems.get(position);
        holder.Title.setText(current.getTitle());
        holder.Description.setText(current.getDescription());
        holder.Date.setText(current.getPubDate());
        Picasso.get().load(current.getThumbnailUrl()).into(holder.Thumbnail);
        holder.cardView.setTag(position);
        Toast.makeText(context,current.getLink() ,Toast.LENGTH_SHORT).show();

    }

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

    @Override
    public void onClick(View view) {
        **int position = (int) view.getTag();
        FeedItem current=feedItems.get(position);
        Toast.makeText(context,"The Item Clicked is: "+current.getLink() ,Toast.LENGTH_SHORT).show();
        Uri uri = Uri.parse(current.getLink());
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        startActivity(intent);**
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        TextView Title,Description,Date;
        ImageView Thumbnail;
        CardView cardView;
        public MyViewHolder(View itemView) {
            super(itemView);
            Title= (TextView) itemView.findViewById(R.id.title_text);
            Description= (TextView) itemView.findViewById(R.id.description_text);
            Date= (TextView) itemView.findViewById(R.id.date_text);
            Thumbnail= (ImageView) itemView.findViewById(R.id.thumb_img);
            cardView= (CardView) itemView.findViewById(R.id.cardview);
        }
    }
}

this code:

FeedItem current=feedItems.get(position);
                    Uri uri = Uri.parse(current.getLink());
                    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                    startActivity(intent);

is the same code that I tried in two classes in the first the error is because of RecyclerView, And in the second one it gives error because startActivity don't work in that class. So how do I activate the clicakble news that when clicked goes to the browser?


Solution

  • To start activity from within the adapter class use

         context.startActivity(intent); 
    

    ( if thats your question.)

    My suggestion

    Set the click listener in onBindViewHolder(..) of your adapter on holder.itemView.setOnClick....