RISOLTO RecyclerView con firebase

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.

sare1234

Utente Attivo
Messaggi
262
Reazioni
3
Punteggio
35
Salve ho problemi nell'implementazione del recyclerView, in particolare mi da una schermata bianca anche se nel database ci sono dati che dovrebbe caricare e mi dice: " W/RecyclerView: No adapter attached; skipping layout". Di seguito il codice:

row_itinerary
XML:
<?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="140dp"
    android:layout_marginBottom="5dp"
    app:cardBackgroundColor="@color/white"
    app:cardCornerRadius="5dp"
    app:cardElevation="0dp"
    app:contentPadding="5dp">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:ignore="MissingConstraints">

        <RelativeLayout
            android:layout_width="144dp"
            android:layout_height="match_parent"
            android:layout_marginEnd="5dp"
            android:background="@color/grey">

            <ImageView
                android:id="@+id/imageView_row_itinerary"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>

            <ProgressBar
                android:id="@+id/progressBar_row_itinerary"
                style="?android:attr/progressBarStyle"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_marginBottom="46dp"
                android:visibility="gone"/>

        </RelativeLayout>

        <TextView
            android:id="@+id/title_row_itinerary"
            style="@style/TextAppearance.MaterialComponents.Headline6"
            android:layout_width="255dp"
            android:layout_height="48dp"
            android:layout_alignParentEnd="true"
            android:layout_marginEnd="0dp"
            android:text="Itinerary Title"
            android:textColor="#121111"
            android:textSize="24sp" />


    </RelativeLayout>


</androidx.cardview.widget.CardView>

fragment_explore
XML:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    tools:context=".view.fragment.Explore_fragment">


    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/ItineraryListRv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:layout_alignParentBottom="true"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="0dp"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        tools:listitem="@layout/row_itinerary">


    </androidx.recyclerview.widget.RecyclerView>
</RelativeLayout>

Explore_fragment
Java:
package com.example.natour2022.view.fragment;

import android.net.Uri;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.example.natour2022.Adapter.AdapterListItinerary;
import com.example.natour2022.R;
import com.example.natour2022.model.Itinerary;
import com.example.natour2022.presenter.fragment.Explore_presenter;
import com.example.natour2022.view.activity.StartActivity;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.List;

public class Explore_fragment extends Fragment {

    private final StartActivity startActivity;
    private Explore_presenter explore_presenter;
    private RecyclerView recyclerView;

    private List<Itinerary> itineraryArrayList;
    private AdapterListItinerary adapterListItinerary;


    public Explore_fragment(StartActivity startActivity) {
        this.startActivity = startActivity;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    public StartActivity getStartActivity() {
        return startActivity;
    }

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

        View root = inflater.inflate(R.layout.fragment_explore, container, false);

        recyclerView = root.findViewById(R.id.ItineraryListRv);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

        itineraryArrayList = new ArrayList<>();

        getAllItinerary();

        return root;
    }

    private void getAllItinerary(){
        Itinerary itinerary = new Itinerary();
        itineraryArrayList.clear();

        FirebaseDatabase.getInstance().getReference().child("Itinerary").
                child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                .addValueEventListener(new ValueEventListener() {

                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                        Iterable<DataSnapshot> dataSnapsho1 = snapshot.getChildren();
                        for(DataSnapshot ds : dataSnapsho1) {

                            if(ds.child("titleItinerary").getValue() != null){
                                itinerary.setTitleItinerary(ds.child("titleItinerary").getValue().toString());
                                itinerary.setImageUrl(Uri.parse(ds.child("imageUrl").getValue().toString()));

                            }
                            itineraryArrayList.add(itinerary);

                        }
                        adapterListItinerary = new AdapterListItinerary(getActivity(), itineraryArrayList);
                        recyclerView.setAdapter(adapterListItinerary);

                    }

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

                    }
                });
    }
}

AdapterListItinerary:
Java:
package com.example.natour2022.Adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.natour2022.R;
import com.example.natour2022.model.Itinerary;
import com.squareup.picasso.Picasso;

import java.util.List;

public class AdapterListItinerary extends RecyclerView.Adapter<AdapterListItinerary.HolderListItinerary>{

    private Context context;
    private List<Itinerary> ItineraryArrayList;


    public AdapterListItinerary(Context context, List<Itinerary> itineraryArrayList) {
        this.context = context;
        ItineraryArrayList = itineraryArrayList;
    }

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

    @Override
    public void onBindViewHolder(@NonNull AdapterListItinerary.HolderListItinerary holder, int position) {
        String titleItinerary = ItineraryArrayList.get(position).getTitleItinerary();
        try{
            Picasso.get().load(ItineraryArrayList.get(position).getImageUrl())
                    .placeholder(R.drawable.ic_launcher_foreground)
                    .into(holder.imageView_row_itinerary, new com.squareup.picasso.Callback(){
                        @Override
                        public void onSuccess() {
                        }

                        @Override
                        public void onError(Exception e) {

                        }
                    });

        }catch(Exception e){

        }
    }

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

    class HolderListItinerary extends RecyclerView.ViewHolder{

        ImageView imageView_row_itinerary;
        ProgressBar progressBar_row_itinerary;
        TextView title_row_itinerary;

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

            imageView_row_itinerary = itemView.findViewById(R.id.imageView_row_itinerary);
            progressBar_row_itinerary = itemView.findViewById(R.id.progressBar_row_itinerary);
            title_row_itinerary = itemView.findViewById(R.id.title_row_itinerary);

        }
    }
}
In realtà in debug mi porta che in "ItineraryArrayList" non c'è nulla ma nel database c'è roba...come posso risolvere?
 
Ultima modifica:
Semplicemente non stai leggendo correttamente da db!

In primis prova a rivedere il tuo metodo di lettura su firebase e vedere che L arraylist tramite debugger viene inizializzata è riempita con i valori del db! Altrimenti essendo nulla o vuota è normale che il componente è vuoto
 
Semplicemente non stai leggendo correttamente da db!

In primis prova a rivedere il tuo metodo di lettura su firebase e vedere che L arraylist tramite debugger viene inizializzata è riempita con i valori del db! Altrimenti essendo nulla o vuota è normale che il componente è vuoto
i valori non vengono letti...ma perchè? penso sia corretto come li leggo
 
Ultima modifica:
Non saprei devi rivedere la connessione al db firebase
 
Allora non ci capiamo! Stai scrivendo codice Java per Android! Evidentemente nel tuo codice Java stai sbagliando il metodo per ottenere i dati da firebase! Se la lista non viene valorizzata o rimane null evidentemente la tua interrogazione non funziona! Adesso sono leggermente arrugginito su Android ma sono quasi certo che devi rivedere la tua connessione a firebase
 
Il problema risiede qui
Codice:
for(DataSnapshot ds : dataSnapsho1) {

                            if(ds.child("titleItinerary").getValue() != null){
                                itinerary.setTitleItinerary(ds.child("titleItinerary").getValue().toString());
                                itinerary.setImageUrl(Uri.parse(ds.child("imageUrl").getValue().toString()));

                            }
                            itineraryArrayList.add(itinerary);

                        }

Stai aggiungengo un arraylist lo stesso oggetto itinerary modificato ogni volta. Quindi ottieni sempre lo stesso oggetto ripetuto tante volte.
La soluzione è questa, creare un nuovo oggetto itinerary ogni volta.
Codice:
for(DataSnapshot ds : dataSnapsho1) {
                            Itinerary itinerary = new Itinerary();
                            if(ds.child("titleItinerary").getValue() != null){
                                itinerary.setTitleItinerary(ds.child("titleItinerary").getValue().toString());
                                itinerary.setImageUrl(Uri.parse(ds.child("imageUrl").getValue().toString()));

                            }
                            itineraryArrayList.add(itinerary);

                        }
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top