如何使用FirebaseListAdapter填充ListView?

时间:2016-04-19 18:35:42

标签: android listview firebase listadapter

我正在研究Android项目,它将允许用户找到最近的汽油泵的名称,地址,最重要的是他们的价格。我有一个ListView,我想通过Firebase列表适配器填充它,因为我正在为我的项目使用Firebase。在编写代码之后,我从Firebase中得不到任何东西 - 它只是Android手机上的空白屏幕(在Android Studio中没有显示错误)。

编写setContentView(lview)后;在onCreate()方法的最后,它现在给我错误,活动崩溃。最后我从firebase得到了错误:com.firebase.client.FirebaseException:无法退回到键入

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ListView;
import android.widget.TextView;

import com.firebase.client.Firebase;
import com.firebase.ui.FirebaseListAdapter;

public class testbezinpriser extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
//  setContentView(R.layout.activity_testbezinpriser);
    ListView lview = new ListView(this);


    Firebase.setAndroidContext(this);
    Firebase ref = new Firebase("https://xxxxx.firebaseio.com");

    FirebaseListAdapter<Benzin> Adapter = new FirebaseListAdapter<Benzin>(this, Benzin.class, R.layout.listepriser, ref) {
        @Override
        protected void populateView(View v, Benzin s, int i) {
            ((TextView)v.findViewById(R.id.navnView)).setText(s.getName());
            ((TextView)v.findViewById(R.id.addressView)).setText(s.getAddress());
            ((TextView)v.findViewById(R.id.prisView)).setText(s.getPrice()));

        }
    };
    lview.setAdapter(Adapter);
    setContentView(lview); 
}
}

和Benzin班级

public class Benzin {

String Address;
String Name ;
String Price;

public Benzin(){

}
public Benzin (String Name , String Address , String Price){
    this.Name = Name;
    this.Address = Address;
    this.Price = Price;
}

public String getAddress(){
    return Address;
}

public String getName(){
    return Name;
}
public String getPrice(){
    return Price;
}

}

侦听器的XML布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ImageView
    android:layout_width="80dp"
    android:layout_height="50dp"
    android:id="@+id/logoView"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true"
    android:layout_marginTop="20dp"
    android:src="@drawable/shell"
    android:contentDescription="tankstation_billed" />

<TextView
    android:layout_width="70dp"
    android:layout_height="25dp"
    android:id="@+id/navnView"
    android:layout_alignTop="@+id/logoView"
    android:layout_toEndOf="@+id/logoView"
    android:layout_marginStart="10dp"
    android:textStyle="bold|italic"
    android:textSize="15sp"
    android:textColor="#000000"
    android:text="SHELL"
    android:layout_marginTop="5dp"
    android:textIsSelectable="false" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Måløvhovedgade 38 , Måløv"
    android:id="@+id/addressView"
    android:layout_alignBottom="@+id/logoView"
    android:layout_alignStart="@+id/navnView"
    android:layout_marginBottom="3dp"
    android:textSize="12sp"
    android:textColor="#000000" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="10.99"
    android:id="@+id/prisView"
    android:layout_alignTop="@+id/navnView"
    android:layout_alignParentEnd="true"
    android:layout_marginRight="10dp"
    android:textColor="#000000"
    android:typeface="serif" />

Database view

4 个答案:

答案 0 :(得分:1)

尝试更改Firebase参考。它看起来并不像是指向正确的位置。根据您发布到数据结构的链接,您似乎正在尝试列出存储在/ detail位置的对象。如果真的尝试使用像这样的参考:

Firebase ref = new Firebase("https://xxxxx.firebaseio.com/detail");

答案 1 :(得分:1)

如果你查看Failed to bounce to type异常的完整堆栈跟踪,它会告诉你出了什么问题。

但在这种情况下,您的问题似乎可能是由于JSON中的属性名称以大写字母开头。这可能有用:

public class Benzin {
    public String Address;
    public String Name ;
    public String Price;
}

答案 2 :(得分:0)

之前我没有使用过Firebase,但是不应该将ListView添加到布局中(或从中检索)?

这样的东西
setContentView(R.layout.activity_testbezinpriser);
ListView lview = (ListView)findViewById(R.id.station_list);

activity_testbezinpriser.xml中,应该有ListView,例如

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <ListView
        android:id="@+id/station_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />

</LinearLayout>

答案 3 :(得分:0)

这里只是一个猜测。 你的getPrice()方法返回一个字符串。我认为你需要一个与你获得的属性具有相同返回类型的getter。您可以保留String 1,但它必须是带有签名的方法的补充...

public Double getPrice();

我认为这是因为firebase抱怨它无法确定某个字段匹配的对象的属性。这可能是因为你应该为每个属性提供getter,而Firebase可能不喜欢这个价格是Double,但是你的getter把它变成了一个字符串。这是一个详细的帖子的链接,关于弗兰克如何运作。 Why do I get "Failed to bounce to type" when I turn JSON from Firebase into Java objects?