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

时间:2018-10-19 05:13:51

标签: android firebase firebase-realtime-database android-recyclerview

我有一个火力基地结构

database

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

我正在使用的数据库引用是

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)

1 个答案:

答案 0 :(得分:0)

问题出在这里:r2.addChildEventListener

  

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

您应该使用的是r2.addListenerForSingleValueEvent

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

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

更改为此

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);