【问题标题】:Android: pass data shown on recyclerview and populate another acitivtyAndroid:传递recyclerview上显示的数据并填充另一个活动
【发布时间】:2021-10-11 02:47:37
【问题描述】:

我想将 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);
}

ViewHolder:

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;
    }
}

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    为 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 {
    }
    

    并将其传递给AnotherActivity:

    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");
    

    【讨论】:

    • onstart 内部没有用于 firebaseRecyclerAdapter 的 onclicklistener
    • 检查我的编辑
    • 感谢您的努力,它仍然无法正常工作,因为如果我在 irebaseRecyclerAdapter firebaseRecyclerAdapter = new FirebaseRecyclerAdapter(options) { 之后使用 onItemClicked
    • 非常感谢兄弟,我只需要在 Onstart 之前将 onitemclick 声明为全局变量即可访问
    • 那么关于如何将下载的图像从 firebase 传输到另一个活动的任何解决方案?>
    猜你喜欢
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 2017-12-13
    相关资源
    最近更新 更多