Данные Firebase для RecyclerView - PullRequest
0 голосов
/ 13 июня 2019

Я хочу отобразить значения от датчика до RecyclerView, поэтому я написал некоторый стандартный код для реализации RecyclerView.Но у меня есть эта ошибка:

    com.google.firebase.database.DatabaseException: Failed to convert value of type java.lang.Double to String
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertString(com.google.firebase:firebase-database@@17.0.0:408)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(com.google.firebase:firebase-database@@17.0.0:199)
 ....

Моя база данных:

enter image description here

И мои классы:

SensorModel

public class SensorModel {

    String  temp, hum, pressure, time;



    public SensorModel()
    {

    }
    public SensorModel(String  temp, String  hum, String  pressure, String  time) {
        this.temp = temp;
        this.hum = hum;
        this.pressure = pressure;
        this.time = time;


    }
}

SensorAdapter

 public  class SensorAdapter extends RecyclerView.Adapter<SensorAdapter.SensorViewHolder> {
        private List<SensorModel> list;

        public SensorAdapter(List<SensorModel> list) {
            this.list = list;
        }

        @NonNull
        @Override
        public SensorViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            return new SensorViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.sensorlist,parent,false));
        }

        @Override
        public void onBindViewHolder(@NonNull SensorViewHolder sensorViewHolder, int i) {

            SensorModel sensor = list.get(i);

            sensorViewHolder.textTemp.setText(sensor.temp);
            sensorViewHolder.textHum.setText(sensor.hum);
            sensorViewHolder.textPress.setText(sensor.pressure);
            sensorViewHolder.textData.setText(sensor.time);
        }

        @Override
        public int getItemCount() {
            return 0;
        }

        class SensorViewHolder extends RecyclerView.ViewHolder
        {
            TextView textTemp, textHum, textPress, textData;

            public SensorViewHolder(View itemView)
            {
                super(itemView);
                textTemp = itemView.findViewById(R.id.text_temp);
                textHum = itemView.findViewById(R.id.text_hum);
                textPress = itemView.findViewById(R.id.text_press);
                textData = itemView.findViewById(R.id.textData);
            }
        }
    }

И MainActivity

database = FirebaseDatabase.getInstance();
        reference = database.getReference("sensor");

        result = new ArrayList<>();
        recyclerView = (RecyclerView) findViewById(R.id.sensorlist);
        recyclerView.setHasFixedSize(true);
        LinearLayoutManager llm = new LinearLayoutManager(this);
        llm.setOrientation(LinearLayoutManager.VERTICAL);

        recyclerView.setLayoutManager(llm);

        adapter = new SensorAdapter(result);
        recyclerView.setAdapter(adapter);
    .....
     Query queryRecycler = reference.limitToLast(5);
        queryRecycler.addChildEventListener(new ChildEventListener() {

            public void onChildAdded(DataSnapshot dataSnapshot, String previousKey) {
               result.add(dataSnapshot.getValue(SensorModel.class));
                adapter.notifyDataSetChanged();
            }

        });

Итак, яизменил тип переменных с SensorModel на Double и Long и преобразовал их в SensorAdapter в методе onBindViewHolder в String, но это не помогает.Я получил ошибки: Double to String или Long to String и т. Д.

1 Ответ

0 голосов
/ 13 июня 2019

Измените следующее:

    String  temp, hum, pressure, time;



    public SensorModel()
    {

    }
    public SensorModel(String  temp, String  hum, String  pressure, String  time) {
        this.temp = temp;
        this.hum = hum;
        this.pressure = pressure;
        this.time = time;


    }

на это:

    Double temp, hum, pressure, time;



    public SensorModel()
    {

    }
    public SensorModel(Double temp, Double hum, Double pressure, Double time) {
        this.temp = temp;
        this.hum = hum;
        this.pressure = pressure;
        this.time = time;


    }

Так как в вашей базе данных есть значения типа double, то вы сможете сделать dataSnapshot.getValue(SensorModel.class)у вас должен быть один и тот же тип как в базе данных, так и в классе вашей модели.

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