如何使用 Firebase 列表适配器

How to use Firebase List adapter

我正在尝试学习本教程:

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 究竟应该替换成什么?我尝试创建自己的列表视图并用我的 R.id.listView 替换上面的内容,但没有任何反应。我无法弄清楚这个魔法是如何工作的..

3) 即使这个简单的应用程序也不起作用。按钮确实将 "test123" 添加到服务器上的正确位置,但我在我的应用程序上看不到任何东西。有什么问题吗?

  1. FirebaseListAdapter.populateView() docs:

Each time the data at the given Firebase location changes, this method will be called for each item that needs to be displayed. The arguments correspond to the mLayout and mModelClass given to the constructor of this class. Your implementation should populate the view using the data contained in the model.

  1. 如果您希望列表项具有自定义外观,您可以将其替换为您自己的自定义布局。同样根据上面引用的文档:

modelLayout - This is the layout used to represent a single list item. You will be responsible for populating an instance of the corresponding view with the data from an instance of modelClass.

  1. 我以前没有尝试过使用 FirebaseListAdapter,但您可以查看这个 sample by Puf,可能会解决问题。也会检查一下,然后看看我是否能找出问题所在。

干杯!

我发现出了什么问题,我缺少一个 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.. 这基本上是我所有 3 个问题的答案..

这里还有 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>