我们可以使用FirebaseListAdapter在android中填充TabLayout吗?

时间:2018-03-07 13:24:11

标签: java android firebase

我有一个类似于以下的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,还是其他任何东西?

编辑:我希望调查以下列格式显示 -

Display surveys GIF

2 个答案:

答案 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。

https://github.com/firebase/FirebaseUI-Android/blob/version-1.0.0/database/src/main/java/com/firebase/ui/database/FirebaseRecyclerAdapter.java

https://github.com/mmazzarolo/firebase-recyclerview/blob/master/app/src/main/java/com/example/matteo/firebase_recycleview/FirebaseRecyclerAdapter.java

答案 1 :(得分:0)

您可以使用FirebaseRecyclerAdapter执行此操作。

您可以使用此查询来获取问题:

DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("survey");
Query q=ref.orderByChild("survey_question").equalTo(questionhere);

更多信息:

https://github.com/firebase/FirebaseUI-Android