You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击RecyclerView中Firebase图片加载至指定ImageView并存储至DB的实现方案

问题描述

已实现功能:点击ID为topImages的ImageView时,启动包含商品RecyclerView的页面。
需求:点击RecyclerView中的商品图片后,将该图片加载到topImages,并将图片信息保存至数据库。请问如何实现获取并处理该图片?

现有代码

商品适配器代码

@NonNull
@Override
public HolderProductCody onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
   //inflate layout
    View view = LayoutInflater.from(context).inflate(R.layout.row_product_seller,parent,false);
   return new HolderProductCody(view);
}

@Override
public void onBindViewHolder(@NonNull HolderProductCody holder, int position) {
    //get data
    final ModelProduct modelProduct = productList.get(position);
    String id = modelProduct.getProductId();
    String uid = modelProduct.getUid();

    String detailAvailable = modelProduct.getDetailAvailable();
    String productColor = modelProduct.getProductColor();
    String productTpo = modelProduct.getProductTpo();

    String productDescription = modelProduct.getProductDescription();
    String productCategory = modelProduct.getProductCategory();
    String icon = modelProduct.getProductIcon();
    String SeasonCategory = modelProduct.getProductSeasonCategory();
    String productSeasonCategory = modelProduct.getProductSeasonCategory();
    String title = modelProduct.getProductTitle();
    String timestamp = modelProduct.getTimestamp();
    String originalPrice = modelProduct.getOriginalPrice();

    //set data
    holder.titleTv.setText(title);
    holder.SeasonCategoryTv.setText(SeasonCategory);
    holder.tpoTv.setText(productTpo);
    holder.colorTv.setText(productColor);
    holder.originalPriceTv.setText("$"+originalPrice);

    if(detailAvailable.equals("true")){
        //product is on discount
        holder.tpoTv.setVisibility(View.VISIBLE);
        holder.colorTv.setVisibility(View.VISIBLE);

    }
    else{
        //product is not on discount
        holder.tpoTv.setVisibility(View.GONE);
        holder.colorTv.setVisibility(View.GONE);
    }
    try{
        Picasso.get().load(icon).placeholder(R.drawable.ic_tshirt_black).into(holder.productIconIv);
    }
    catch(Exception e){
        holder.productIconIv.setImageResource(R.drawable.ic_tshirt_black);
    }

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //handle item clicks, show item details
            Toast.makeText(context, "클릭됨", Toast.LENGTH_SHORT).show();
            //addcodylayout(modelProduct);
        }
    });


}

private void addcodylayout(ModelProduct modelProduct) {
    Dialog dialog = new Dialog(context);
    View view = LayoutInflater.from(context).inflate(R.layout.activity_cody_product,null);
    dialog.setContentView(view);
    dialog.show();

    //get data
    final String id = modelProduct.getProductId();
    String uid = modelProduct.getUid();
    String detailAvailable = modelProduct.getDetailAvailable();
    String productTpo = modelProduct.getProductTpo();
    String productColor = modelProduct.getProductColor();
    String productDescription = modelProduct.getProductDescription();
    String productCategory = modelProduct.getProductCategory();
    String icon = modelProduct.getProductIcon();
    String productSeasonCategory = modelProduct.getProductSeasonCategory();
    final String title = modelProduct.getProductTitle();
    String timestamp = modelProduct.getTimestamp();
    String originalPrice = modelProduct.getOriginalPrice();

    try{
        Picasso.get().load(icon).placeholder(R.drawable.ic_tshirt_black).into(productIconIv);
    }
    catch(Exception e){
        productIconIv.setImageResource(R.drawable.ic_tshirt_black);
    }
    dialog.show();


}


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

@Override
public Filter getFilter() {
   if(filter==null){
       filter = new FilterProduct(this,filterList);
   }
    return filter;
}

class HolderProductCody extends RecyclerView.ViewHolder{
    /*holds views of recyclerview*/


    private ImageView productIconIv;
    private TextView tpoTv, titleTv, SeasonCategoryTv,colorTv,originalPriceTv;

    public HolderProductCody(@NonNull View itemView) {
        super(itemView);


        productIconIv = itemView.findViewById(R.id.productIconIv);
        tpoTv = itemView.findViewById(R.id.tpoTv);
        titleTv = itemView.findViewById(R.id.titleTv);
        SeasonCategoryTv = itemView.findViewById(R.id.categorySeasonTv);
        colorTv = itemView.findViewById(R.id.colorTv);
        originalPriceTv = itemView.findViewById(R.id.originalPriceTv);
    }
}

商品页面代码

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_cody_product);
    filterProductBtn = findViewById(R.id.filterProductBtn);
    productsRv = findViewById(R.id.productsRv);
    filteredProductsTv = findViewById(R.id.filteredProductsTv);

    getSupportActionBar().hide();
    firebaseAuth = FirebaseAuth.getInstance();



    filterProductBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            AlertDialog.Builder builder = new AlertDialog.Builder(CodyProductActivity.this);
            builder.setTitle("카테고리 선택").setItems(Constants.productCategories1, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    //get selected item
                    String selected = Constants.productCategories1[which];
                    filteredProductsTv.setText(selected);
                    if (selected.equals("모든 옷")) {
                        //load all
                        loadAllProducts();
                    } else {
                        //load filtered
                        loadFilteredProducts(selected);
                    }
                }
            }).show();
        }
    });
}

private void loadFilteredProducts(String selected) {
    productList = new ArrayList<>();

    //get all products
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users");
    reference.child(firebaseAuth.getUid()).child("Products").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            //before getting reset List
            productList.clear();
            for(DataSnapshot ds: dataSnapshot.getChildren()){
                String productCategory = ""+ds.child("productCategory").getValue();
                //if selected category matches product category then add in list
                if(selected.equals(productCategory)){
                    ModelProduct modelProduct = ds.getValue(ModelProduct.class);
                    productList.add(modelProduct);
                }


            }
            //setup adapter
            adapterProductCody = new AdapterProductCody(CodyProductActivity.this,productList);
            //set adapter
            GridLayoutManager layoutManager = new GridLayoutManager(CodyProductActivity.this,3);
            productsRv.setLayoutManager(layoutManager);
            productsRv.setAdapter(adapterProductCody);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseerror) {

        }
    });

}

private void loadAllProducts() {
    productList = new ArrayList<>();

    //get all products
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users");
    reference.child(firebaseAuth.getUid()).child("Products").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            //before getting reset List
            productList.clear();
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                ModelProduct modelProduct = ds.getValue(ModelProduct.class);
                productList.add(modelProduct);
            }
            //setup adapter
            adapterProductCody = new AdapterProductCody(CodyProductActivity.this, productList);
            //set adapter
            GridLayoutManager layoutManager = new GridLayoutManager(CodyProductActivity.this, 3);
            productsRv.setLayoutManager(layoutManager);
            productsRv.setAdapter(adapterProductCody);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {

        }
    });
}

界面截图

界面截图1
界面截图2
界面截图3


解决方案

步骤1:配置页面间数据传递(使用Activity Result API)

在包含topImages的原页面中,注册Activity Result回调,接收商品页面返回的选中商品数据:

// 原页面示例(如MainActivity)
private ActivityResultLauncher<Intent> productLauncher;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ImageView topImages = findViewById(R.id.topImages);

    // 注册回调接收返回数据
    productLauncher = registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        result -> {
            if (result.getResultCode() == RESULT_OK && result.getData() != null) {
                ModelProduct selectedProduct = result.getData().getParcelableExtra("SELECTED_PRODUCT");
                if (selectedProduct != null) {
                    // 加载图片到topImages
                    try {
                        Picasso.get().load(selectedProduct.getProductIcon())
                            .placeholder(R.drawable.ic_tshirt_black)
                            .into(topImages);
                    } catch (Exception e) {
                        topImages.setImageResource(R.drawable.ic_tshirt_black);
                    }
                    // 保存商品信息到数据库
                    saveProductToDatabase(selectedProduct);
                }
            }
        }
    );

    // 点击topImages启动商品页面
    topImages.setOnClickListener(v -> {
        Intent intent = new Intent(MainActivity.this, CodyProductActivity.class);
        productLauncher.launch(intent);
    });
}

步骤2:修改商品适配器点击事件,返回选中商品

在商品适配器的onBindViewHolder中,修改item点击逻辑,将选中的商品数据返回原页面:

// 商品适配器中
holder.itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent resultIntent = new Intent();
        resultIntent.putExtra("SELECTED_PRODUCT", modelProduct);
        // ModelProduct必须实现Parcelable接口才能传递
        ((Activity)context).setResult(Activity.RESULT_OK, resultIntent);
        ((Activity)context).finish();
    }
});

关键要求:ModelProduct类需实现Parcelable接口,示例实现:

public class ModelProduct implements Parcelable {
    // 原有字段:productId、uid、productIcon等
    private String productId;
    private String uid;
    private String productIcon;
    // 其他字段省略

    // 构造方法、getter/setter省略

    // Parcelable实现
    protected ModelProduct(Parcel in) {
        productId = in.readString();
        uid = in.readString();
        productIcon = in.readString();
        // 读取其余字段
    }

    public static final Creator<ModelProduct> CREATOR = new Creator<ModelProduct>() {
        @Override
        public ModelProduct createFromParcel(Parcel in) {
            return new ModelProduct(in);
        }

        @Override
        public ModelProduct[] newArray(int size) {
            return new ModelProduct[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(productId);
        dest.writeString(uid);
        dest.writeString(productIcon);
        // 写入其余字段
    }
}

步骤3:实现数据库保存逻辑

在原页面添加方法,将选中商品信息保存到Firebase数据库:

private void saveProductToDatabase(ModelProduct product) {
    FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
    if (firebaseAuth.getCurrentUser() == null) return;

    DatabaseReference reference = FirebaseDatabase.getInstance()
        .getReference("Users")
        .child(firebaseAuth.getUid())
        .child("SelectedProducts"); // 自定义保存路径

    // 用商品ID作为键,避免重复存储
    reference.child(product.getProductId()).setValue(product)
        .addOnSuccessListener(aVoid -> Toast.makeText(this, "商品信息已保存", Toast.LENGTH_SHORT).show())
        .addOnFailureListener(e -> Toast.makeText(this, "保存失败:" + e.getMessage(), Toast.LENGTH_SHORT).show());
}

步骤4:可选优化(添加确认弹窗)

如果需要用户确认后再返回数据,可保留适配器中的弹窗逻辑,添加确认按钮:

private void addcodylayout(ModelProduct modelProduct) {
    Dialog dialog = new Dialog(context);
    View view = LayoutInflater.from(context).inflate(R.layout.dialog_product_confirm,null);
    dialog.setContentView(view);
    dialog.show();

    ImageView productIconIv = view.findViewById(R.id.productIconIv);
    Button confirmBtn = view.findViewById(R.id.confirmBtn);

    // 加载图片到弹窗
    try{
        Picasso.get().load(modelProduct.getProductIcon())
            .placeholder(R.drawable.ic_tshirt_black)
            .into(productIconIv);
    }
    catch(Exception e){
        productIconIv.setImageResource(R.drawable.ic_tshirt_black);
    }

    // 确认按钮点击事件
    confirmBtn.setOnClickListener(v -> {
        Intent resultIntent = new Intent();
        resultIntent.putExtra("SELECTED_PRODUCT", modelProduct);
        ((Activity)context).setResult(Activity.RESULT_OK, resultIntent);
        ((Activity)context).finish();
        dialog.dismiss();
    });
}

内容的提问来源于stack exchange,提问作者kmskms

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 23:25:24