【问题标题】:How to populate a ListView using a FirebaseListAdapter?如何使用 FirebaseListAdapter 填充 ListView?
【发布时间】:2016-04-19 18:35:41
【问题描述】:

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

写完 setContentView(lview);在 onCreate() 方法的最后,它现在给了我错误并且活动崩溃了。最后我从 firebase 得到了错误:com.firebase.client.FirebaseException: Failed to jump 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); 
}
}

和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;
}

}

listepriser 的 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

【问题讨论】:

  • 对于下一个问题,将 JSON 添加为文本而不是(链接到)屏幕截图。您可以通过单击 Firebase 数据库中的导出按钮轻松获取 JSON 文本。将 JSON 作为文本使其可搜索,让我们可以轻松地使用它来测试您的实际数据并在我们的答案中使用它,一般来说这只是一件好事。

标签: android listview firebase listadapter


【解决方案1】:

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

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

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

【讨论】:

  • 你认为我可以按照他们的父母来解决。我将使用 geofire 来计算最近的加油站。就像我不必在 /Detail 下获取所有内容一样。只是最近的那些
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    公共双 getPrice();

    我认为这是因为 firebase 抱怨它无法确定某个字段与对象的哪个属性匹配。这可能是因为您应该为每个属性提供 getter,而 Firebase 可能不喜欢该价格是 Double 但您的 getter 将其转换为字符串。这是 Frank 的详细帖子的链接,该链接介绍了这一切是如何运作的。 Why do I get "Failed to bounce to type" when I turn JSON from Firebase into Java objects?

    【讨论】:

    • 感谢我在 Benzin 类中将其更改为 double ,而在主类中我现在将其更改为 string。但我仍然遇到同样的错误
    • 尝试使用 double 而不是 Double。
    • 我在数据库和课堂上都将价格更改为字符串。还是一样的错误
    • 我相当肯定凯文已经发现了问题。
    【解决方案4】:

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

    类似

    setContentView(R.layout.activity_testbezinpriser);
    ListView lview = (ListView)findViewById(R.id.station_list);
    

    activity_testbezinpriser.xml中,应该有一个ListView,like

    <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>
    

    【讨论】:

    • 我不确定,但在放置 setContentView(lview);在 onCreate() 方法的最后,它现在给了我错误并且活动崩溃了。最后我从 firebase 得到了错误:com.firebase.client.FirebaseException: Failed to jump to type
    • 不,等一下 - 您代码中的 setContentView() 方法调用是正确的。您有一个名为activity_testbezinpriser.xml 的布局文件,其中应该有一个ListView。您可以将 xml 文件添加到您的问题中吗?
    • 我添加了一些 xml。你的布局是这样的吗?
    • 我已经上传了 xml "listepriser"
    • 我只需要在属性中添加公共。它现在可以工作了。
    猜你喜欢
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 2013-07-03
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多