2017-11-20 5 views
-3

My Firebase私には3つの質問があります。私はアプリを作っていて、問題に遭遇しました。私はFirebaseのすべてのデータを持っていますが、それを取得することはできますが、クリックすると、そのアルバムのトラックを含む新しいインテントが開きます。また、いくつかのアルバムにはボーナストラックが含まれているので、それらを表示する方法も知りたいですか?私が得ることができるあらゆる種類の援助に感謝します。以下は私のコードです:フラグメント内でonItemClickListennerを使用していますか?

私は(私のために)問題を解決した方法
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;} 
} 

答えて

1

あなたは、文字列で(バイトをこのようなデータを渡すことができ意図
Intent yourIntent = new Intent(getActivity(), yourAlbumActivity.class); intent.putExtra("album_title", "title"); startActivity(intent); を介してデータを渡します配列、整数など)、オブジェクトを送信することはできません。したがって、オブジェクトをシリアル化する必要があります(クラスはSerializable - >すべてのサブクラスを実装する必要があります)。あなたは、単に変数を設定することができアプリケーションを拡張するクラスを持っている場合は、あなただけでは、この変数を設定することができます例えば

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

、あなたのアプリケーションクラス 内の参照を設定し

アプリケーションクラス。変数を得ることができます((YourApplication)getApplication()).album

これは私の問題を解決した私の2つのアプローチでした。

+0

私の主な問題は、自分のアルバムをクリックできるように設定する方法です(コードの最初の部分(onItemClick)を見ることができます)。クリックすると、新しいインテントがリストで開きますそのアルバムのトラックの。また、私はアプリケーションを拡張するクラスがありません。 – JoelTRowe

+0

ええ、onClickに新しいインテントを開始してください(カスタム配列アダプターから項目を取得してください)。フラグメントから、アプリケーションをgetActivity()から取得する必要があります。getApplication()(アプリケーションを拡張するクラスにアプリケーションをキャストする必要があります) – Konrad

+0

Ok ...新しいインテントonClickを開始し、クリックすると新しい空を開きますアクティビティ。次に、私は次のことをどうやって管理するのですか:クリックしたら、空のアクティビティに自分のトラックが含まれています。さて、私はIntent(別のアクティビティでいくつかのテキストを表示する)の基本を知っていますが、トラックをどのように表示するかわからないので、それらがFirebase上にあるため、何とか検索する必要があります。どのようにすればいいか分かりますか?もう1つ、私のクラスのアルバムは今すぐSerializableを実装します。自分の投稿を私の投稿(My Firebase)の最初にチェックすることができます。 – JoelTRowe

関連する問題