2016-09-22 5 views
0

Ich verwende Firebase als eine Datenbank für meine App. Ich habe ein Problem, wenn ich mein ListView mit Firebase füllen möchte.Verwenden von Firebase zum Auffüllen meines ListView

Hier ist ein Bild von dem Ergebnis, Code und Datenbank, die ich verwende. Ich frage mich also, ob das Problem mit dem Code oder der Struktur meiner Datenbank zusammenhängt. Vielen Dank.

Ergebnis - Das Ergebnis sollte eigentlich sein: Das Wort Test da sein sollte, wo der Link ist, sondern als ein neues Element seiner hinzugefügt:

Firebase Datenbank:

Dies ist die Methode, die ich meine Listview zu füllen verwenden:

private void populateUserInfoList() { 
    firebase = new Firebase("https://top-ten-317ef.firebaseio.com"); 
    firebase.child("ToptenListItem").addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot snapshot) { 

      for (DataSnapshot child : snapshot.getChildren()) { 
       String TopTitle = (String) child.getValue(Boolean.parseBoolean("toptitle")); 
       String TopPosterPic = (String) child.getValue(Boolean.parseBoolean("topposter")); 
       ToptenListItem info = new ToptenListItem(TopTitle, TopPosterPic); 
       TopArrayList.add(info); 

      } 
      Collections.addAll(TopArrayList); 
      ToptenItemAdapter adapteri = new ToptenItemAdapter(getContext(), R.layout.itemrow, TopArrayList); 
      itemListView.setAdapter(adapteri); 

     } 

     @Override 
     public void onCancelled(FirebaseError firebaseError) { 
      String message = "Server error. Refresh page"; 
      Toast.makeText(getContext(), message, Toast.LENGTH_SHORT).show(); 
     } 


    }); 
} 
+0

Sie haben ein Bild des JSON-Baums in Ihre Frage eingefügt. Bitte ersetzen Sie dies durch den tatsächlichen JSON als Text, den Sie einfach erhalten, indem Sie in der Firebase-Datenbankkonsole auf die Schaltfläche "Exportieren" klicken. Da der JSON als Text durchsuchbar ist, können wir ihn einfach verwenden, um mit Ihren tatsächlichen Daten zu testen und sie in unserer Antwort zu verwenden, und im Allgemeinen ist dies nur eine gute Sache. –

Antwort

0

Anstatt eine Liste ich schlage vor, Sie RecyclerView zu verwenden, Android erstellt RecyclerView als ListView-Verbesserung, also ja, Sie können eine angehängte Liste mit ListView-Steuerelement erstellen, aber RecyclerView ist einfacher und besser. Mehr erfahren Sie in diesem Beitrag lesen: RecyclerView vs ListView

Sie können aber auch einfach den Adapter für Ihre Liste wiederherstellen eine FirebaseRecyclerAdapter verwenden, die für die Liste die ganze Arbeit tun bevölkern und Sie alle Daten abrufen, die Sie wollen (ich in der Regel Benutzer benutzerdefinierte Objekte in meinem Code, die die Werte meiner Firebase-Datenbank entsprechen, auf diese Weise können Sie sie in Ihrem FirebaseRecyclerAdapter verwenden, um die Daten wiederherzustellen)

Zum Beispiel, hier füllen ich eine Listview von Benutzern mit einem Profilbild mit einem FirebaseRecyclerAdapter:

private void initializeRecyclerAdapter() { 
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); 
    linearLayoutManager.setReverseLayout(true); 
    linearLayoutManager.setStackFromEnd(true); 
    mRecyclerUsersView.setLayoutManager(linearLayoutManager); 

    Query allPostsQuery = FirebaseUtil.getUsersRef(); 
    mAdapter = getFirebaseRecyclerAdapter(allPostsQuery); 
    mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { 
     @Override 
     public void onItemRangeInserted(int positionStart, int itemCount) { 
      super.onItemRangeInserted(positionStart, itemCount); 
      // TODO: Refresh feed view. 
     } 
    }); 

    mRecyclerUsersView.setAdapter(mAdapter); 
} 

private FirebaseRecyclerAdapter<User, UserListViewHolder> getFirebaseRecyclerAdapter(Query query) { 
    return new FirebaseRecyclerAdapter<User, UserListViewHolder>(
      User.class, R.layout.user_row_item, UserListViewHolder.class, query) { 

     @Override 
     protected void populateViewHolder(UserListViewHolder viewHolder, User user, int position) { 
      setupUser(viewHolder, user, position, null); 
     } 

    }; 
} 

private void setupUser(final UserListViewHolder UserViewHolder, final User user, final int position, final String inPostKey) { 
    //Set the items for every new view 
    UserViewHolder.setIcon(user.getPhoto_url()); 
    UserViewHolder.setText(user.getEmail()); 
    final String postKey; 
    if (mAdapter instanceof FirebaseRecyclerAdapter) { 
     postKey = ((FirebaseRecyclerAdapter) mAdapter).getRef(position).getKey(); 
    } else { 
     postKey = inPostKey; 
    } 
    FirebaseUtil.getUsersRef().child(postKey).addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(final DataSnapshot dataSnapshot) { 
      //Add users to the newGroup item 
      UserViewHolder.setPostClickListener(new UserListViewHolder.UserClickListener() { 
       @Override 
       public void onUserClick() { 
        // mNewGroup.addUserToGroup(dataSnapshot.getKey()); 
        mNewGroupUsers.addUserToGroup(dataSnapshot.getKey()); 
       } 
      }); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      //TODO ControlOnCancelled 
     } 
    }); 
} 

Und, wie Sie sehen können, mein User-Objekt so einfach ist (die Namen der Objektvariablen müssen Ihre Feuerbasis Elemente gleich, für Unterebenen Sie HashMaps in Ihrem Objekt verwenden können):

public class User { 
private String display_name; 
private String email; 
private String photo_url; 


    //[...] get/set methods and constructors 

Schließlich ist hier mein viewHolder Benutzerklasse :

public class UserListViewHolder extends RecyclerView.ViewHolder { 
    private final View mView; 
    private static final int POST_TEXT_MAX_LINES = 6; 
    private ImageView mIconView; 
    private TextView mAuthorView; 
    private UserClickListener mListener; 

    public UserListViewHolder(View itemView) { 
     super(itemView); 
     mView = itemView; 
     mIconView = (ImageView) mView.findViewById(R.id.user_image_profile); 
     mAuthorView = (TextView) mView.findViewById(R.id.user_text_profile); 
     mView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mListener.onUserClick(); 
      } 
     }); 
    } 

    public void setIcon(String url) { 
     GlideUtil.loadProfileIcon(url, mIconView); 
    } 

    public void setPostClickListener(UserClickListener listener) { 
     mListener = listener; 
    } 


    public void setText(final String text) { 
     if (text == null || text.isEmpty()) { 
      mAuthorView.setVisibility(View.GONE); 
      return; 
     } else { 
      mAuthorView.setVisibility(View.VISIBLE); 
      mAuthorView.setText(text); 
      mAuthorView.setMaxLines(POST_TEXT_MAX_LINES); 
     } 
    } 

    public interface UserClickListener { 
     void onUserClick(); 
    } 
} 

Fühlen Sie sich frei, irgendwelche Zweifel zu stellen! hoffe, dass es dir hilft!

+0

Kann ich die Viewholder-Klasse sehen –

+0

Ich habe es am Ende des Beitrags hinzugefügt;) –

Verwandte Themen