代码之家  ›  专栏  ›  技术社区  ›  ZZ.IT

如何使用FirebaseListAdapter填充ListView?

  •  2
  • ZZ.IT  · 技术社区  · 8 年前

    我正在进行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); 
    }
    }
    

    和苯类

    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 回复  |  直到 8 年前
        1
  •  1
  •   Frank van Puffelen    8 年前

    如果查看 Failed to bounce to type 例外,它会告诉你出了什么问题。

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

    public class Benzin {
        public String Address;
        public String Name ;
        public String Price;
    }
    
        2
  •  1
  •   Kevin O'Neil    8 年前

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

    Firebase ref = new Firebase("https://xxxxx.firebaseio.com/detail");
    
        3
  •  0
  •   Community Michael Schmitz    7 年前

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

    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?

        4
  •  0
  •   Cliabhach    8 年前

    我以前没有使用过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>