Recycler VIew 和 Adapter 打开内容不同的Activity

Posted

技术标签:

【中文标题】Recycler VIew 和 Adapter 打开内容不同的Activity【英文标题】:Recycler VIew and Adapter open Activity with different content 【发布时间】:2021-08-05 03:33:52 【问题描述】:

我正在制作新闻应用程序。我有 2 个活动。第一个活动包含显示不同新闻项目的 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 活动之后。我给了他们身份证。我想要做的是在 NewsActivity 上选择的这个基于活动的新闻项目中显示不同的内容。我已经为 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;
    

【问题讨论】:

我尝试使用“文本”添加文本 - 这很有效。但是“R.string.newsArticle1”没有。任何想法如何使它工作? 【参考方案1】:

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.idint 所以你应该像下面这样改变
int strId = getIntent().getIntExtra("title");
String title = getString(strId);
    你这样放
intent.putExtra("title",R.string.newsContent1);
intent.putExtra("image",R.drawable.newsImage1);

这不是个好主意

您的NewsItem 需要拥有该数据(例如R.string.newsContent1R.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));

【讨论】:

"your_title" 怎么办呢?我在字符串文件中有 newsArticle1。我应该放“R.string.newsArticle1”吗?而且我不需要写 ImageView 或 TextView 的 ID 以便传递的内容显示在其中吗? (首先对不起我的英语不好)是的,如果NewsDetailActivity 仅显示选定的新闻,您可以将您的R.string.id 放入putExtra() 并将视图的ID 放入NewsDetailActivity 可以修复。我编辑了onClick() 我输入了你的代码,但什么也没发生。我还需要做什么吗? 你能更新你的代码吗?你变了?并显示NewsDetails? 检查我的更新答案。并更改与您的意图相匹配的 putExtra 键以便更好地理解。

以上是关于Recycler VIew 和 Adapter 打开内容不同的Activity的主要内容,如果未能解决你的问题,请参考以下文章

onClickListener 在 Recycler Adapter 类中不起作用

访问 Recycler´s Adapter 中的 ViewModel

在 FireStore Ui Recycler Paging Adapter 中使用 Paging 3 时出错:PagingConfig 无法转换为 Config

android控件recyclerview清空问题

Recycler View 和 DialogFragment 苦苦挣扎(Kotlin)

Recycler View 没有更新和显示任何内容