RecyclerView аварийно завершает работу, когда я обновляю данные в Firestore

Я показываю данные из коллекции Firebase Firestore, пока приложение работало нормально, но когда я обновляю данные в коллекцию с другого устройства (у меня есть Arduino с датчиками, подключенными к ПК, который выполняет скрипт Python для преобразования последовательных данных в JSON). а затем я обновляю эти данные в коллекции Firestore, вся внутренняя часть этих функций работает отлично Моя проблема - это Java на Android.

Я уже ищу решения на этом форуме, и похоже, что-то не работает с адаптером, RecyclerView и "notifyDataSetChanged();" Ни одно из текущих решений не сработало для меня, или, может быть, я просто не знаю, как реализовать их в своем проекте.

это моя модель

public class Monitor {
    String alias, placa, temp, acid;

    public Monitor(){}

    public Monitor(String alias, String placa, String temp, String acid) {
        this.alias = alias;
        this.placa = placa;
        this.temp = temp;
        this.acid = acid;
    }

    public String getAlias() {
        return alias;
    }

    public void setAlias(String alias) {
        this.alias = alias;
    }

    public String getPlaca() {
        return placa;
    }

    public void setPlaca(String placa) {
        this.placa = placa;
    }

    public String getTemp() {
        return temp;
    }

    public void setTemp(String temp) {
        this.temp = temp;
    }

    public String getAcid() {
        return acid;
    }

    public void setAcid(String acid) {
        this.acid = acid;
    }
}

Адаптер

public class MonitorAdapter extends FirestoreRecyclerAdapter<Monitor, MonitorAdapter.ViewHolder> {
    private FirebaseFirestore mFirestore = FirebaseFirestore.getInstance();
    Activity activity;
    /**
     * Create a new RecyclerView adapter that listens to a Firestore Query.  See {@link
     * FirestoreRecyclerOptions} for configuration options.
     *
     * @param options
     */
    public MonitorAdapter(@NonNull FirestoreRecyclerOptions<Monitor> options, Activity activity) {
        super(options);
        this.activity = activity;
    }

    @Override
    protected void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull Monitor model) {
        DocumentSnapshot documentSnapshot = getSnapshots().getSnapshot(holder.getAbsoluteAdapterPosition());
        final String id = documentSnapshot.getId();
        holder.alias.setText(model.getAlias());
        holder.temp.setText(model.getTemp());
        holder.acid.setText(model.getAcid());

        holder.btn_edit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent(activity, VincularPlaca.class);
                i.putExtra("id_placa",id);
                activity.startActivity(i);
            }
        });

    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView alias, temp, acid;
        Button btn_edit;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            alias = itemView.findViewById(R.id.alias);
            temp = itemView.findViewById(R.id.temp);
            acid = itemView.findViewById(R.id.acid);
            btn_edit = itemView.findViewById(R.id.btn_edit);

        }
    }

}

И моя основная активность

public class MainActivity extends AppCompatActivity {

    Button btn_add, btn_exit;
    RecyclerView mRecycler;
    MonitorAdapter mAdapter;
    FirebaseFirestore mFirestore;
    FirebaseAuth mAuth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mFirestore = FirebaseFirestore.getInstance();
        mRecycler = findViewById(R.id.recyclerViewSingle);
        mRecycler.setLayoutManager(new LinearLayoutManager(this));
        Query query = mFirestore.collection("dispositivos");

        FirestoreRecyclerOptions<Monitor> firestoreRecyclerOptions =
                new FirestoreRecyclerOptions.Builder<Monitor>().setQuery(query,Monitor.class).build();

        mAdapter = new MonitorAdapter(firestoreRecyclerOptions, this);

        mAdapter.notifyDataSetChanged();
        mRecycler.setAdapter(mAdapter);

        btn_add = findViewById(R.id.btn_add);
        btn_exit = findViewById(R.id.btn_close);

        btn_add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(MainActivity.this,VincularPlaca.class));
            }
        });

        btn_exit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(MainActivity.this,LoginActivity.class));
                mAuth.signOut();
            }
        });

    }

    @Override
    protected void onStart() {
        super.onStart();
        mAdapter.startListening();
    }

    @Override
    protected void onStop() {
        super.onStop();
        mAdapter.stopListening();
    }

}

Трассировки стека нет, значит, вопроса недостаточно. Вызов notifyDataSetChanged() для нового экземпляра адаптера кажется мне странным, поскольку он не имеет смысла.

Martin Zeitler 29.11.2022 06:20

Если приложение аварийно завершает работу, существует трассировка стека. Пожалуйста, посмотрите это на logcat и добавьте к своему вопросу. Пожалуйста, ответьте, используя @AlexMamo

Alex Mamo 29.11.2022 06:23

@AlexMamo мой диспетчер устройств Android Studio и эмулятор не работают должным образом, поэтому я просто создаю apk и запускаю его на физическом устройстве, поэтому у меня нет доступа к логарифму, когда возникает эта ошибка, но «сбой» - это просто само закрытие приложения. когда я загружаю данные в коллекцию в firestore. В поисках решений я нашел способ сделать снимок документа в другой пустоте, связанной с какой-то «кнопкой обновления» или чем-то еще, которая снова считывает данные, но также я бы изменил вид recyclerview на «просмотр списка». У меня нет опыта с этими вещами, я извиняюсь.

RodrigoMardones 29.11.2022 07:22

Почему вы написали mAdapter.notifyDataSetChanged(), когда используете mAdapter.startListening() и mAdapter.stopListening()? Не имеет смысла

REX 29.11.2022 14:32
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
class ExampleViewModel : ViewModel() {
var mFirestore : FirebaseFirestore? = null
private val _list = MutableLiveData<FirestoreRecyclerOptions<Monitor>>()
val list: LiveData<FirestoreRecyclerOptions<Monitor>> = _list

init{
    mFirestore = FirebaseFirestore.getInstance()
    list.value= FirestoreRecyclerOptions.Builder<Monitor>().setQuery(mFirestore!!.collection("dispositivos"),Monitor::class.java).build()
}

}

Проблема решена исправлением разрешений AndroidManifest и вне кода на консоли Firebase Firestore, атрибут должен был быть строкой, но он получает int.

Другие вопросы по теме