从Firebase数据库填充ListView

时间:2016-12-30 02:25:17

标签: android firebase firebase-realtime-database firebaseui

我有一个从Firebase数据库填充的ListView:

这是我的代码:

final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReferenceFromUrl(".../comunidades");

    FirebaseListAdapter<String> firebaseListAdapter = new FirebaseListAdapter<String>(
            this.getActivity(),
            String.class,
            android.R.layout.simple_list_item_1,
            databaseReference
    ) {
        @Override
        protected void populateView(View v, String model, int position) {
            TextView textView = (TextView) v.findViewById(android.R.id.text1);
            textView.setText(model);
            mProgress.dismiss();

        }
    };

这是此数据库的Firebase控制台,分支:“comunidades”:

enter image description here

但是我在另一个片段中使用相同的代码用来自同一数据库的另一个分支的对象填充listview,但是我收到了错误。

这是新代码:

final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReferenceFromUrl(".../Enclaves");

    FirebaseListAdapter<String> firebaseListAdapter = new FirebaseListAdapter<String>(
            this.getActivity(),
            String.class,
            android.R.layout.simple_list_item_1,
            databaseReference
    ) {
        @Override
        protected void populateView(View v, String model, int position) {
            TextView textView = (TextView) v.findViewById(android.R.id.text1);
            textView.setText(model);


        }
    };

我应该更改什么才能从分支“Enclaves”中获取键“Nombre_enclave”的值:

enter image description here

1 个答案:

答案 0 :(得分:4)

enclaves下的内容不是String + String对的列表。相反,它是一个String + Object对列表,每个对象都有一个Comunidad_enclave,Descripcion_enclave等。

实现这项工作的最快方法是确定要显示的属性,然后覆盖parseSnapshot()

FirebaseListAdapter<String> firebaseListAdapter = new FirebaseListAdapter<String>(
        this.getActivity(),
        String.class,
        android.R.layout.simple_list_item_1,
        databaseReference
) {
    @Override
    protected String parseSnapshot(DataSnapshot snapshot) {
        return snapshot.child("Comunidad_enclave").getValue(String.class);
    }

    @Override
    protected void populateView(View v, String model, int position) {
        TextView textView = (TextView) v.findViewById(android.R.id.text1);
        textView.setText(model);
    }
};

解决此问题的更好方法是创建一个代表每个comunidad的类。最简单的形式可能是这样的:

class Comunidad {
    public String Comunidad_enclave;
    public String Descripcion__enclave;
    // TODO: the same for the other properties
}

使用此类,您可以创建类型为Comunidad的适配器:

FirebaseListAdapter<Comunidad> firebaseListAdapter = new FirebaseListAdapter<Comunidad>(
        this.getActivity(),
        String.class,
        android.R.layout.simple_list_item_2,
        databaseReference
) {
    @Override
    protected void populateView(View v, Comunidad model, int position) {
        TextView textView1 = (TextView) v.findViewById(android.R.id.text1);
        textView1.setText(model.Comunidad_enclave);
        TextView textView2 = (TextView) v.findViewById(android.R.id.text2);
        textView2.setText(model.Descripcion_enclave);
    }
};