Search code examples
javaandroidandroid-studioandroid-recyclerviewadapter

Recycler VIew and Adapter open Activity with different content


I'm making news app. I have 2 activities. First activity contains RecyclerView that show's different news item's. For this purpose i created adapter. Here is my adapter code:

public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.NewsViewHolder> {

    Context context;
    List<NewsItem> newsItemList;

    public NewsAdapter(Context context, List<NewsItem> newsItemList) {
        this.context = context;
        this.newsItemList = newsItemList;
    }
    @NonNull
    @Override
    public NewsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.news_row_item, parent, false);
        return new NewsViewHolder(view);
    }
    @Override
    public void onBindViewHolder(NewsViewHolder holder, int position) {
        holder.newsImage.setImageResource(newsItemList.get(position).getNewsImage());
        holder.newsName.setText(newsItemList.get(position).getNewsName());

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(context, NewsDetails.class);
                intent.putExtra("title",R.string.newsContent1);
                intent.putExtra("image",R.drawable.newsImage1);
                context.startActivity(intent);
            }
        });
    }
    @Override
    public int getItemCount() {
        return newsItemList.size();
    }
    public static final class NewsViewHolder extends RecyclerView.ViewHolder {
        ImageView newsImage;
        TextView newsName;

        public NewsViewHolder(@NonNull View itemView) {
            super(itemView);

            newsImage = itemView.findViewById(R.id.newsImage);
            newsName = itemView.findViewById(R.id.newsName);
        }
    }
}

My News.java code look like this

public class news extends AppCompatActivity {

    RecyclerView newsRecycler;
    NewsAdapter newsAdapter;

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

        List<NewsItem> newsItems = new ArrayList<>();
        newsItems.add(new NewsItem("Text", R.drawable.im_maincorpus1));
        newsItems.add(new NewsItem("Text", R.drawable.im_maincorpus1));
        newsItems.add(new NewsItem("Text", R.drawable.im_maincorpus1));
        newsItems.add(new NewsItem("Text", R.drawable.im_maincorpus1));

        setNewsRecycler(newsItems);*/
    }
        private void setNewsRecycler(List<NewsItem> newsItemsList){
        newsRecycler = findViewById(R.id.newsRecycler);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this, RecyclerView.VERTICAL, false);
        newsRecycler.setLayoutManager(layoutManager);

        newsAdapter = new NewsAdapter(this, newsItemsList);
        newsRecycler.setAdapter(newsAdapter);
    }
}

After I created a NewsDetails activity with ImageView and 2 TextView. I gave them IDs. And what I want to do is display different content in this activity based news item selected on NewsActivity. I've already created strings for the TextView and imported images for the ImageView. How can I achieve this? Thanks for the help in advance.

After reviewing liveAnyway's answer i added this to my NewsDetails.java. Image change worked, but text didn't.

public class NewsDetails extends AppCompatActivity {

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

        String newTitle = getIntent().getStringExtra("title");
        int newImage = getIntent().getIntExtra("image", 0);

        TextView newsText = (TextView) findViewById(R.id.newsDetailsContent);
        ImageView newsImage = (ImageView) findViewById(R.id.newsDetailsImage);

        newsText.setText(newTitle);
        newsImage.setImageResource(newImage);
    }
}

My NewsItem.java file

public class NewsItem {

    String newsName;
    Integer newsImage;

    public NewsItem(String newsName, Integer newsImage) {
        this.newsName = newsName;
        this.newsImage = newsImage;
    }

    public String getNewsName() {
        return newsName;
    }

    public void setNewsName(String newsName) {
        this.newsName = newsName;
    }

    public Integer getNewsImage() {
        return newsImage;
    }

    public void setNewsImage(Integer newsImage) {
        this.newsImage = newsImage;
    }
}

Solution

  • Use intent.putExtra() before startActivity(intent) like below

    If your NewsItem has few properties

    
    @Override
    public void onClick(View v) {
       //image from newsItemList.get(position).getNewsImage()
       //name from newsItemList.get(position).getNewsName()
       Intent intent = new Intent(context, NewsDetails.class);
       //it just example, You can just put any data what you need
       intent.putExtra("name",name);
       intent.putExtra("image",image);
       ...
       context.startActivity(intent);
    }
    

    If your NewsItem can be Parcelable

    @Override
    public void onClick(View v) {
       Intent intent = new Intent(context, NewsDetails.class);
       intent.putExtra("newsItem",newsItem);
       
       context.startActivity(intent);
    }
    

    and in your NewsDetailActivity

    //in onCreate()
    String newTitle = getIntent().getStringExtra("name");
    Int newDrawable = getIntent().getIntExtra("image"); 
    //or
    NewsItem item = getIntent().getParcelableExtra("newsItem");
    
    

    update1

    check point

    1. R.string.id is int so you should change like below
    int strId = getIntent().getIntExtra("title");
    String title = getString(strId);
    
    1. you put like this
    intent.putExtra("title",R.string.newsContent1);
    intent.putExtra("image",R.drawable.newsImage1);
    

    It's not good idea

    Your NewsItem need to have that data(like R.string.newsContent1,R.drawable.newsImage) and use this from newsItemList.get(position)

    //for example
    int newsContentsStrId =  newsItemList.get(position).getNewsContentsStrId();
    int newsImageResId = newsItemList.get(position).getNewsImageResId();
    intent.putExtra("title",newsContentsStrId);
    intent.putExtra("image",newsImageResId);
    

    update2

    if your NewsItem like this

    public class NewsItem {
        String newsName;
        Integer newsImage;
        //added more that you need (it just example)
        Integer newsContentsStrId;
        
        public NewsItem(String newsName, Integer newsImage, Integer newsContentsStrId) {
            this.newsName = newsName;
            this.newsImage = newsImage;
            this.newsContentsStrId = newsContentsStrId;
        }
    
        public String getNewsName() {
            return newsName;
        }
    
        public void setNewsName(String newsName) {
            this.newsName = newsName;
        }
    
        public Integer getNewsImage() {
            return newsImage;
        }
    
        public void setNewsImage(Integer newsImage) {
            this.newsImage = newsImage;
        }
    
        public Integer getNewsContentsStrId() {
            return newsContentsStrId;
        }
    
        public void setNewsContentsStrId(Integer newsContentsStrId) {
            this.newsContentsStrId = newsContentsStrId;
        }
    }
    

    just put this when you construct NewsItem, I think you already know.

    //in news onCreate()
    List<NewsItem> newsItems = new ArrayList<>();
    newsItems.add(new NewsItem("Text", R.drawable.im_maincorpus1,R.string.newArtical1));
    newsItems.add(new NewsItem("Text", R.drawable.im_maincorpus1,R.string.newArtical2));
    newsItems.add(new NewsItem("Text", R.drawable.im_maincorpus1,R.string.newArtical3));
    newsItems.add(new NewsItem("Text", R.drawable.im_maincorpus1,R.string.newArtical4));