点击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:配置页面间数据传递(使用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
相关产品推荐
相关产品推荐

