我有一个类似于以下的firebase数据库 -
"root":
{
"survey":
{
"1":
{
"survey_question":"Who is a better player?",
"options":
{
"1":"Ronaldo",
"2":"Messi"
}
},
"2":
{
"survey_question":"Who is a better superhero?",
"options":
{
"1":"Iron man",
"2":"Captain America"
}
}
}
}
我想在TabLayout中显示调查,以便在一个选项卡上显示一个问题及其选项。调查数量可以动态更改。如果有 n 调查,那么应该有 n 标签来显示它们。每个标签都有相同的布局。
注意: TabLayout存在于一个也包含ViewPager的片段中。
实现此目的的最佳方法是什么?我应该使用FirebaseListAdapter或FirebaseRecyclerAdapter,还是其他任何东西?
编辑:我希望调查以下列格式显示 -
答案 0 :(得分:1)
你可以做这样的事情(伪代码)
public class Survey implements Parcelable {
//.... firebase model class
}
适配器
public class FirebasePagerAdapter extends FragmentStatePagerAdapter {
private List<Survey> surveyList = new ArrayList<>();
private List<Fragment> surveyFragments = new ArrayList<>();
private ValueEventListener valueEventListener;
private DatabaseReference surveyReference;
public FirebasePagerAdapter(FragmentManager fm) {
super(fm);
surveyReference = FirebaseDatabase.getInstance().getReference().child("root/survey");
surveyReference.addEventListener(valueEventListener);
valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
surveyList.clear();
surveyFragments.clear(); // if you implement .equals() in Survey
// you do a for loop that only updates the changed/added/removed items, instead of all of them..
for(DataSnapshot surveySnapshot: snapshot.getChildren()){
String surveyNumber = surveySnapshot.getKey();
Survey survey = surveySnapshot.getValue(Survey.class);
surveyList.add(survey);
surveyFragments.add(SurveyFragment.newInstance(surveyNumber, survey));
}
notifyDataSetChanged();
}
@Override
public void onCancelled(DatabaseError error){
//...
}
};
}
@Override
public Fragment getItem(int position) {
return surveyFragments.get(position);
}
@Override
public int getCount() {
return surveyFragments.size();
}
public void cleanup() {
if (valueEventListener != null) {
surveyReference.removeEventListener(valueEventListener);
}
}
}
您将实施SurveyFragment以将调查对象作为参数,(确保其可分区或可序列化)。 我认为这样的事情在大多数情况下会起作用。 如果surveyList实时更新了它的大小(添加,删除),那么你可以用一个ChildEventListener替换ValueEventListener,但你必须做更多的工作,ADD,DELETE,MOVE ...检查这个旧版本的FirebaseRecyclerAdapter,它具有类似的功能,您需要将其移植到PagerAdapter。
答案 1 :(得分:0)
您可以使用FirebaseRecyclerAdapter执行此操作。
您可以使用此查询来获取问题:
DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("survey");
Query q=ref.orderByChild("survey_question").equalTo(questionhere);
更多信息: