Recycler View показывает только самый последний элемент, добавленный в базу данных в реальном времени - PullRequest
0 голосов
/ 19 октября 2018

У меня есть структура пожарной базы как

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


}

Представление Recycler толькопоказывает самый последний элемент, который был добавлен в базу данных.

Примечание: -

  • В файле item.xml установлена ​​ширина для переноса содержимого.
  • если я удаляю childEventListener, recyclerView отображает несколько элементов с нулем на месте TextView (это те textView, для которых должны быть установлены данные, которые должны быть установлены)

1 Ответ

0 голосов
/ 19 октября 2018

Вот проблема: r2.addChildEventListener

Классы, реализующие этот интерфейс, могут использоваться для получения событий об изменениях в дочерних расположениях данной ссылки на DatabaseReference.Присоедините слушателя к местоположению, используя addChildEventListener (ChildEventListener), и соответствующий метод будет запущен, когда произойдут изменения. Документы Firebase

То, что вы должны использовать, это 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...