首页 > 解决方案 > Android:传递recyclerview上显示的数据并填充另一个活动

问题描述

我想将 recyclerview 收到的数据从 firebase 实时数据库传递给其他活动。因此,当用户单击任何项​​目时,它将打开另一个接收到完整数据的活动(图像、名称、位置、描述)。

注意:我尝试对 firebaseRecyclerAdapter 使用 setonclick 侦听器,但 android studio 没有显示 OnClickListener,那么我想在哪里使用 onclick?

我的主要活动:

@Override
protected void onStart() {
    super.onStart();

    FirebaseRecyclerOptions<HomeWorkView> options = new FirebaseRecyclerOptions.Builder<HomeWorkView>()
            .setQuery(reference, HomeWorkView.class)
            .build();

    FirebaseRecyclerAdapter<HomeWorkView, HomeScreenWorkViewHolder> firebaseRecyclerAdapter =
            new FirebaseRecyclerAdapter<HomeWorkView, HomeScreenWorkViewHolder>(options) {
                @Override
                protected void onBindViewHolder(@NonNull HomeScreenWorkViewHolder viewHolder, int i, @NonNull HomeWorkView homeWorkView) {
                    viewHolder.setdetails(getApplicationContext(), homeWorkView.getName(), homeWorkView.getImage(), homeWorkView.getDescription(), homeWorkView.getLocation());
                }

                @NonNull
                @Override
                public HomeScreenWorkViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.work_item_display_layout, parent,false);
                    HomeScreenWorkViewHolder holder = new HomeScreenWorkViewHolder(view);
                    return holder;
                }
            };
    firebaseRecyclerAdapter.startListening();
    mrecyclerView.setAdapter(firebaseRecyclerAdapter);
}

视图持有者:

public class HomeScreenWorkViewHolder  extends RecyclerView.ViewHolder {
    View view;
    public HomeScreenWorkViewHolder(@NonNull View itemView) {
        super(itemView);

        view = itemView;
    }

    public void setdetails(Context context, String name, String image, String description, String location) {
        TextView mtitletv = view.findViewById(R.id.product_layout_name);
        TextView mdesrcriptiontv = view.findViewById(R.id.product_layout_description);
        TextView mlocationtv = view.findViewById(R.id.product_layout_location);
        ImageView mImagetv = view.findViewById(R.id.product_layout_image);


        mtitletv.setText(name);
        mdesrcriptiontv.setText(description);
        mlocationtv.setText(location);
        Picasso.get().load(image).into(mImagetv);

    }
}

班级:

public class HomeWorkView {

    String Name, Image, Description, Location;

    public HomeWorkView() {

    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public String getImage() {
        return Image;
    }

    public void setImage(String image) {
        Image = image;
    }

    public String getDescription() {
        return Description;
    }

    public void setDescription(String description) {
        Description = description;
    }

    public String getLocation() {
        return Location;
    }

    public void setLocation(String location) {
        Location = location;
    }
}

标签: androidandroid-recyclerview

解决方案


为 firebaseAdapter 创建 onItemClickListener:创建 itemclicked 回调:

public interface OnItemClick{
    void onItemClicked(int position);
}

更改您的 viewHolder:

public class HomeScreenWorkViewHolder  extends RecyclerView.ViewHolder{
   public HomeScreenWorkViewHolder(@NonNull View itemView,OnItemClick callBack) {
    super(itemView);
     view = itemView;
       itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                callBack.onItemClicked(getAdapterPosition());
            }
        });
   }
}

改变开始:

@Override
protected void onStart() {
   super.onStart();
OnItemClick onItemClick = new OnItemClick{
    @Overide
      void onItemClicked( int position ){
        HomeWorkView item = firebaseRecyclerAdapter.getItem(position);
        String name = item.name;
        String description = item.description
        Intent intent =new  Intent(this@HomeActivity, 
         AnotherActivity::class);
        intent.putExtra("name",name);
        intent.putExtra("description",description);
        startActivity(intent);
    }
 }
};

并更改此行:

 HomeScreenWorkViewHolder holder = new HomeScreenWorkViewHolder(view);

HomeScreenWorkViewHolder holder = new HomeScreenWorkViewHolder(view,onItemClick);

您可以使用意图在活动之间传递数据。在您的活动中:

firebaseRecyclerAdapter.setOnItemClickListener(new  OnItemClick{
    @Overide
      void onItemClicked( int position ){
        HomeWorkView item = firebaseRecyclerAdapter.getItem(position);
        String name = item.name;
        String description = item.description
        Intent intent =new  Intent(this@HomeActivity, 
         AnotherActivity::class);
        intent.putExtra("name",name);
        intent.putExtra("description",description);
        startActivity(intent);
    }
})

在 AnotherActivity 的 onCreate 方法中:

String name =  getIntent.getExtras().getString("name");

另一种解决方案,使您的 HomeWorkView 实现 Serializable :

public class HomeWorkView implements Serializable {
}

并将其传递给另一个活动:

firebaseRecyclerAdapter.setOnItemClickListener(new  OnItemClick{
@Overide
  void OnItemClicked( HomeWorkView item ){
    Intent intent =new  Intent(this@HomeActivity, 
     AnotherActivity::class);
    intent.putExtra("homework",item);
    startActivity(intent);
}

}) 然后在AnotherActivity的onCreate方法中:

HomeWorkView data = getIntent().getSerializableExtra("homework");

推荐阅读