回收者视图仅显示添加到实时数据库中的最后一个项目 [英] Recycler View showing only very last item added to realtime database

查看:69
本文介绍了回收者视图仅显示添加到实时数据库中的最后一个项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个火力基地结构

回收站视图仅显示数据库中最后添加的节点或说最近添加的节点,而不显示每个节点

The recycler view is only displaying the last added or say latest added node to the database instead of displaying each and every node

我正在使用的数据库参考是

the database reference i am using is

r2 = FirebaseDatabase.getInstance().getReference().child("Uploads").child("Wheat").child(S).child(D).child(T).child(FirebaseAuth.getInstance().getUid());

,回收站视图的代码为

public class MyPost extends AppCompatActivity {

    private RecyclerView recyclerView;
    private DatabaseReference r, r2, r3;
    private String S, D, T;
    FirebaseRecyclerAdapter<RecyclerCropView, ViewHolder2> Fbra1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_post);
        r = FirebaseDatabase.getInstance().getReference().child("User_Data").child(MainDashboard.type).child(FirebaseAuth.getInstance().getUid());
        recyclerView = (RecyclerView) findViewById(R.id.R_view2);
        r.addListenerForSingleValueEvent(rr);
    }


    private ValueEventListener rr = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            S = dataSnapshot.child("State").getValue().toString();
            D = dataSnapshot.child("City").getValue().toString();
            T = dataSnapshot.child("Tehsil").getValue().toString();
            //   Toast.makeText(MyPost.this,S+D+T.toString(),Toast.LENGTH_LONG).show();
            r2 = FirebaseDatabase.getInstance().getReference().child("Uploads").child("Wheat").child(S).child(D).child(T).child(FirebaseAuth.getInstance().getUid());
            //   Toast.makeText(MyPost.this,r2.toString(),Toast.LENGTH_LONG).show();

            r2.addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                    r3=r2.child(dataSnapshot.getKey());
                    Toast.makeText(MyPost.this, r3.toString(), Toast.LENGTH_LONG).show();
                    FirebaseRecyclerOptions<RecyclerCropView> options = new FirebaseRecyclerOptions.Builder<RecyclerCropView>().setQuery(r3, RecyclerCropView.class).build();
                    Fbra1 = new FirebaseRecyclerAdapter<RecyclerCropView, ViewHolder2>(options) {
                        @Override
                        protected void onBindViewHolder(@NonNull ViewHolder2 holder, int position, @NonNull RecyclerCropView model) {
                            holder.setProductImage(model.getProduct_Image());
                            holder.setProduct(model.getProduct());
                            holder.setMax(model.getMaximumPrice());
                            holder.setQuantityUnit(model.getQuantityUnit());
                            holder.setQuantity(model.getQuantity());
                        }

                        @NonNull
                        @Override
                        public ViewHolder2 onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_post, parent, false);
                            return new ViewHolder2(v);
                        }
                    };
                    Fbra1.notifyDataSetChanged();
                    recyclerView.hasFixedSize();
                    recyclerView.setLayoutManager(new LinearLayoutManager(MyPost.this));
                    Fbra1.startListening();
                    recyclerView.setAdapter(Fbra1);
                }

                @Override
                public void onChildChanged(DataSnapshot dataSnapshot, String s) {

                }

                @Override
                public void onChildRemoved(DataSnapshot dataSnapshot) {

                }

                @Override
                public void onChildMoved(DataSnapshot dataSnapshot, String s) {

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

        }


        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    };


    @Override
    protected void onRestart() {
        super.onRestart();
        finish();
    }


}

回收站视图仅显示添加到数据库中的最后一个项目.

注意:-

  • item.xml文件的宽度设置为包装内容.
  • 如果我删除childEventListener,则recyclerView将显示多个项目,其中包括在TextView位置上为null(应该设置要检索其数据的那些textView)

推荐答案

问题出在这里: r2.addChildEventListener

实现此接口的类可用于接收有关给定DatabaseReference引用的子级位置更改的事件.使用addChildEventListener(ChildEventListener)将侦听器附加到某个位置,并在发生更改时触发适当的方法. Firebase文档

您应该使用的是 r2.addListenerForSingleValueEvent

这将返回特定节点的子代.但是现在,由于您正在使用 FirebaseUI 库,您将无需监听,因为它本身就是一个监听器.

This returns the children of the specific node. But now since you are using FirebaseUI library, you will not need to listen as it is a listener itself.

因此,您的代码应侦听帖子的根目录. r3 = r2.child(dataSnapshot.getKey()); 是不必要的,因为它只会获得一个条目

So your code should listen to the root of the posts. This r3=r2.child(dataSnapshot.getKey()); is unnecessary because it only gets one entry

更改为此

FirebaseRecyclerOptions<RecyclerCropView> options = new FirebaseRecyclerOptions.Builder<RecyclerCropView>().setQuery(r2, RecyclerCropView.class).build();
Fbra1 = new FirebaseRecyclerAdapter<RecyclerCropView, ViewHolder2>(options) {
    @Override
    protected void onBindViewHolder(@NonNull ViewHolder2 holder, int position, @NonNull RecyclerCropView model) {
        holder.setProductImage(model.getProduct_Image());
        holder.setProduct(model.getProduct());
        holder.setMax(model.getMaximumPrice());
        holder.setQuantityUnit(model.getQuantityUnit());
        holder.setQuantity(model.getQuantity());
    }

    @NonNull
    @Override
    public ViewHolder2 onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_post, parent, false);
        return new ViewHolder2(v);
    }
};
Fbra1.notifyDataSetChanged();
recyclerView.hasFixedSize();
recyclerView.setLayoutManager(new LinearLayoutManager(MyPost.this));
Fbra1.startListening();
recyclerView.setAdapter(Fbra1);

这篇关于回收者视图仅显示添加到实时数据库中的最后一个项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆