मैं फ़ायरबेस से उत्पाद जानकारी पुनर्प्राप्त कर रहा हूं, लेकिन समस्या यह है कि मैं किसी भी विशिष्ट आईडी का चयन नहीं कर सकता जो फ़ायरबेस में संग्रहीत है।

मैंने get(position) सहित समस्या के लिए विभिन्न समाधानों की कोशिश की, लेकिन यह RecyclerView में उत्पाद की स्थिति प्राप्त कर रहा है

यह उत्पाद एडेप्टर onBindViewHolder कार्य करता है।

*'s . का उपयोग करके परिवर्तन जोड़े जाते हैं

    @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 वाली ProductActivity की ओर से है

    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)

कृपया इसमें से मेरी मदद करें... अग्रिम धन्यवाद

0
usama zubair 18 जुलाई 2019, 00:56

2 जवाब

सबसे बढ़िया उत्तर

यदि आप onBindViewHolder विधि में position पर आइटम की Firebase डेटाबेस आईडी निर्धारित करने का प्रयास कर रहे हैं, तो आपको उस मैपिंग को स्वयं बनाए रखना होगा। आप इसे आसानी से getKey() और साथ ही getValue() को स्नैपशॉट से onDataChange में निकाल कर और उन दोनों की सूची बनाकर आसानी से कर सकते हैं।

कुछ इस तरह:

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 में क्लिक किया गया था।

0
Frank van Puffelen 18 जुलाई 2019, 01:27

ठीक है, मैंने अलग-अलग चीजों की कोशिश की और @ फ्रैंक के जवाब ने मुझे ऐसा करने का कुछ विचार दिया। बस एक लाइन जोड़ी और उसका काम हो गया। :) कोई ज़रूरत नहीं ArrayList<String> जोड़ने की।

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

और String pKey को मेरे Product.class में Setter and Getter के साथ जोड़ा।

0
usama zubair 20 जुलाई 2019, 00:08