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;
}
}
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");
check point
R.string.id
is int
so you should change like belowint strId = getIntent().getIntExtra("title");
String title = getString(strId);
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);
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));