RISOLTO RecyclerView con firebase

Stato
Discussione chiusa ad ulteriori risposte.

sare1234

Utente Attivo
262
3
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:

Skills07

Head of Development
Staff Forum
Utente Èlite
35,439
11,502
CPU
Ryzen 7 5800x
Dissipatore
Deepcool gammax l240 v2
Scheda Madre
Aourus Gigabyte X-470 ultra gaming
HDD
Samsung Evo 850 250gb ,2tb x 2 toshiba P300, 256 Ssd silicon power, Samsung evo plus 1tb nvme
RAM
32 gb G.Skill Tridentz 3200 mhz RGB
GPU
Zotac - RTX 3070 Ti Trinity OC
Monitor
ASUS TUF QHD 165hz IPS, ITEK GCF 165hz IPS QHD, Samsung Curvo 144hz QHD
PSU
Seasonic Focus 650w 80 platinum
Case
Coolermaster h500p
Periferiche
Asus Tuf Wireless
Net
Fibra Tim 100mb
OS
Windows 10 Pro 64 bit
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
 

sare1234

Utente Attivo
262
3
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:

Skills07

Head of Development
Staff Forum
Utente Èlite
35,439
11,502
CPU
Ryzen 7 5800x
Dissipatore
Deepcool gammax l240 v2
Scheda Madre
Aourus Gigabyte X-470 ultra gaming
HDD
Samsung Evo 850 250gb ,2tb x 2 toshiba P300, 256 Ssd silicon power, Samsung evo plus 1tb nvme
RAM
32 gb G.Skill Tridentz 3200 mhz RGB
GPU
Zotac - RTX 3070 Ti Trinity OC
Monitor
ASUS TUF QHD 165hz IPS, ITEK GCF 165hz IPS QHD, Samsung Curvo 144hz QHD
PSU
Seasonic Focus 650w 80 platinum
Case
Coolermaster h500p
Periferiche
Asus Tuf Wireless
Net
Fibra Tim 100mb
OS
Windows 10 Pro 64 bit
Non saprei devi rivedere la connessione al db firebase
 

Skills07

Head of Development
Staff Forum
Utente Èlite
35,439
11,502
CPU
Ryzen 7 5800x
Dissipatore
Deepcool gammax l240 v2
Scheda Madre
Aourus Gigabyte X-470 ultra gaming
HDD
Samsung Evo 850 250gb ,2tb x 2 toshiba P300, 256 Ssd silicon power, Samsung evo plus 1tb nvme
RAM
32 gb G.Skill Tridentz 3200 mhz RGB
GPU
Zotac - RTX 3070 Ti Trinity OC
Monitor
ASUS TUF QHD 165hz IPS, ITEK GCF 165hz IPS QHD, Samsung Curvo 144hz QHD
PSU
Seasonic Focus 650w 80 platinum
Case
Coolermaster h500p
Periferiche
Asus Tuf Wireless
Net
Fibra Tim 100mb
OS
Windows 10 Pro 64 bit
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
 

Ibernato

Utente Èlite
4,330
2,047
OS
Windows 10 Pro / Ubuntu 22.04
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.

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!