如何使用Java在Firebase中用id为xxxx的数据填充RecyclerView



我有问题&我的Firebase中的答案。每个问题和答案都有自己的id。

MyFirebase
 -answers
 -questions

我用问题填充了recyclerView,当用户点击任何问题时,将启动一个新的活动,显示问题的详细信息。现在我需要显示该问题的所有答案。Firebase中的每个答案都有一个问题ID,该问题属于哪个答案。

那么,如何获得带有身份证的问题的答案呢?是否有类似的方法来过滤数据,如SQL中WHERE QuestionId=XXXX

mFirebaseRef = new Firebase("http://myapp.firebaseio.com/answers");
        final ListView listView = (ListView) findViewById(R.id.answerList);
        mListAdapter = new FirebaseListAdapter<Answers>(this, Answers.class,
                R.layout.single_answer_item, mFirebaseRef) {
            @Override
            protected void populateView (View v, Answers answers, int position) {
                ((TextView)v.findViewById(R.id.answer)).setText(answers.getAnswer());
                ((TextView)v.findViewById(R.id.authorid)).setText(answers.getAuthorid());
                ((TextView)v.findViewById(R.id.questionid)).setText(answers.getQuestionid());
                                }
        };
        listView.setAdapter(mListAdapter);

更新的代码

   mFirebaseRef = new Firebase("https://myapp.firebaseio.com/answers");
    Query queryRef = mFirebaseRef.orderByChild("questionid").equalTo(QidText.toString());
ListView listView = (ListView) findViewById(R.id.answerList);
mListAdapter = new FirebaseListAdapter<Answers>(this, Answers.class,
        R.layout.single_answer_item, queryRef) {
    @Override
    protected void populateView (View v, Answers answers, int position) {
        ((TextView) findViewById(R.id.answer)).setText(answers.getAnswer());
        ((TextView) findViewById(R.id.authorid)).setText(answers.getAuthorid());
        ((TextView) findViewById(R.id.questionid)).setText(answers.getQuestionid());

    }
};
listView.setAdapter(mListAdapter);

数据段

myapp:

 -questions
     --KDi2YLc2nzdvJXvntYC
         ---body: "How to create simple q&a android App using Firebase?"
         ---qid:  "-KDi2YLc2nzdvJXvntYC"
         ---title:"How to create simple q&a App?"
         ---topic:"android"
         ---userid:"Admin"
-answers
   --KDi2c8M8sLcSnGLTc8A
    ---answer: "That's very easy, just read Firebase docs"
    ---authorid: "Frank"
    ---questionid:"-KDi2YLc2nzdvJXvntYC"
  --KDi2tiKDnDszAFTRUsE
    ---answer: "hello world"
    ---authorid: "Anna"
    ---questionid:"-KDi2YLc2nzdvJXvntYC"

您可以在以下位置阅读Firebase的文档:https://www.firebase.com/docs/android/guide/retrieving-data.html

answerRef.orderByChild("question_id").equalTo(id);

您可以将Firebase引用或Firebase Query传递到FirebaseListAdapter的构造函数中。

mFirebaseRef = new Firebase("http://myapp.firebaseio.com/answers");
Query queryRef = mFirebaseRef.orderByChild("questionid").equalTo(QuestionidText.toString();
mListAdapter = new FirebaseListAdapter<Answers>(
                    this, Answers.class,
                    R.layout.single_answer_item, queryRef) {

更新(3月26日下午3:46):

我刚刚将这个类Activity36160819添加到我的Github示例repo中,它显示了所需的最低代码:

public class Activity36160819 extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ListView answersList = new ListView(this);
        Firebase.setAndroidContext(this);
        Firebase ref = new Firebase("https://stackoverflow.firebaseio.com/36160819/answers");
        Query queryRef = ref.orderByChild("questionid").equalTo("-KDi2YLc2nzdvJXvntYC");
        FirebaseListAdapter<DataSnapshot> adapter = new FirebaseListAdapter<DataSnapshot>(this, DataSnapshot.class,
                android.R.layout.two_line_list_item, queryRef) {
            @Override
            protected DataSnapshot parseSnapshot(DataSnapshot snapshot) {
                return snapshot;
            }
            @Override
            protected void populateView (View v, DataSnapshot answer, int position) {
                ((TextView)v.findViewById(android.R.id.text1)).setText(answer.child("authorid").getValue().toString());
                ((TextView)v.findViewById(android.R.id.text2)).setText(answer.child("answer").getValue().toString());
            }
        };
        answersList.setAdapter(adapter);
        setContentView(answersList);
    }
}

对应的JSON:

{
  "questions": {
    "-KDi2YLc2nzdvJXvntYC": {
        "body": "How to create simple q&a android App using Firebase?",
        "qid": "-KDi2YLc2nzdvJXvntYC",
        title: "How to create simple q&a App?",
        topic: "android",
        userid: "Admin"
    }
},
answers: {
    "-KDi2c8M8sLcSnGLTc8A": {
        answer: "That's very easy, just read Firebase docs",
        authorid: "Frank",
        questionid: "-KDi2YLc2nzdvJXvntYC"
    },
    "-KDi2tiKDnDszAFTRUsE": {
        answer: "hello world",
        authorid: "Anna",
        questionid: "-KDi2YLc2nzdvJXvntYC"
    }
  }
}

代码中的问题:

  • 您正在活动布局的populateView()中查找视图,但它们是项目布局的一部分:v.findViewById()
  • 嗯。。。我以为还有一件事,但我已经忘记了。如果它回到我身边,我会添加它;否则,这将仍然是一个列表

除此之外,请仔细记下我的答案是多么的简单和完整。我做的事情与你的问题不同:

  • 我包含了实际的JSON,您可以通过单击Firebase数据库中的Export按钮轻松获得它。将JSON作为文本使其可搜索,使我们能够轻松地使用它来测试您的实际数据,并在我们的答案中使用它,这通常是一件好事
  • 我不使用Answers类。虽然使用这样一个类是好的(一般来说是件好事),但它与问题无关。但是,如果您认为相关,请在您的问题中包含最少的代码,这样我们就不必编造了
  • 我在代码中构造了ListView。我以前从未这样做过,但这意味着我不需要在答案中包含布局XML

对于下一个问题,请做你问题中的那些事情。你越容易为知道答案的人工作,他们就越有可能(迅速)回答。阅读这篇关于最小、完整、可验证示例的文章,了解更多信息。

最新更新