java - 我想从 Firebase 获取产品 ID

标签 java firebase

我正在从 Firebase 检索产品信息,但问题是我无法选择 Firebase 中存储的任何特定 ID。

我尝试了不同的解决方案来解决该问题,包括get(position),但它获取了产品在 RecyclerView 中的位置

这是 ProductsAdapter onBindViewHolder 函数。

使用 * 添加更改

    @Override
    public void onBindViewHolder(@NonNull ProductViewHolder holder, int position) {
        Product productCurrent = mProducts.get(position);
        holder.product_title.setText(toCapitalize(productCurrent.getpTitle()));
        holder.product_pice.setText("$: " + productCurrent.getpPrice());
        Picasso.with(mContext)
                .load(productCurrent.getpImageUrl())
                .placeholder(R.mipmap.ic_launcher)
                .fit()
                .centerCrop()
                .into(holder.product_image);

        holder.parentLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext, ProductPreview.class);
                intent.putExtra("pImageUrl", productCurrent.getpImageUrl());
                intent.putExtra("pTitle", toCapitalize(productCurrent.getpTitle()));
                intent.putExtra("pPrice", productCurrent.getpPrice());
                intent.putExtra("pDescription", toCapitalize(productCurrent.getpDescription()));

                Toast.makeText(mContext, " " + position, Toast.LENGTH_SHORT).show();

                mContext.startActivity(intent);

            }
        });
    }

此代码来自具有RecyclerView的ProductsActivity

    private ProductsAdapter mAdapter;

    private ProgressBar mProgressBar;

    DatabaseReference mDatabaseReference;
    private ArrayList<Product> mProducts;
    ***ArrayList<ProductKeys> mProductKeys;***

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_products);

        mRecyclerView = findViewById(R.id.products_recycler_view);
        mRecyclerView.setHasFixedSize(true);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(getApplicationContext(),2);
        mRecyclerView.setLayoutManager(gridLayoutManager);
        mProgressBar = (ProgressBar) findViewById(R.id.progress_bar);

        mProducts = new ArrayList<>();
        ***mProductKeys = new ArrayList<>();***

        mDatabaseReference = FirebaseDatabase.getInstance().getReference("products");

        mDatabaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot postSnapShot : dataSnapshot.getChildren())
                {
                    Product product = postSnapShot.getValue(Product.class);
                    mProducts.add(product);
                    ***mProductKeys.add(postSnapShot.getKey());***
                }
                mAdapter = new ProductsAdapter(ProductsActivity.this, mProducts);
                mRecyclerView.setAdapter(mAdapter);
                mProgressBar.setVisibility(View.INVISIBLE);

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Toast.makeText(ProductsActivity.this, databaseError.getMessage(), Toast.LENGTH_SHORT).show();
                mProgressBar.setVisibility(View.INVISIBLE);
            }
        });

出现错误:

(com.*)
in ArrayList cannot be applied
to
(java.lang.String)

请帮助我解决这个问题...提前致谢

最佳答案

如果您尝试在 onBindViewHolder 方法中确定 position 处项目的 Firebase 数据库 ID,则必须自行维护该映射。您可以通过从 onDataChange 中的快照中提取 getKey()getValue() 并保留两者的列表来轻松完成此操作其中。

类似这样的事情:

mProductKeys = new ArrayList<String>();

mDatabaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot postSnapShot : dataSnapshot.getChildren())
        {
            Product product = postSnapShot.getValue(Product.class);
            mProducts.add(product);
            mProductKeys.add(postSnapShot.getKey());
        }
        mAdapter = new ProductsAdapter(ProductsActivity.this, mProducts);
        mRecyclerView.setAdapter(mAdapter);
        mProgressBar.setVisibility(View.INVISIBLE);
    }

然后在 onBindViewHolder 中,您可以查找在 mProductKeys 中单击的项目的键。

关于java - 我想从 Firebase 获取产品 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57084525/

相关文章:

java - setVelocity引擎无法应用于org.springframework.ui.velocity.VelocityEngineFactoryBean

android - 我在用户注册时发送推送通知,它只向注册用户发送通知,我可以将其更改为每个使用该应用程序的人吗?

javascript - Firebase 如何链接用电话号码创建的帐户

java - 多模块JavaFX maven项目打包问题

java - 在编译时使用 Java 7 u21,在运行时使用 Java 7 u13

java - 如何从java中的列表中获取Jsonobject?

java - 如何使用 Spring JDBC 模板查询查询 Double

java - 我总是收到此错误 "unknow param 0x00008824 glUtilsParamSize: unknow param 0x0000882"

python - 有适用于 python 的 Firebase SDK 吗?

ios - "Copy this file to your authentication server"- Firebase 自定义身份验证