Recycler View 和 Adapter 打开 Activity 内容不同
Recycler VIew and Adapter open Activity with different content
我正在制作新闻应用。我有 2 个活动。第一个 activity 包含显示不同新闻项目的 RecyclerView。为此,我创建了适配器。这是我的适配器代码:
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);
}
}
}
我的 News.java 代码如下所示
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);
}
}
在我使用 ImageView 和 2 个 TextView 创建 NewsDetails activity 之后。我给了他们身份证。我想要做的是在 NewsActivity 上选择的这个基于 activity 的新闻项目中显示不同的内容。我已经为 TextView 创建了字符串并为 ImageView 创建了导入的图像。我怎样才能做到这一点?提前感谢您的帮助。
在查看 liveAnyway 的回答后,我将其添加到我的 NewsDetails.java。图像更改有效,但文本无效。
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);
}
}
我的 NewsItem.java 文件
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;
}
}
在 startActivity(intent)
之前使用 intent.putExtra()
,如下所示
如果您的 NewsItem 属性很少
@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);
}
如果您的 NewsItem 可以 Parcelable
@Override
public void onClick(View v) {
Intent intent = new Intent(context, NewsDetails.class);
intent.putExtra("newsItem",newsItem);
context.startActivity(intent);
}
在你的 NewsDetailActivity
//in onCreate()
String newTitle = getIntent().getStringExtra("name");
Int newDrawable = getIntent().getIntExtra("image");
//or
NewsItem item = getIntent().getParcelableExtra("newsItem");
更新1
检查点
R.string.id
是 int
所以你应该像下面这样改变
int strId = getIntent().getIntExtra("title");
String title = getString(strId);
- 你这样写
intent.putExtra("title",R.string.newsContent1);
intent.putExtra("image",R.drawable.newsImage1);
这不是个好主意
您的 NewsItem
需要该数据(如 R.string.newsContent1
、R.drawable.newsImage
)并使用来自 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);
更新2
如果你的NewsItem
喜欢这样
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;
}
}
构造NewsItem
的时候就把这个写上去,我想你已经知道了。
//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));
我正在制作新闻应用。我有 2 个活动。第一个 activity 包含显示不同新闻项目的 RecyclerView。为此,我创建了适配器。这是我的适配器代码:
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);
}
}
}
我的 News.java 代码如下所示
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);
}
}
在我使用 ImageView 和 2 个 TextView 创建 NewsDetails activity 之后。我给了他们身份证。我想要做的是在 NewsActivity 上选择的这个基于 activity 的新闻项目中显示不同的内容。我已经为 TextView 创建了字符串并为 ImageView 创建了导入的图像。我怎样才能做到这一点?提前感谢您的帮助。
在查看 liveAnyway 的回答后,我将其添加到我的 NewsDetails.java。图像更改有效,但文本无效。
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);
}
}
我的 NewsItem.java 文件
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;
}
}
在 startActivity(intent)
之前使用 intent.putExtra()
,如下所示
如果您的 NewsItem 属性很少
@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);
}
如果您的 NewsItem 可以 Parcelable
@Override
public void onClick(View v) {
Intent intent = new Intent(context, NewsDetails.class);
intent.putExtra("newsItem",newsItem);
context.startActivity(intent);
}
在你的 NewsDetailActivity
//in onCreate()
String newTitle = getIntent().getStringExtra("name");
Int newDrawable = getIntent().getIntExtra("image");
//or
NewsItem item = getIntent().getParcelableExtra("newsItem");
更新1
检查点
R.string.id
是int
所以你应该像下面这样改变
int strId = getIntent().getIntExtra("title");
String title = getString(strId);
- 你这样写
intent.putExtra("title",R.string.newsContent1);
intent.putExtra("image",R.drawable.newsImage1);
这不是个好主意
您的 NewsItem
需要该数据(如 R.string.newsContent1
、R.drawable.newsImage
)并使用来自 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);
更新2
如果你的NewsItem
喜欢这样
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;
}
}
构造NewsItem
的时候就把这个写上去,我想你已经知道了。
//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));