0

Die Daten werden in der Methode fetchData() in FirebaseHelper abgerufen, aber nicht in den Variablen petInfo und imgURL im CardViewAdapter gespeichert. Dies führt dazu, dass im RecyclerView-Fragment keine Karten angezeigt werden. Wenn die App initialisiert wird, ist das Dataset 0, wird durch das fetchData-Objekt ausgeführt, und das Dataset hat die Größe von Elementen, lässt aber petInfo und imgURL null.Daten von Firebase werden nicht in meinem RecyclerView angezeigt

FirebaseHelper:

public class FirebaseHelper { 
    private DatabaseReference mDatabase; 


    Boolean saved = null; 
    ArrayList<AnimalType> animal = new ArrayList<>(); 

    public FirebaseHelper(DatabaseReference mDatabase) { 
     this.mDatabase = mDatabase; 
    } 

    //Save 
    public Boolean save (AnimalType animalType){ 
     if (animalType==null){ 
      saved = false; 
     } 
     else{ 
      try{ 
       mDatabase.child("AnimalType").push().setValue(animalType); 
       saved=true; 
      }catch (DatabaseException e){ 
       e.printStackTrace(); 
       saved=false; 
      } 
     } 
     return saved; 
    } 

    //Read 
    public ArrayList<AnimalType> retrieve(){ 
     mDatabase.addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
       fetchData(dataSnapshot); 
       Log.i(TAG, "onChildAdded"); 
      } 

      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
       fetchData(dataSnapshot); 
       Log.i(TAG, "onChildChanged"); 
      } 

      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) { 

      } 

      @Override 
      public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 
     return animal; 
    } 

    private void fetchData (DataSnapshot dataSnapshot){ 
     animal.clear(); 
     for (DataSnapshot ds : dataSnapshot.getChildren()){ 
      AnimalType animalType = new AnimalType(); 
      animalType.setPetInfo(ds.getValue(AnimalType.class).getPetInfo()); 
      animalType.setImgURL(ds.getValue(AnimalType.class).getImgURL()); 
      animal.add(animalType); 
     } 
    } 

} 

Adapter:

public class CardViewAdapter extends RecyclerView.Adapter<CardViewAdapter.ViewHolder> { 

    Context mContext; 
    private List<AnimalType> mAnimalData = new ArrayList<>(); 

    public class ViewHolder extends RecyclerView.ViewHolder { 
     public TextView petInfo; 
     public ImageView imgURL; 
     public ViewHolder(View view){ 
      super(view); 
      imgURL = (ImageView) view.findViewById(R.id.pet_image); 
      petInfo = (TextView) view.findViewById(R.id.pet_description); 
     } 
    } 

    //constructor 
    public CardViewAdapter(Context mContext, List<AnimalType> mAnimalData){ 
     this.mAnimalData = mAnimalData; 
    } 

    //create new views 
    @Override 
    public CardViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ 
     View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_layout, parent, false); 
     ViewHolder viewHolder = new ViewHolder(itemView); 

     mContext = parent.getContext(); 

     return viewHolder; 
    } 

    //replace contents of view 
    @Override 
    public void onBindViewHolder(ViewHolder holder, int position){ 
     holder.petInfo.setText(mAnimalData.get(position).getPetInfo()); 
     PicassoClient.downloadImage(mContext,mAnimalData.get(position).getImgURL(), holder.imgURL); 


    } 

    //return size of dataset 
    public int getItemCount(){ 
     return mAnimalData.size(); 
    } 
} 

Fragment:

public class DogFragment extends Fragment { 
    public static final String ARG_PAGE = "ARG_PAGE"; 

    private int mPage; 

    private RecyclerView mRecyclerView; 
    private RecyclerView.Adapter mCardAdapter; 
    private RecyclerView.LayoutManager mCardLayoutManager; 

    DatabaseReference mDatabaseReference; 
    FirebaseHelper helper; 


    public static DogFragment newInstance(int page) { 
     DogFragment dogFragment = new DogFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_PAGE, page); 
     dogFragment.setArguments(args); 
     return dogFragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mPage = getArguments().getInt(ARG_PAGE); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View rootView = inflater.inflate(R.layout.fragment_dog, container, false); 

     //cardview 
     mRecyclerView = (RecyclerView)rootView.findViewById(R.id.card_view); 

     //setup firebase 
     mDatabaseReference = FirebaseDatabase.getInstance().getReference(); 
     helper= new FirebaseHelper(mDatabaseReference); 

     //create adapter class 
     //mCardAdapter = new CardViewAdapter(mAimalTypeList); 
     mCardAdapter = new CardViewAdapter(getActivity().getApplicationContext(), helper.retrieve()); 
     mRecyclerView.setAdapter(mCardAdapter); 

     //add linear layout manager 
     mCardLayoutManager = new LinearLayoutManager(getActivity()); 
     mRecyclerView.setLayoutManager(mCardLayoutManager); 

     //preparePetData(); 

     return rootView; 
    } 
} 

Picasso:

public class PicassoClient { 

    public static void downloadImage(Context context, String url, ImageView img){ 
     if(url != null && url.length()>0){ 
      Picasso.with(context).load(url).placeholder(R.drawable.placeholder).into(img); 
     } 
     else { 
      Picasso.with(context).load(R.drawable.placeholder).into(img); 
     } 
    } 
} 

Antwort

1

Ihr Anruf an helper.retrieve() beginnt mDatabase.addChildEventListener, deren Ergebnisse asynchron zurückkommen .... in der Zwischenzeit geben Sie eine leere Liste von dieser Methode zurück (Standardwert von animal). Sie müssen den Adapter aktualisieren, wenn die Ergebnisse zurückkommen (nachdem Sie fetchData(dataSnapshot); aufgerufen haben)

+0

Danke, ich dachte mir, dass so etwas passiert. Ich bin relativ neu in der Android-Programmierung. Wie gehe ich vor, um den Adapter zu aktualisieren, sodass die Daten tatsächlich ausgefüllt werden, wenn die Ergebnisse zurückkommen? – DessertsAndStuff

+0

Es gibt ein paar Möglichkeiten, wie Sie es tun können. Eine Option ist das Hinzufügen einer Art "update" (List animalData) Methode zu Ihrem Adapter, die Sie aufrufen würden, nachdem Sie Ergebnisse erhalten haben (und 'notifyDataSetChanged' aufrufen) in dieser Methode). –

+0

Danke! Was ich am Ende getan habe, ist fetchData zu verschieben und in das Hauptfragment zu laden, so dass ich notifyDataSetchanged einfach hinzufügen kann – DessertsAndStuff

Verwandte Themen