This question already has answers here:
How to return DataSnapshot value as a result of a method?

(5个答案)


在17天前关闭。





当我在RecyclerView中单击某个项目时,我试图获取每个位置的唯一键。


当我打开明细活动时,计数应递增1。我怎样才能做到这一点 ?


recyclerView上的所有数据都是从FirebaseDB加载的。这是屏幕截图:java - 在没有FirebaseRecyclerAdapter的情况下如何增加Firebase中每个位置的viewCount?-LMLPHP

正如我们在News节点中看到的那样,有唯一键。

当我单击适配器中的某个位置时,如何在烤面包机中获得钥匙。

这是我尝试过的:

     databaseReference = FirebaseDatabase.getInstance().getReference("News");


            databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

keyID = dataSnapshot.getKey();
                }

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

                }
            });

            holder.view_counter.setText(homeModel.getViewCounts());

            holder.cardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {


                    Toast.makeText(context, "Key is " + keyID, Toast.LENGTH_SHORT).show();

    //                Intent intent = new Intent(context, DetailNews.class);
    //                intent.putExtra("POS", holder.getAdapterPosition());
    //                context.startActivity(intent);
                }
            });
        }

最佳答案

跟着这些步骤:


在您的homeModel类中添加一个字符串“ key”字段。
在MainActivity的recyclerview-arraylist的侦听器中,用firebase键值填充此“键”字段。像这样:

    ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        newsArrayList.clear();
        for(DataSnapshot data : dataSnapshot.getChildren()){
            HomeModel news = data.getValue(HomeModel.class);
            news.setKey(data.getKey());
            newsArrayList.add(news);
        }
        customAdapter.notifyDataSetChanged();
    }

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

    }
});


要在firebase中将viewCount值增加1,请在cardView-onClick方法中编写一个事务:

            String newsKey = newsArrayList.get(position).getKey();
            ref = db.getReference("News").child(newsKey);

            ref.runTransaction(new Transaction.Handler() {
                @NonNull
                @Override
                public Transaction.Result doTransaction(@NonNull MutableData mutableData) {
                    HomeModel selectedNews= mutableData.getValue(HomeModel.class);

                    int p = selectedNews.getViewCount();
                    p++;
                    selectedNews.setViewCount(p);

                    mutableData.setValue(selectedNews);
                    return Transaction.success(mutableData);
                }

                @Override
                public void onComplete(@Nullable DatabaseError databaseError, boolean b, @Nullable DataSnapshot dataSnapshot) {

                }
            });

关于java - 在没有FirebaseRecyclerAdapter的情况下如何增加Firebase中每个位置的viewCount? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62158987/

10-10 01:40