【问题标题】:Passing data with an intent to show in another activity when clicked on recyclerview item单击recyclerview项目时传递数据以显示在另一个活动中
【发布时间】:2019-08-27 04:12:05
【问题描述】:

我有需要在回收站视图上显示的列表(小说列表),我正在为列表中的每个项目实现一个事件侦听器,每个小说列表都包含书籍。单击项目时,我想在单独的活动(DetailActivity)中显示书籍详细信息。

是否应该制作另一个适配器?请帮帮我

我坚持要添加嵌套数组列表,因为我有ItemAdapter,它有一个只接受小说列表且列表不包含任何书籍的构造函数。


    private ArrayList<Pemodelan_Item> dataNovelist() {

        ArrayList<Pemodelan_Item> list = new ArrayList<>();
        list.add(new Pemodelan_Item("Fiersa Besari.", "Bandung", R.drawable.fiersa, R.drawable.bandung_3, R.string.long_desc_andrea));
        list.add(new Pemodelan_Item("Ahmad Fuadi", "Sumatra Barat", R.drawable.ahmad, R.drawable.sumbar_2, R.string.long_desc_andrea));
        list.add(new Pemodelan_Item("Pidi Baiq", "Bandung", R.drawable.pidi, R.drawable.bandung_2, R.string.long_desc_andrea));
        list.add(new Pemodelan_Item("Andrea Hirata", "Belitung", R.drawable.andrea, R.drawable.belitung, R.string.long_desc_andrea));
        list.add(new Pemodelan_Item("Tere Liye", "Makasar", R.drawable.tereliye, R.drawable.makasar, R.string.long_desc_andrea));
        list.add(new Pemodelan_Item("Dee Lestari", "Bandung", R.drawable.dee, R.drawable.bandung, R.string.long_desc_andrea));
        list.add(new Pemodelan_Item("Boy Candra", "Sumatra Barat", R.drawable.boycandra, R.drawable.sumbar, R.string.long_desc_andrea));
        list.add(new Pemodelan_Item("Pramoedya Ananta Toer", "Jakarta", R.drawable.toer, R.drawable.jkt, R.string.long_desc_andrea));
        list.add(new Pemodelan_Item("Erisca Febriani", "Lampung", R.drawable.erisca, R.drawable.lampung, R.string.long_desc_andrea));
        list.add(new Pemodelan_Item("habiburrahman el shirazy", "Semarang", R.drawable.habiburahman, R.drawable.semarang, R.string.long_desc_andrea));
        return list;
    }


package com.example.submission_novelist;


import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ViewHolder> {

    private ArrayList<Pemodelan_Item> novelists;
    private Context mContext;
    private OnItemClickCallback onItemClickCallback;

    public void setOnItemClickCallback(OnItemClickCallback onItemClickCallback){
        this.onItemClickCallback = onItemClickCallback;
    }

    public ItemAdapter(Context context, ArrayList<Pemodelan_Item> novelistss) {
        this.novelists = novelistss;
        mContext = context;
    }


    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_layout, viewGroup, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(final ViewHolder viewHolder, int i) {
        Pemodelan_Item pemodelan_item = novelists.get(i);
        viewHolder.tvNovelist.setText(pemodelan_item.getmNovelist());
        viewHolder.tvAsal.setText(pemodelan_item.getmAsal());
        viewHolder.ivNovelist.setImageResource(pemodelan_item.getmImgNovelist());
        viewHolder.ivCardBack.setImageResource(pemodelan_item.getmImgCardBackground());
        viewHolder.cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                Toast.makeText(viewHolder.cardView.getContext(), "saya" + novelists.get(viewHolder.getAdapterPosition()).getmNovelist(), Toast.LENGTH_SHORT).show();
           onItemClickCallback.onItemClicked(novelists.get(viewHolder.getAdapterPosition()));
            }
        });
    }

    @Override
    public int getItemCount() {
        if (novelists != null) {
            return novelists.size();
        } else {
            return 0;
        }
    }


    public class ViewHolder extends RecyclerView.ViewHolder {
        public View v;
        public TextView tvNovelist;
        public TextView tvAsal;
        public ImageView ivNovelist;
        public ImageView ivCardBack;
        public CardView cardView;

        public ViewHolder(View itemView) {
            super(itemView);
            this.v = itemView;
            tvNovelist = v.findViewById(R.id.novelist_text_view);
            tvAsal = v.findViewById(R.id.asal_text_view);
            ivNovelist = v.findViewById(R.id.novelist_image_view);
            ivCardBack = v.findViewById(R.id.cardViewBackground);
            cardView = v.findViewById(R.id.myCardView);

        }
    }

    public interface OnItemClickCallback{
        void onItemClicked(Pemodelan_Item pemodelan_item);
    }
}

【问题讨论】:

    标签: android-studio arraylist android-recyclerview nested


    【解决方案1】:

    你可以做的就是关注

    1.更改模型类

    Novelist.java

    public class Novelist {
    
       private String writerName;
       private int writerImage;
       private String city;
       private int cityImage;
       private String description;
       private ArrayList<Book> books;
    
       public Novelist(String writerName, int writerImage, String city, int cityImage, String description, ArrayList<Book> books){
    
            this.writerName = writerName;
            this.writerImage = writerImage;
            this.city = city;
            this.cityImage = cityImage;
            this.description = description;
            this.books = books;
       }
       // property setters, getters here    
    }
    

    Book.java

    public class Book{
         private String bookTitle;
         private int bookImage;
         private String description;
         private double price;
    
         public Book(String bookTitle, int bookImage, String description, double price){
              this.bookTitle = bookTitle;
              this.bookImage = bookImage;
              this.description = description;
              this.price = price;
         }
         // property setters, getters here
    }
    

    2。如果您有很多项目,最好在 DetailActivity 中有一个回收器视图(有利于性能),因此您需要另一个适配器类(例如:BookItemAdapter)

    3。通过意图传递书籍

    MainActivity.java

    @Override
    public onItemClickCallback(Novelist novelist){
    
        Intent intent = new Intent(getBaseContext(), DetailActivity.class);
        intent.putExtra("books", novelist.books);
        startActivity(intent);
    }
    

    DetailActivity.java

    private ArrayList<Book> books;
    private BookItemAdapter bookItemAdapter;
    
    @Override
    public void onCreate(Bundle savedInstanceState){
        ...
        books = getIntent("books");
        bookItemAdapter = BookItemAdapter(books)
        ...
    }
    

    改进

    onCreateViewHolder 中设置您的点击监听器作为最佳做法。 (Read here)

    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i){
    
         View view = LayoutInflater.from(viewGroup.getContext());
    
         view.setOnClickListener(new View.OnClickListener(){
    
         @Override
         public void onClick(View v){
             onItemOnClickCallback.onItemClicked(novelists.get(holder.getAdapterPosition()));
         }
      });
    
         ViewHolder holder =  ViewHolder(view);
    }
    

    【讨论】:

    • 谢谢,我会试试的。但是如何制作与小说家对应的书目列表
    • 参见第 3 步,DetailActivity。
    • @RaflyHernandes 如果它解决了您的问题,请接受并支持答案。
    【解决方案2】:

    user158 有一个很好的答案。

    简而言之,是的,您需要创建一个新的图书适配器来处理您从当前 Novelist 项目中获得的图书列表。因此,单击您的项目后,启动您的 DetailsActivity 并使用 Intent 传递书籍列表。然后创建一个新的 Books Recycler 和一个新的 Books Adapter 并传入图书列表。

    希望你能明白!

    【讨论】:

    • 我想给每一本书看一位小说家,前 Andrea hinata 有像 Laskar Pelangi 和 Sang pemimpi 这样的书。当我单击 listItem 时,意图详细说明活动循环视图仅显示与小说家相对应的书
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    相关资源
    最近更新 更多