Recyclerview null с Firebaseui

# #android #firebase-realtime-database #android-recyclerview #firebaseui

Вопрос:

Я пытаюсь восстановить данные из RealtimeDatabse с помощью FirebaseUI RecyclerView, но ничего не появляется. Я перепробовал множество учебных пособий и много искал, но мне ничего не поможет. Я хочу получить статус из «Parcare2» в текстовом представлении. Основное место, где находится RecyclerView:

 public class Parcare extends AppCompatActivity {
    private RecyclerView recview;
    ArrayList<Model_parcare> model_parcares;
   Adapter_parcare adapter_parcare;
    DatabaseReference mref;
    FirebaseDatabase firebaseDatabase;


    String a;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recycler_view);


        Log.d("opx", String.valueOf(mref));
        recview=(RecyclerView)findViewById(R.id.recview);
        mref= FirebaseDatabase.getInstance().getReference().child("PARCARE");
        mref.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                String name=snapshot.child("LOC").getValue().toString();
                a=name;

            }

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

            }
        });
        recview.setLayoutManager(new LinearLayoutManager(this));
        Query query = FirebaseDatabase.getInstance()
                .getReference().child("Parcare2").child("status");
       query.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                String name=snapshot.getValue().toString();
                a=name;
                Log.d("pore",name);
            }

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

            }
        });

        FirebaseRecyclerOptions<Model_parcare> options =
                new FirebaseRecyclerOptions.Builder<Model_parcare>()
                        .setQuery(query, Model_parcare.class)
                        .build();
    Log.d("pte",query.toString());

        adapter_parcare=new Adapter_parcare(options);
        recview.setAdapter(adapter_parcare);
     }

    @Override
    protected void onStart() {
        super.onStart();
        adapter_parcare.startListening();
    }
    @Override
    protected void onStop() {
        super.onStop();
        adapter_parcare.stopListening();
    }


    }
 

Адаптер RecyclerView:

     public class Adapter_parcare  extends FirebaseRecyclerAdapter<Model_parcare,Adapter_parcare.myviewholder>{


    /**
     * Initialize a {@link RecyclerView.Adapter} that listens to a Firebase query. See
     * {@link FirebaseRecyclerOptions} for configuration options.
     *
     * @param options
     */
    public Adapter_parcare(@NonNull FirebaseRecyclerOptions<Model_parcare> options) {
        super(options);
    }

    @Override
    protected void onBindViewHolder(@NonNull myviewholder holder, int position, @NonNull Model_parcare model) {
holder.textView.setText(model.getStare());
Log.d("wes",holder.textView.toString());
    }

    @NonNull
    @Override
    public myviewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
      View view=LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_parcare,parent,false);
      return new myviewholder(view);
    }

    class myviewholder extends RecyclerView.ViewHolder{
        TextView textView;
        public myviewholder(@NonNull View itemView) {
            super(itemView);
            textView=itemView.findViewById(R.id.stare_loc);
            Log.d("lkj",textView.toString());

        }
    } }
 

The model class:

 public class Model_parcare {
   public String stare;
Model_parcare(){

}
public Model_parcare(String stare) {
    this.stare = stare;

}

public String getStare() {
    return stare;
}
 

}
My xml where data are stored:

 <?xml version="1.0" encoding="utf-8"?>







    <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
 
         <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal">

            <TextView
                android:id="@ id/stare_loc"
                android:layout_width="120dp"
                android:layout_height="53dp"
                android:text="Stare"

                android:textColor="#FFE933"
                android:textSize="30dp" />
        </LinearLayout>
    </androidx.cardview.widget.CardView>
 

и xml для recyvlerview:

  <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:background="#FFFFFF"

android:layout_height="match_parent">

<androidx.recyclerview.widget.RecyclerView
    android:id="@ id/recview"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:background="@color/black"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"

    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
 

и моя огневая база выглядит так:
введите описание изображения здесь

Комментарии:

1. Первый шаг — перестать игнорировать возможные ошибки. Как минимум onCancelled должно выглядеть так: public void onCancelled(@NonNull DatabaseError error) { throw error.toException(); }

Ответ №1:

Во-вторых: в разделе есть одно значение /Parcare2/status , но вы пытаетесь отобразить его в представлении переработчика, которое предназначено для отображения списка элементов. Он FirebaseRecyclerAdapter предназначен для работы со списком узлов, а не с одним значением, как у вас здесь.

Простой способ заставить его работать-это:

 Query query = FirebaseDatabase.getInstance().getReference("Parcare2");
FirebaseRecyclerOptions<Model_parcare> options =
        new FirebaseRecyclerOptions.Builder<String>()
                .setQuery(query, new SnapshotParser<String>() {
                    @NonNull
                    @Override
                    public String parseSnapshot(@NonNull DataSnapshot snapshot) {
                        return snapshot.getValue(String.class);
                    }
                }))
                .build();
adapter_parcare=new FirebaseRecyclerAdapter(options);
recview.setAdapter(adapter_parcare);
 

С помощью этого кода адаптер покажет значение каждого свойства в разделе Parcare2 . Таким образом, с JSON в вопросе будет отображаться только один элемент «ocupat», но вы можете добавить дополнительные свойства, и они появятся.

Комментарии:

1. Спасибо! Это помогло мне!