【问题标题】:Why my data do not show up in the recyclerview?为什么我的数据没有显示在 recyclerview 中?
【发布时间】:2019-05-22 14:50:28
【问题描述】:

我一直试图弄清楚为什么没有数据传输到RecyclerWiew。到现在还没有运气。在某些情况下,我什至得到:

“com.google.firebase.database.DatabaseException:无法将 java.lang.String 类型的对象转换为类型”错误

主活动

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    private RecyclerView recyclerView;
    private DatabaseReference databaseReference;
    private FirebaseRecyclerOptions<Pond> options;
    private FirebaseRecyclerAdapter<Pond, PondViewHolder> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
        recyclerView.setHasFixedSize(true);


        databaseReference = FirebaseDatabase.getInstance().getReference().child("pi1DetailTest");

        options = new FirebaseRecyclerOptions.Builder<Pond>().setQuery(databaseReference, Pond.class).build();

        adapter = new FirebaseRecyclerAdapter<Pond, PondViewHolder>(options) {
            @Override
            protected void onBindViewHolder(@NonNull PondViewHolder holder, int position, @NonNull Pond model) {
                holder.txtViewPiID.setText(model.getPiId());
                holder.txtViewPondName.setText(model.getPondName());
                holder.txtViewPondLocation.setText(model.getLocation());
            }

            @NonNull
            @Override
            public PondViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
                View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.activity_main_cardview, viewGroup, false);
                return new PondViewHolder(view);
            }
        };
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(adapter);
    }

    @Override
    protected void onStart() {
        super.onStart();
        adapter.startListening();
    }

ViewHolder

public class PondViewHolder extends RecyclerView.ViewHolder {
    public TextView txtViewPiID;
    public TextView txtViewPondName;
    public TextView txtViewPondLocation;

    public PondViewHolder(@NonNull View itemView) {
        super(itemView);
        txtViewPiID = (TextView) itemView.findViewById(R.id.txtViewPiID);
        txtViewPondName = (TextView) itemView.findViewById(R.id.txtViewPondName);
        txtViewPondLocation = (TextView) itemView.findViewById(R.id.txtViewPondLocation);
    }
}

型号

public class Pond {
    public String piId;
    public String pondName;
    public String location;

    public Pond(String piId, String pondName, String location) {
        this.piId = piId;
        this.pondName = pondName;
        this.location = location;
    }

    public Pond(){

    }

    public String getPiId() {
        return piId;
    }

    public void setPiId(String piId) {
        this.piId = piId;
    }

    public String getPondName() {
        return pondName;
    }

    public void setPondName(String pondName) {
        this.pondName = pondName;
    }

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }

我希望带有 Pond 类数据的卡片视图会显示在回收站视图中。请帮忙。谢谢。

附加信息 == 这是来自 logcat 的错误

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.testappagain.Pond
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(com.google.firebase:firebase-database@@17.0.0:418)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(com.google.firebase:firebase-database@@17.0.0:214)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(com.google.firebase:firebase-database@@17.0.0:79)
        at com.google.firebase.database.DataSnapshot.getValue(com.google.firebase:firebase-database@@17.0.0:212)
        at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:29)
        at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:15)
        at com.firebase.ui.common.BaseCachingSnapshotParser.parseSnapshot(BaseCachingSnapshotParser.java:35)
        at com.firebase.ui.common.BaseObservableSnapshotArray.get(BaseObservableSnapshotArray.java:52)
        at com.firebase.ui.database.FirebaseRecyclerAdapter.getItem(FirebaseRecyclerAdapter.java:106)
        at com.firebase.ui.database.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:122)
        at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781)
        at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6823)
        at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5752)
        at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6019)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)
        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)
        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557)
        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
        at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
        at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924)
        at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3641)
        at android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1888)
        at android.support.v7.widget.RecyclerView$1.run(RecyclerView.java:407)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
        at android.view.Choreographer.doCallbacks(Choreographer.java:670)
        at android.view.Choreographer.doFrame(Choreographer.java:603)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

1:Datastructure: Where I want to get the data from.

2:Entire Data Structure

【问题讨论】:

  • 更新:我尝试使用 Firestore 回收器适配器并且它有效。我基本上没有太大变化。如果两者的逻辑相同,我现在更困惑为什么它在 Firestore 而不是在 Firebase(Realtime DB) 中工作。
  • 请添加整个错误和您的数据库结构的屏幕截图。
  • 我已经发布了错误。感谢您的检查。如果你看到任何东西,请告诉我。 :)
  • 我已经问过你,也请添加你的数据库结构。
  • 添加了我要从中获取数据的屏幕截图。

标签: java android firebase firebase-realtime-database android-recyclerview


【解决方案1】:

根据您的最后一个 cmets,要在您的 RecyclerView 中仅显示这三个值,Someplacepi 1pondName,您需要更改从数据库获取数据的方式。所以你得到以下错误:

com.google.firebase.database.DatabaseException:无法将 java.lang.String 类型的对象转换为 com.example.testappagain.Pond 类型

因为在pi1DetailTest 节点下存在String 类型和not 类型Pond 的对象,并且Java 中没有办法将String 类型的对象转换为Pond。所以在你的情况下,不需要使用FirebaseRecyclerOptionsFirebaseRecyclerAdapter,只需像这样使用ArrayAdapterListView

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference pi1DetailTestRef = rootRef.child("pi1DetailTest");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<String> list = new ArrayList<>();
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String location = ds.child("location").getValue(String.class);
            list.add(location);
            String piId = ds.child("piId").getValue(String.class);
            list.add(piId);
            String pondName = ds.child("pondName").getValue(String.class);
            list.add(pondName);
        }
        ListView listView = (ListView) findViewById(R.id.list_view);
        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, list);
        listView.setAdapter(arrayAdapter);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
pi1DetailTestRef.addListenerForSingleValueEvent(eventListener);

【讨论】:

  • 刚刚试了一下,效果很好!非常感谢! :)
【解决方案2】:
  1. 尝试将适配器和视图分开。从 RecyclerView 扩展您的适配器。 ViewHolder 放在适配器类中
  2. 然后从db创建一个byffer数据列表,交给adapter

你能显示完整的错误吗?

【讨论】:

  • 我已经用错误更新了我的问题。谢谢你的检查。 :)
猜你喜欢
  • 2021-10-10
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-15
相关资源
最近更新 更多