如何在RecyclerView中访问许多嵌套子Firebase Realtime数据库?

时间:2019-02-07 15:31:38

标签: java android firebase-realtime-database

这里有人可以帮助我吗?

如何在下图的第二个显示屏上的recyclerView中显示“情节”和“ Pemeran”部分。

我使用与“ liveTV”相同的方法,但是由于Episode和Pemeran表中有许多子代,所以它不起作用/什么也没有出现?

请帮助,谢谢

Firebase实时数据库图片]

firebase


应用概念

concept

dbDrakorAdapter.java -模型

public class dbDrakorAdapter {
private String LinkMovie;
private String List;
private String FotoPemain;
private String NamaPemain;


public dbDrakorAdapter (String linkMovie, String list, String fotoPemain, String namaPemain) {
    LinkMovie = linkMovie;
    List = list;
    FotoPemain = fotoPemain;
    NamaPemain = namaPemain;


}
public class Episode {
    List<EpisodeDetails> episodeDetails;
}

public class EpisodeDetails {
   // public Long chapterId;
    public String LinkMovie;
    public String List;
}
public class Pemeran {
    List<PemeranDetails> pemeranDetails;
}

public class PemeranDetails {
    // public Long chapterId;
    public String LinkMovie;
    public String List;
}
@PropertyName("LinkMovie")
public String getLinkMovie() { return LinkMovie; }
@PropertyName("List")
public String getList() { return List; }
@PropertyName("FotoPemain")
public String getFotoPemain() { return FotoPemain; }
@PropertyName("NamaPemain")
public String getNamaPemain() { return NamaPemain; }

@Exclude
public Map<String, Object> toMap() {
    HashMap<String, Object> result = new HashMap<>();
    result.put("List", List);
    result.put("LinkMovie", LinkMovie);
    result.put("FotoPemain", FotoPemain);
    result.put("NamaPemain", NamaPemain);
    return result;
}
}

DrakorActivity.Java

public class DrakorActivity extends AppCompatActivity {

private RecyclerView mEpisodeRV,mPemeranRV;
private FirebaseRecyclerAdapter<dbDrakorAdapter, DrakorActivity.ListEpisode> mListEpisodeAdapter;
private FirebaseRecyclerAdapter<dbDrakorAdapter, DrakorActivity.ListPemeran> mListPemeranAdapter;

FirebaseDatabase firebaseDatabase;
DatabaseReference databaseReference;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_drakor);

    DatabaseReference database = FirebaseDatabase.getInstance().getReference("SerialDrakor").child("Episode");
    Query personsQuery = database.orderByKey();
    mEpisodeRV = (RecyclerView) findViewById(R.id.cRecylerDrakorEpisode);
    mEpisodeRV.setHasFixedSize(true);
    mEpisodeRV.setLayoutManager(new LinearLayoutManager(this));
    FirebaseRecyclerOptions personsOptions = new FirebaseRecyclerOptions.Builder<dbDrakorAdapter>().setQuery(personsQuery, dbDrakorAdapter.class).build();

    mListEpisodeAdapter = new FirebaseRecyclerAdapter<dbDrakorAdapter, ListEpisode>(personsOptions) {

        @Override
        protected void onBindViewHolder(DrakorActivity.ListEpisode holder, int position, final dbDrakorAdapter model ) {
            holder.setList(model.getList());

            holder.mView.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {
                    Toast.makeText(DrakorActivity.this,"Ini Hanya Iklan , Tidak Dapat Digunakan",Toast.LENGTH_LONG).show();
                }
            });
        }


        @Override
        public DrakorActivity.ListEpisode onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.item_drakor_episode, parent, false);

            return new DrakorActivity.ListEpisode(view);


        }



    };
    LinearLayoutManager layoutManager = new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false);
    mEpisodeRV.setLayoutManager(layoutManager);
    mEpisodeRV.setAdapter(mListEpisodeAdapter);

}
@Override
public void onStart() {
    super.onStart();
    mListEpisodeAdapter.startListening();
  //  mListPemeranAdapter.startListening();

}

@Override
public void onStop() {
    super.onStop();
    mListEpisodeAdapter.stopListening();
  //  mListPemeranAdapter.stopListening();

}

//Episode
public static class ListEpisode extends RecyclerView.ViewHolder{
    View mView;
    public ListEpisode(View itemView){
        super(itemView);
        mView = itemView;
    }
    public void setList (String list){
        TextView post_title = (TextView)mView.findViewById(R.id.TxtlistEpisode);
        post_title.setText(list);
    }
}

activity_drakor.xml

<LinearLayout
    android:id="@+id/drakorLyEpisode"
    android:layout_width="match_parent"
    android:layout_height="30dp"
    android:layout_below="@id/drakorThumbnail"
    android:background="@color/colorAccent"

    android:orientation="horizontal">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/cRecylerDrakorEpisode"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.v7.widget.RecyclerView>
</LinearLayout>

item_drakor_episode.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="60dp"
android:layout_height="30dp"
android:orientation="horizontal"

xmlns:app="http://schemas.android.com/apk/res-auto">

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:cardBackgroundColor="#090000"
    app:cardCornerRadius="15dp">

    <TextView
        android:id="@+id/TxtlistEpisode"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textColor="#ffffff"
        android:textSize="20dp"
        android:text="1"
        android:textAlignment="center"
        android:textStyle="bold" />
</android.support.v7.widget.CardView>

2 个答案:

答案 0 :(得分:0)

您的FirebaseRecyclerAdapters使用相同的POJO,但是它们将显示不同的信息。 例如:

FirebaseRecyclerAdapter<EpisodePojo, DrakorActivity.ListEpisode> listEpisodesAdapter
FirebaseRecyclerAdapter<PemeranPojo, DrakorActivity.ListPemeran> listPemeranAdapter

您的代码未显示任何信息,可能是因为您的DatabaseReference试图访问“ Episode作为SerialDrakor的子代”,但是“ SerialDrakor”是对象列表,因此,您的代码将无法解析“ “ SerialDrakor”孩子变成“情节”。

您必须以列表的形式检索“ SerialDrakor”,并使用该列表中所需的子代来检索其中的“片段”和“ Pemeran”。

在这里您可以看到一些示例,使用自定义解析器可能是个好主意。

https://github.com/firebase/FirebaseUI-Android/tree/master/database#using-the-firebaserecycleradapter

更新:我要做的是创建一个解析“ SerialDrakor”项目的类。

class SerialDrakor {
   List<Episode> episodeList;
   List<Pemeran> pemeranList;

   .....
}

然后使用查询来检索“ SerialDrakor”

DatabaseReference database = FirebaseDatabase.getInstance().getReference();
Query serialDrakorQuery = database.child("SerialDrakor").orderByKey();
FirebaseRecyclerOptions personsOptions = new FirebaseRecyclerOptions.Builder<SerialDrakor>().setQuery(serialDrakorQuery, new SnapshotParser<SerialDrakor>() {
@Override
public SerialDrakor parseSnapshot(@NonNull DataSnapshot snapshot) {
   // Here fetch the data you want and pass it to your adapters
}

希望对您有帮助。

答案 1 :(得分:0)

深入了解您的Firebase结构后,很难像您所说的那样查询。因此您可以按以下方式更改您的Firebase结构

Episode
     |
     |__Unique_Key
           |
           |__LinkMovie:"asasa.com
           |__List:"1"
           |__Epi:"1"
  Pemeran
      |
      |__UniqueKey
             |__fotoPermain:"...."
             |__NamaPemain:"Ronny"
             |__permeranId:"1"

此处,情节​​中的子节点1和firebase结构中的pemeran节点将替换为唯一键的子节点。 您可以通过push()

生成唯一密钥