Не удается преобразовать объект типа java .util. Arraylist Чтение из базы данных Realtim базы данных Firebase. - PullRequest
1 голос
/ 26 февраля 2020

Эта структура базы данных Firebase:

введите описание изображения здесь

Вот мой класс устройств:

public class Device {

private String title;
private Map<String,Counters> CounterNumber;
private Counters counters;

public void setCounter(Map<String,Counters> CounterNumber){
    this.CounterNumber=CounterNumber;
}
public Map<String,Counters> getCounter(){
    return CounterNumber;
}
public Counters getCounters(){
    return counters;
}
public void setCounters(Counters counters){
    this.counters=counters;
}
public Device(){

}
public Device(String title){
    this.title=title;
}

public String getTitle(){
    return title;
}
public void setTitle(String title){
    this.title=title;
}

}

Second class is my nested object I think

Класс счетчиков второго класса Моя проблема в том, что я не знаю, как читать Counter объект из базы данных с FirebaseUI и RecycleView .

public class Counters implements Serializable {
private String countername;
private String counternumber;
public Counters (){

}
public Counters(String counternumber,String countername){
    this.counternumber=counternumber;
    this.countername=countername;
}
public String getCounterName() {
    return countername;
}

public void setCounterName(String counterName) {
    this.countername = countername;
}

public String getCounterNumber() {
    return counternumber;
}

public void setCounterNumber(String counternumber) {
    this.counternumber = countername;
}

}

This My HomeActivity Здесь читается из объектов firebase

    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_home, container, false);

    recyclerView=(RecyclerView)view.findViewById(R.id.recycler_view);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    firebaseDatabase=FirebaseDatabase.getInstance();
    databaseReference=firebaseDatabase.getReference();
    mDevice=new ArrayList<Device>();
    mdevices=new Device();

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

        }

        @Override
        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            if (dataSnapshot != null && dataSnapshot.getValue() != null) {
                try {
                    for (DataSnapshot eventSnapshot : dataSnapshot.getChildren()) {
                        ArrayList<String> counterse= (ArrayList<String>) eventSnapshot.getValue();
                        Log.e(TAGE, counterse.toString());
                        Device device = eventSnapshot.getValue(Device.class);
                        String id = eventSnapshot.getKey();
                        Counters counters = eventSnapshot.child(id).getValue(Counters.class);
                        device.setCounters(counters);
                        mDevice.add(device);
                    }

                } catch (Exception ex) {
                    Log.e(TAG, ex.getMessage());
                }

            }
            displayDevices();
        }

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

        }

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

        }

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

        }
    });

    return view;
}
private void displayDevices(){
    options=
            new FirebaseRecyclerOptions.Builder<Device>()
                    .setQuery(databaseReference.child("devices").orderByChild("user_id").equalTo(userid),Device.class).build();


    adapter=
            new FirebaseRecyclerAdapter<Device, MyRecyclerViewHolder>(options) {
                @Override
                protected void onBindViewHolder(@NonNull MyRecyclerViewHolder holder, int position, @NonNull Device model) {

                    mdevices=mDevice.get(position);
                    holder.txt_title.setText(model.getTitle());
                    holder.txt_counter.setText(mdevices.getCounters().getCounterNumber());
                    Log.i(TAG,mdevices.getCounters().getCounterNumber());

                }

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

    adapter.startListening();
    recyclerView.setAdapter(adapter);

}
@Override
public void onStart() {
   adapter.startListening();
    super.onStart();
}

@Override
public void onStop() {
    super.onStop();
    if(adapter != null) {
        adapter.stopListening();
    }
}

Вот моя ошибка Код введите описание изображения здесь

Ответы [ 3 ]

0 голосов
/ 26 февраля 2020

Вы получаете следующую ошибку:

не удается преобразовать объект типа java .util.ArrayList в тип com.example.smartappfirebase.Counters

Потому что вы получаете ArrayList объект и , а не a Counters объект, и в Java нет способа создать такой бросок. Ваш узел counters, существующий в узле cRVh ... NHeT, на самом деле является массивом. Когда вы пытаетесь прочитать этот массив в коде, он читается как ArrayList, отсюда и эта ошибка. Как я вижу на вашем скриншоте, этот массив содержит Counters объектов. К сожалению, вы не можете просто сопоставить этот массив Counters объектов с ArrayList<Counters>. Узел counters на самом деле представляет собой ArrayList из HashMaps. Так что если вам нужно иметь ArrayList<Counters>, то вы должны выполнить итерацию и создать этот список самостоятельно. Кроме того, имена свойств в вашем Counters классе не соответствуют именам в базе данных. См. countername против name и counternumber против counter. Все свойства должны совпадать.

0 голосов
/ 26 февраля 2020

Я пытаюсь изменить

Arraylist
package com.example.smartappfirebase;

import java .util.ArrayList;

publi c Класс Device {

private String title;
private ArrayList<counters> counters;

public ArrayList<counters> getCounter() {
    return counters;
}

public void setCounter(ArrayList<counters> counters) {
    this.counters = counters;
}

public Device(){}

public Device(String title,ArrayList<counters> counters) {
    this.title = title;
    this.counters=counters;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

}

Результат:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.util.ArrayList.get(int)' on a null object reference 
0 голосов
/ 26 февраля 2020

Вы не должны пытаться привести HashMap к ArrayList. Тем не менее, вы можете попытаться получить keys() или values() HashMap.

И вы должны опубликовать полный журнал исключений, а не как изображение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...