2017-11-20 2 views
-3

My Firebase Ich habe drei Fragen. Ich mache eine App und stolperte über ein Problem. Ich habe alle meine Daten auf Firebase, und ich schaffe es, sie wiederherzustellen, aber ich weiß nicht, wie ich meine Alben anklickbar machen kann, in der Art, wenn du darauf klickst, es öffnet eine neue Absicht, die Spuren dieses Albums enthält. Außerdem enthalten einige Alben eine Bonus-Spur, also möchte ich wissen, wie man sie auch anzeigt? Ich bin dankbar für jede Art von Hilfe, die ich bekommen kann. Unten ist mein Code:Verwenden von OnItemClickListenner in Fragmenten?

public class AlbumsFragment extends Fragment implements ValueEventListener{ 

    public static final String LOG_TAG = "FB_database_tag"; 
    public static final String DB_NAME = "MetalApp"; 
    @BindView(R.id.lvAlbums) ListView lvAlbums; 

    public static final String TITLE = "Albums"; 
    public static final String ALBUMS = "Albums"; 
    private DatabaseReference mDatabaseReference; 
    private AlbumsAdapter adapter; 

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

    public AlbumsFragment() {} 


    @Nullable 
    @Override 
    public View onCreateView(final LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.albums_fragment, container, false); 
     ButterKnife.bind(this,view); 
     this.mDatabaseReference = FirebaseDatabase.getInstance().getReference(DB_NAME).child(ALBUMS); 
     this.mDatabaseReference.addValueEventListener(this); 
     lvAlbums.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { 



      } 
     }); 
     return view; 
    } 

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
     if(this.mDatabaseReference != null){ 
      this.mDatabaseReference.removeEventListener(this); 
     } 
    } 

    @Override 
    public void onDataChange(DataSnapshot snapshot) { 


     Log.d(LOG_TAG, snapshot.getChildrenCount()+""); 
     Log.d(LOG_TAG, snapshot.getKey()+""); 

     List<Album> albumFireList = new ArrayList<>(); 
     Object obj = snapshot.getValue(); 
     albumFireList = mapAlbums((HashMap<String, HashMap>) obj); 
     Collections.sort(albumFireList, new Comparator<Album>() { 
      @Override 
      public int compare(Album album, Album a1) { 
       return album.getYear() - a1.getYear(); 
      } 
     }); 

     adapter = new AlbumsAdapter(albumFireList); 
     this.lvAlbums.setAdapter(adapter); 

    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

     Log.e(LOG_TAG, databaseError.getMessage()); 

    } 

    private List<Album> mapAlbums(HashMap<String, HashMap> map) 
    { 
     List<Album> result = new ArrayList<>(); 
     Set<String> keys = map.keySet(); 
     for (String key : keys) { 
      HashMap<String, Object> album = map.get(key); 
      String id = (String) album.get("id"); 
      String publisher = (String) album.get("publisher"); 
      String title = (String) album.get("title"); 
      List<Track> tracks = mapTracks((HashMap)album.get("tracks")); 
      long year = (long) album.get("year"); 
      Album a = new Album(id, publisher, title, tracks,(int)year); 
      result.add(a); 
     } 

     return result; 
    } 

    private List<Track> mapTracks(HashMap<String, Object> trackMap) 
    { 
     List<Track> result = new ArrayList<>(); 
     Set<String> keys = trackMap.keySet(); 
     for (String key : keys) { 
      String id = (String) trackMap.get("id"); 
      String title = (String) trackMap.get("title"); 
      Track t = new Track(id, title); 
      result.add(t); 
     } 

     return result; 
    } 

} 


public class Album { 

    String mId; 
    String mPublisher; 
    String mTitle; 
    List<Track> mTracks; 
    // List<Bonus> mBonus;// 
    int mYear; 

    public Album() {} 

    public Album(String id, String publisher, String title, List<Track> tracks, int year) { 
     this.mId = id; 
     this.mPublisher = publisher; 
     this.mTitle = title; 
     this.mTracks = tracks; 
     // this.mBonus = bonus; 
     this.mYear = year; 
    } 

    public String getId() {return mId;} 

    public void setId(String Id) {this.mId = mId;} 

    public String getPublisher() {return mPublisher;} 

    public void setPublisher(String publisher) {this.mPublisher = publisher;} 

    public String getTitle() {return mTitle;} 

    public void setTitle(String title) {this.mTitle = title;} 

    public List<Track> getTracks() {return mTracks;} 

    public void setTracks(List<Track> tracks) {this.mTracks = tracks;} 

    /* public List<Bonus> getBonus() {return mBonus;} 

    public void setBonus(List<Bonus> bonus) {this.mBonus = bonus;}*/ 

    public int getYear() {return mYear;} 

    public void setYear(int year) {this.mYear = year;} 
} 

Antwort

1

Wie ich das Problem (für mich) gelöst:

die Daten durch die Absicht
Intent yourIntent = new Intent(getActivity(), yourAlbumActivity.class); intent.putExtra("album_title", "title"); startActivity(intent); Sie die Daten wie diese passieren könnte (mit String, Byte Array, Integer usw.), aber Sie können keine Objekte senden. Daher müssen Sie das Objekt serialisieren (Ihre Klasse muss Serializable -> und alle Unterklassen implementieren).

eine Referenz in Ihrer Anwendungsklasse Set Wenn Sie eine Klasse, die Anwendung erweitert Sie einfach eine Variable, zB

[YourApplication.java] public YourApplication extends Application { public Album album = null; }

Dann können Sie einfach in die diese Variable Anwendungsklasse. Sie können die Variable durch

bekommen Das waren meine zwei Ansätze, die das Problem für mich gelöst.

+0

Vielen Dank für die schnelle Antwort, aber mein Hauptproblem ist, wie Sie meine Alben anklickbar (Sie können das am Anfang von meinem Code (onItemClick) sehen), und wenn Sie darauf klicken Ich möchte neue Intent mit der Liste öffnen dieses Albums Tracks. Außerdem habe ich keine Klasse, die die Anwendung erweitert. – JoelTRowe

+0

Ja, starten Sie eine neue Absicht auf onClick (Holen Sie sich das Element von Ihrem benutzerdefinierten Array-Adapter). Von einem Fragment müssen Sie die Anwendung von getActivity() erhalten. GetApplication() (Anwendung muss in Ihre Klasse umgewandelt werden, die Anwendung erweitert) – Konrad

+0

Ok ... Ich habe eine neue Absicht onClick gestartet, und wenn ich darauf klicke öffnet sich eine neue leere Aktivität. Nun, wie schaffe ich es als nächstes: Beim Klick möchte ich, dass die leere Aktivität meine Tracks enthält. Jetzt weiß ich, wie man die Basis intendiert (zeige etwas Text in einer anderen Aktivität), aber ich weiß nicht, wie man Tracks zeigt, weil sie auf Firebase sind, und ich denke, ich sollte sie irgendwie zurückholen. Hast du eine Idee, wie ich das machen soll? Eine weitere Sache, meine Klasse Album implementiert nun Serializable. Du kannst meine FB am Anfang meines Posts (My Firebase) überprüfen. – JoelTRowe

Verwandte Themen