Firestore не получает определенные поля из документа - PullRequest
0 голосов

У меня есть фрагмент в фрагменте, чтобы показать документы из коллекции в firestore, проблема в том, что он только извлекает определенные поля из документа, похоже, что он игнорирует некоторые другие поля Setter из класса модели, это это ошибка, которую я получаю:

W / Firestore: (0.6.6-dev) [zzko]: не найден установщик / поле для sabado учебный класс com.example.denilsondasilva.iasdmt.com.example.denilsondasilva.com.example.denilsondasilva.MODELS.ModelProgramas

Теперь вот мой класс модели:

public class ModelProgramas {

    public ModelProgramas() {
    }

    public ModelProgramas(String sabado, String evento, String responsavel, String data, String horario) {
        this.sabado = sabado;
        this.evento = evento;
        this.responsavel = responsavel;
        this.data = data;
        this.horario = horario;
    }

    public String getSabado() {
        return sabado;
    }

    public void setSabado(String sabado) {
        this.sabado = sabado;
    }

    public String getEvento() {
        return evento;
    }

    public void setEvento(String evento) {
        this.evento = evento;
    }

    public String getResponsavel() {
        return responsavel;
    }

    public void setResponsavel(String responsavel) {
        this.responsavel = responsavel;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public String getHorario() {
        return horario;
    }

    public void setHorario(String horario) {
        this.horario = horario;
    }

    private String sabado;
    private String evento;
    private String responsavel;
    private String data;
    private String horario;
}

Я создал ПУСТОЙ КОНСТРУКТОР для класса, я создал КОНСТРУКТОРЫ для переменных, а также геттеры и сеттеры, и я видел предыдущие вопросы с той же проблемой, поэтому я знаю, что мои БУКВЫ И УСТАНОВКИ и переменные были созданы правильно. Переменные в нижнем регистре, геттеры и сеттеры, начинающиеся с верхнего регистра. и строки в документе firestore такие же, как созданные переменные

вот мой адаптер:

public class PROGRAMASrecyclerAdapter extends RecyclerView.Adapter<PROGRAMASrecyclerAdapter.Programasholder> {

    Context ctx;
    private List<ModelProgramas> Progs_list;

    public PROGRAMASrecyclerAdapter(List<ModelProgramas> progs_list) {
        this.Progs_list = progs_list;
    }

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

    @Override
    public void onBindViewHolder(@NonNull Programasholder holder, int position) {

        final String sabado = Progs_list.get(position).getSabado();
        holder.setSabado(sabado);

        String evento = Progs_list.get(position).getEvento();
        holder.setEvento(evento);

        String responsavel = Progs_list.get(position).getResponsavel();
        holder.setResponsavel(responsavel);

        String data = Progs_list.get(position).getData();
        holder.setData(data);

        String horario = Progs_list.get(position).getHorario();
        holder.setHorario(horario);

        holder.mcardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(ctx, sabado, Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    public int getItemCount() {
        return Progs_list.size();
    }

    public class Programasholder extends RecyclerView.ViewHolder{
        View mView;
        private TextView Sabadotxt;
        private TextView Eventotxt;
        private TextView Responsaveltxt;
        private TextView DatadoEventotxt;
        private TextView Horariotxt;
        private CardView mcardView;

        public Programasholder(View itemView) {
            super(itemView);
            mView = itemView;

            mcardView = mView.findViewById(R.id.listCard_Programas);
        }

        public void setSabado(String sabado){
            Sabadotxt = mView.findViewById(R.id.Prog_sabadotxt);
            Sabadotxt.setText(sabado);
        }

        public void setEvento(String evento){
            Eventotxt = mView.findViewById(R.id.Prog_eventotxt);
            Eventotxt.setText(evento);
        }

        public void setResponsavel(String responsavel){
            Responsaveltxt = mView.findViewById(R.id.Prog_responsaveltxt);
            Responsaveltxt.setText(responsavel);
        }

        public void setData(String data){
            DatadoEventotxt = mView.findViewById(R.id.Prog_datadoEventotxt);
            DatadoEventotxt.setText(data);
        }

        public void setHorario(String horario){
            Horariotxt = mView.findViewById(R.id.Prog_horariotxt);
            Horariotxt.setText(horario);
        }
    }
}

Я даже создал прослушиватель по щелчку на просмотре карты, чтобы отобразить найденную строку «sabado», чтобы увидеть, есть ли проблема в классе Viewholder, но это RETURNING NULL

и вот мой фрагмент класса:

public class ProgramasFragment extends Fragment {

    View view;
    private RecyclerView recyclerView;
    private List<ModelProgramas> Progs_List;
    private FirebaseFirestore firebaseFirestore;
    PROGRAMASrecyclerAdapter programaSrecyclerAdapter;


    public ProgramasFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_programas, container, false);
        Progs_List = new ArrayList<>();
        programaSrecyclerAdapter = new PROGRAMASrecyclerAdapter(Progs_List);

        firebaseFirestore = FirebaseFirestore.getInstance();

        recyclerView = view.findViewById(R.id.Recycler_ProgramasList);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.setAdapter(programaSrecyclerAdapter);

        firebaseFirestore.collection("programasdatarde").addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {

                if (queryDocumentSnapshots == null){
                    String error = e.getCause().getMessage();
                    Toast.makeText(getActivity().getApplicationContext(), "Empty QUERY: "+error, Toast.LENGTH_SHORT).show();
                }else{

                    for (DocumentChange doc: queryDocumentSnapshots.getDocumentChanges()){

                        if (doc.getType() == DocumentChange.Type.ADDED){

                            ModelProgramas modelProgramas = doc.getDocument().toObject(ModelProgramas.class);
                            Progs_List.add(modelProgramas);
                            programaSrecyclerAdapter.notifyDataSetChanged();
                        }
                    }
                }
            }
        });

        return view;
    }
}

Я знаю, что проблема не в классе фрагментов и не в адаптере, я имею в виду, что я ДУМАЮ, потому что я просматривал их снова и снова, и у меня есть другие фрагменты с обзорами переработчиков, которые выполняют те же функции, и они не представляют такого рода ошибки.

ПОЖАЛУЙСТА, НЕ ОТМЕТЬТЕ ЭТОТ ДВОЙНОЙ ВОПРОС, ПОТОМУ ЧТО Я РАБОТАЛ ИЗ ВСЕХ ДРУГИХ РЕШЕНИЙ ПО ДРУГИМ СВЯЗАННЫМ ПОСТАМ, НО ЭТО НЕ РЕШАЕТ МОЕЙ ОШИБКИ! ПОЖАЛУЙСТА, ПОМОГИТЕ.

И структура данных такая.

enter image description here

1 Ответ

0 голосов
/ 03 мая 2018

Я нашел ошибку и несколько улучшений в вашем коде, которые заключаются в следующем.

Удалить recyclerView.setHasFixedSize(true);. Потому что ваш RecyclerView загружается динамически, и у вас может не быть фиксированной высоты для каждого вашего элемента.

Не вызывайте notifyDataSetChanged внутри цикла for. Сделай это так.

firebaseFirestore.collection("programasdatarde").addSnapshotListener(new EventListener<QuerySnapshot>() {
    @Override
    public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {

        if (queryDocumentSnapshots == null){
            String error = e.getCause().getMessage();
            Toast.makeText(getActivity().getApplicationContext(), "Empty QUERY: "+error, Toast.LENGTH_SHORT).show();
        } else {
            for (DocumentChange doc: queryDocumentSnapshots.getDocumentChanges()){
                if (doc.getType() == DocumentChange.Type.ADDED){
                    ModelProgramas modelProgramas = doc.getDocument().toObject(ModelProgramas.class);
                    Progs_List.add(modelProgramas);
                }
            }

            // Move the notify data set out here. 
            programaSrecyclerAdapter.notifyDataSetChanged();
        }
    }
});

Теперь упростим класс вашей модели. Я думаю, что вам не нужны явные методы получения и установки. Просто объявив переменные как public. Тем не менее, геттеры и сеттеры в порядке. Я не смог найти там никаких ошибок.

public class ModelProgramas {

    public String sabado;
    public String evento;
    public String responsavel;
    public String data;
    public String horario;

    public ModelProgramas() {}
}

Пожалуйста, внесите изменения и проверьте, сохраняется ли ошибка. Однако я не смог найти никаких проблем с вашим адаптером и моделью класса. Предложения, которые я попытался изложить, выводят notifyDataSetChanged из цикла и удаляют атрибут setHasFixedSize из RecyclerView.

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