如何使用 FirebaseListAdapter 填充 ListView?
How to populate a ListView using a FirebaseListAdapter?
我正在从事 Android 项目,该项目将允许用户找到最近的加油站的名称、地址,最重要的是它们的价格。我有一个 ListView,我想通过 Firebase 列表适配器填充它,因为我正在为我的项目使用 Firebase。现在,在编写代码后,我没有从 Firebase 获得任何信息——它只是 Android phone 上的空白屏幕(Android Studio 中没有显示错误)。
写完setContentView(lview);在 onCreate() 方法的末尾,它现在给我错误并且 activity 崩溃。最后我从 firebase 得到了错误: com.firebase.client.FirebaseException: Failed to bounce to type
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);
}
}
和苯并 class
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 listepriser 的布局
<?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" />
我以前没有使用过 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>
这里只是猜测。
您的 getPrice() 方法 return 是一个字符串。我认为您需要一个 getter 与您得到的 属性 具有相同的 return 类型。您可以保留 String 一个,但它必须与具有签名的方法一起使用...
public 双getPrice();
我认为这是因为 firebase 抱怨它无法确定某个字段匹配的对象的 属性 是什么。这可能是因为您应该为每个 属性 提供 getter,而 Firebase 可能不喜欢 price 是一个 Double 但您的 getter 将它变成了一个字符串。这是一个 link 到 post 的详细说明,由 Frank 讲述这一切是如何运作的。
尝试更改您的 Firebase 参考。它看起来不像指向正确的位置。根据您发布到数据结构的 link ,您似乎在尝试列出存储在 /detail 位置的对象。如果是这样,请尝试使用这样的 ref:
Firebase ref = new Firebase("https://xxxxx.firebaseio.com/detail");
如果您查看 Failed to bounce to type
异常的完整堆栈跟踪,它会告诉您哪里出了问题。
但在这种情况下,您的问题似乎可能是由于 JSON 中的 属性 名称以大写字母开头。这可能有效:
public class Benzin {
public String Address;
public String Name ;
public String Price;
}
我正在从事 Android 项目,该项目将允许用户找到最近的加油站的名称、地址,最重要的是它们的价格。我有一个 ListView,我想通过 Firebase 列表适配器填充它,因为我正在为我的项目使用 Firebase。现在,在编写代码后,我没有从 Firebase 获得任何信息——它只是 Android phone 上的空白屏幕(Android Studio 中没有显示错误)。
写完setContentView(lview);在 onCreate() 方法的末尾,它现在给我错误并且 activity 崩溃。最后我从 firebase 得到了错误: com.firebase.client.FirebaseException: Failed to bounce to type
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);
}
}
和苯并 class
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 listepriser 的布局
<?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" />
我以前没有使用过 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>
这里只是猜测。
您的 getPrice() 方法 return 是一个字符串。我认为您需要一个 getter 与您得到的 属性 具有相同的 return 类型。您可以保留 String 一个,但它必须与具有签名的方法一起使用...
public 双getPrice();
我认为这是因为 firebase 抱怨它无法确定某个字段匹配的对象的 属性 是什么。这可能是因为您应该为每个 属性 提供 getter,而 Firebase 可能不喜欢 price 是一个 Double 但您的 getter 将它变成了一个字符串。这是一个 link 到 post 的详细说明,由 Frank 讲述这一切是如何运作的。
尝试更改您的 Firebase 参考。它看起来不像指向正确的位置。根据您发布到数据结构的 link ,您似乎在尝试列出存储在 /detail 位置的对象。如果是这样,请尝试使用这样的 ref:
Firebase ref = new Firebase("https://xxxxx.firebaseio.com/detail");
如果您查看 Failed to bounce to type
异常的完整堆栈跟踪,它会告诉您哪里出了问题。
但在这种情况下,您的问题似乎可能是由于 JSON 中的 属性 名称以大写字母开头。这可能有效:
public class Benzin {
public String Address;
public String Name ;
public String Price;
}