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;}
}
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
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
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