如何使用Firebase列表适配器

8
我正在尝试按照这个教程操作:https://www.youtube.com/watch?v=2J6spwAVP0M,但是在我复杂的应用程序中实现时并没有奏效,所以我试着从头开始。
我创建了这个简单的 MainActivity:
public class MainActivity extends AppCompatActivity{

    Firebase mRef;
    com.firebase.ui.FirebaseListAdapter<String> myAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRef = new Firebase("https://<myURL>..");

        myAdapter = new FirebaseListAdapter<String>(this,String.class,android.R.layout.simple_list_item_1,mRef) {
            @Override
            protected void populateView(View view, String s, int i) {
                TextView text = (TextView)view.findViewById(android.R.id.text1);
                text.setText(s);

            }
        };
        Button addBtn = (Button) findViewById(R.id.add_button);
        addBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mRef.push().setValue("test123");
            }
        });
    }
}

现在我有几个问题:

1)是什么触发了populateView?我无法使其运行。

2)android.R.layout.simple_list_item_1应该被替换为什么?我尝试创建自己的listview并将上述内容替换为我的R.id.listView,但没有任何反应。我不知道这个魔法是怎么起作用的。

3)即使是这个简单的应用程序也没有运行。按钮确实将“test123”添加到服务器的正确位置,但我在应用程序中看不到任何东西。出了什么问题?


android.R.layout.simple_list_item_1 是一个包含一个 TextView 的布局。使用它将会 toString 列表中的所有对象。 - OneCricketeer
请参考以下链接:https://github.com/android/platform_frameworks_base/blob/master/core/res/res/layout/simple_list_item_1.xml - OneCricketeer
我似乎找不到你在哪里使用你的 myAdapter - AL.
还没有检查过 Firebase 适配器的工作原理,但是你不需要一个 Recycler View 或类似的东西吗? - njzk2
你需要有一个ListView或者其他能够使用适配器的控件。请查看我在回答中提供的示例。 - AL.
2个回答

6

我找到了问题所在,我缺少了一个Listview(列表视图)...

这是已经更正后的代码:

public class MainActivity extends AppCompatActivity {

    Firebase mRef;
    com.firebase.ui.FirebaseListAdapter<String> myAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRef = new Firebase("https://<myURL>..");

        myAdapter = new FirebaseListAdapter<String>(this,String.class,android.R.layout.simple_list_item_1,mRef) {
            @Override
            protected void populateView(View view, String s, int i) {
                TextView text = (TextView) view.findViewById(android.R.id.text1);
                text.setText(s);
            }
        };
        final ListView lv = (ListView) findViewById(R.id.listView);
        lv.setAdapter(myAdapter);

        Button addBtn = (Button) findViewById(R.id.add_button);
        addBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mRef.push().setValue("test123");
            }
        });
    }


}

lv.setAdapter是将适配器与列表相关联并触发populateView的方法。这基本上回答了我三个问题中的所有问题。

以下是xml代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.twodwarfs.firebaselistadapter.MainActivity">


    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="add"
        android:id="@+id/add_button"
        android:layout_alignParentBottom="true"
        android:layout_alignParentEnd="true" />

    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/listView"
        android:layout_toStartOf="@+id/add_button"
        android:layout_below="@+id/textView" />
</RelativeLayout>

你应该接受这个作为正确答案,以正确标记你的问题。干杯! - AL.
1
我还不能,它说我需要等待2天,天知道为什么。 - Yarden Cohen
我明白了。如果您能够的话,请打上标签。谢谢! :) - AL.

3
  1. FirebaseListAdapter.populateView() 文档:

每当给定 Firebase 位置的数据发生更改时,此方法将为需要显示的每个项目调用。参数对应于传递给此类构造函数的 mLayout 和 mModelClass。 您的实现应使用模型中包含的数据填充视图。

  1. 如果您想要自定义列表项的外观,则可以将其替换为自己的自定义布局。如上所述的文档:modelLayout - 这是用于表示单个列表项的布局。您将负责使用 modelClass 实例中的数据填充相应视图的实例。
  1. 我以前没有使用过 FirebaseListAdapter,但您可以查看 Puf 的 示例,可能会清楚地解释问题。我也会检查它,然后看看似乎出了什么问题。

干杯!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接