安卓开发:RecyclerView跳转详情Activity传值文本不显示如何解决
问题原因分析
- 参数类型不匹配:你在
NewsAdapter的点击事件中给title传递的R.string.newsContent1是int类型的字符串资源ID,但NewsDetails中使用getStringExtra()接收,类型不匹配无法获取到正确的值,这是文本不显示的核心原因。 - 传递参数硬编码:所有条目点击事件都固定传了同一个
R.string.newsContent1和R.drawable.newsImage1,即使类型匹配也无法实现不同条目展示不同内容的需求。 - 实体类字段缺失:当前
NewsItem只有新闻标题、封面图两个字段,没有存储对应新闻内容资源ID的字段,无法关联不同条目的详情内容。
修复步骤
1. 扩展NewsItem实体类
添加新闻内容资源ID字段及对应get/set方法:
public class NewsItem { String newsName; Integer newsImage; // 新增字段:存储该条新闻内容对应的字符串资源ID Integer newsContentRes; public NewsItem(String newsName, Integer newsImage, Integer newsContentRes) { this.newsName = newsName; this.newsImage = newsImage; this.newsContentRes = newsContentRes; } 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 getNewsContentRes() { return newsContentRes; } public void setNewsContentRes(Integer newsContentRes) { this.newsContentRes = newsContentRes; } }
2. 修改新闻列表页初始化逻辑
创建条目时传入每个新闻对应的内容资源ID:
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<>(); // 依次传入每个新闻的标题、封面图、内容资源ID newsItems.add(new NewsItem("新闻标题1", R.drawable.im_maincorpus1, R.string.newsContent1)); newsItems.add(new NewsItem("新闻标题2", R.drawable.im_maincorpus2, R.string.newsContent2)); newsItems.add(new NewsItem("新闻标题3", R.drawable.im_maincorpus3, R.string.newsContent3)); newsItems.add(new NewsItem("新闻标题4", R.drawable.im_maincorpus4, R.string.newsContent4)); 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); } }
3. 调整NewsAdapter点击事件逻辑
传递当前点击条目对应的动态参数,替换硬编码固定值:
@Override public void onBindViewHolder(NewsViewHolder holder, int position) { NewsItem currentNews = newsItemList.get(position); holder.newsImage.setImageResource(currentNews.getNewsImage()); holder.newsName.setText(currentNews.getNewsName()); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(context, NewsDetails.class); // 传递当前点击条目的标题、内容资源ID、封面图资源ID intent.putExtra("title", currentNews.getNewsName()); intent.putExtra("contentRes", currentNews.getNewsContentRes()); intent.putExtra("image", currentNews.getNewsImage()); context.startActivity(intent); } }); }
4. 修改NewsDetails接收逻辑
正确解析资源ID后赋值给对应控件:
public class NewsDetails extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_news_details); // 接收传递的参数 String newsTitle = getIntent().getStringExtra("title"); int contentRes = getIntent().getIntExtra("contentRes", 0); int imageRes = getIntent().getIntExtra("image", 0); // 绑定控件 TextView titleTv = findViewById(R.id.你的详情页标题控件ID); TextView contentTv = findViewById(R.id.newsDetailsContent); ImageView imageView = findViewById(R.id.newsDetailsImage); // 赋值:字符串资源ID需要通过getString()转成文本再设置 titleTv.setText(newsTitle); contentTv.setText(getString(contentRes)); imageView.setImageResource(imageRes); } }
内容的提问来源于stack exchange,提问作者Akzhan
相关产品推荐
相关产品推荐

