【问题标题】:Passing ArrayList from RecyclerView into another Activity将 ArrayList 从 RecyclerView 传递到另一个 Activity
【发布时间】:2020-11-04 16:21:19
【问题描述】:

我正在尝试将在 mainactivity.java 中设置的数据传递给另一个活动(infoPage.java),但我似乎无法让它工作。

MainActivity.java

data = new ArrayList<>();
       data.add( new CarData("Toyota Camry 2010 2.4V","Automatic","5 Seater","Petrol/Full","RM 40 /h",R.drawable.camry2010));


       recyclerView= findViewById(R.id.browsedRecycler);
       recyclerView.setLayoutManager(new LinearLayoutManager(this));
       adapter = new Adapter(this,data);
       recyclerView.setAdapter(adapter);

模型类的构造函数

public CarData(String title , String trans, String seats, String fuel, String price, int imgID) {

        this.title = title;
        this.trans = trans;
        this.seats = seats;
        this.fuel = fuel;
        this.price = price;
        this.imgID = imgID;
    }

适配器类

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


    private LayoutInflater layoutInflater;
    private List<CarData> data;

    public Adapter(Context context, List<CarData>data) {
        this.layoutInflater = LayoutInflater.from(context);
        this.data = data;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        View view = layoutInflater.inflate(R.layout.itemlist,viewGroup,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

        //to bind the textview with data received

       String title = data.get(position).getTitle();
       String trans = data.get(position).getTrans();
       String seat = data.get(position).getSeats();
       String fuel = data.get(position).getFuel();
       String price = data.get(position).getPrice();
       int imgid = data.get(position).getImgID();
        holder.texttitle.setText(title);
        holder.trans.setText(trans);
        holder.seats.setText(seat);
        holder.fuel.setText(fuel);
        holder.price.setText(price);
        holder.imageView.setImageResource(imgid);

    }

    @Override
    public int getItemCount() {
        return data.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder{

        TextView texttitle,trans,seats,fuel,price;
        ImageView imageView;
       public ViewHolder(@NonNull View itemView) {
           super(itemView);

           itemView.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View view) {

                   Intent i = new Intent(view.getContext(),infoPage.class);
                   i.putExtra("title", (data.get(getAbsoluteAdapterPosition())));
                   view.getContext().startActivity(i);
               }
           });

           texttitle = itemView.findViewById(R.id.textTitle);
           trans = itemView.findViewById(R.id.carTrans);
           seats = itemView.findViewById(R.id.seats);
           fuel = itemView.findViewById(R.id.fuel);
           price = itemView.findViewById(R.id.price);
           imageView=itemView.findViewById(R.id.itemImage);
       }
   }

我的 infopage.java 基本上什么都没有,只是 textviews 和 imageviews 的声明 infoPage.java

 TextView textView;
    ImageView carimage;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cars_info_page);

        textView=findViewById(R.id.detailText);
        carimage=findViewById(R.id.carsimg);

我自己弄明白了,谢谢大家的帮助!

【问题讨论】:

    标签: java android android-recyclerview adapter


    【解决方案1】:

    为了将 ArrayList 传递给另一个活动,您应该使您的模型类 Parcelable,为此您可以使用 Parcelable 插件,该插件将一些必需的代码添加到您的模型类并使其成为 Parcelable。您可以为这项工作使用不同的插件,但我用于项目的插件是 Michal Charmas 的“Android ParceLable Code Generator”。 您可以从以下路径下载此插件: 文件-> 设置-> 插件 在此之后,您应该使用 putParcelableArrayListExtra() 方法将 arraylist 传递给目标活动。 您可以使用 getIntent().getParcelableArrayExtra() 方法在目标 Activity 中获取 Arraylist,该方法需要一个参数,该参数是您在第一个 Activity 中指定的 String 键

    【讨论】:

    • 好的,谢谢您的回答!但在那之后我该怎么办?如何将传递的数据插入到单独的文本视图和图像视图中?
    • 通过这项工作,您将列表的孔传递给信息活动,如果信息活动必须仅显示单击项目的信息,则无需传递列表的孔,只需传递您需要的项目,而不是使用 putParcelableArrayListExtra 方法,而是使用 putExtra 方法。这个方法有一个重载,它有两个参数,第一个是 String 键,第二个是 Parcelable 对象。
    • 当您在信息活动中拥有模型对象时,您可以轻松使用 getter 方法获取值并在 ImageViews 和 TextViews 中设置它们
    • 对不起,我还有很多东西要学,但是当你提到我需要传递一个字符串键和一个可打包的对象时,你的意思是这样吗? intent.putExtra("key",data.get(getAbsoluteAdapterPosition()));非常感谢您的帮助!
    • 是的,这段代码可以工作,但在此之前确保你的模型类是 Parcelable
    【解决方案2】:

    我刚刚意识到您以错误的方式发送数据。正确的方法是使用 getter 和 setter。 如果你不了解它们,那么你可以看看这个 - https://www.c-sharpcorner.com/article/recyclerview-in-andriod-with-java/

    因此,您需要在已创建构造函数的类(比如说数据类)中进行更改,并在那里使用 getter 和 setter。

    在 Mainactivity 中初始化 Data 类并在 setter 的帮助下设置数据,然后在 Adapter 中初始化 Data 类并在 getter 的帮助下获取数据。

    【讨论】:

    • 我应该在代码中提到或发布我的 getter setter,我深表歉意。现在,我可以将数据传递到我的 recyclerview 中,但是当我单击我的 recyclerview 上的特定项目时,我无法获取这些数据并将其传递到另一个活动中。假设我的 recyclerview 上的第一个项目有“可口可乐,1234,5 美元”,当我点击它时,如何在我的其他活动中为我的其他文本视图设置可口可乐 1234 和 5 美元?感谢您的帮助!
    • 好的!所以我明白你的意思。问题出在您传递的数据中,即 data.get(getAbsoluteAdapterPosition())。我知道这是什么,也许您正在尝试批量发送数据。我建议单独发送数据。就像考虑您的可乐示例一样,发送这样的数据-
    • intent.putExtra("name", name.getText()); intent.putExtra("价格", price.getText()); intent.putExtra("amount", amount.getText());
    猜你喜欢
    • 2020-10-19
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多