【问题标题】:Unable to view single user data from firebase using RecyclerView无法使用 RecyclerView 从 firebase 查看单个用户数据
【发布时间】:2020-10-31 08:49:28
【问题描述】:

期望的行为: 我试图在登录后显示来自 Firebase 的单个用户“电子邮件”和“用户名”数据。目前,我的应用程序在登录时崩溃,并且 logcat 显示此错误:

无法将 java.lang.String 类型的对象转换为类型 com.example.start.model

注意:我正在使用 intent.putExtra() 从登录页面推送用户名

我的数据库快照: database snapshot

主类:

 package com.example.start;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Toast;
    
    import androidx.annotation.NonNull;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.recyclerview.widget.LinearLayoutManager;
    import androidx.recyclerview.widget.RecyclerView;
    
    import com.firebase.ui.database.FirebaseRecyclerAdapter;
    import com.firebase.ui.database.FirebaseRecyclerOptions;
    import com.google.firebase.database.DatabaseReference;
    import com.google.firebase.database.FirebaseDatabase;
    
    public class BeginStart extends AppCompatActivity {
    
        DatabaseReference ref;
        FirebaseDatabase rootNode;
       private RecyclerView recyclerView;
       String Receive_username;
    
        private FirebaseRecyclerOptions<model> options;
        private FirebaseRecyclerAdapter<model, MyViewHolder> adapter;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.testlayout);
    
             Intent intent = getIntent();
    Receive_username = intent.getStringExtra("push_username");

    rootNode = FirebaseDatabase.getInstance();
    ref = rootNode.getReference("Users").child(Receive_username);
    
    
            recyclerView =findViewById(R.id.testrecycle);
            recyclerView.setHasFixedSize(true);
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
    
options = new FirebaseRecyclerOptions.Builder<model>().setQuery(ref, model.class).build();
     adapter = new FirebaseRecyclerAdapter<model, MyViewHolder>(options) {
                @Override
                protected void onBindViewHolder(@NonNull MyViewHolder holder, int position, @NonNull model model) {
                    Toast.makeText(getApplicationContext(), "On Bind!", Toast.LENGTH_SHORT).show();
                    holder.textViewname.setText(model.getUsername());
                    holder.textViewemail.setText(model.getEmail());
                }
    
                @NonNull
                @Override
                public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                   View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_view_layout,parent,false);
                    return new MyViewHolder(v);
                }
            };
    
            adapter.startListening();
            recyclerView.setAdapter(adapter);
    
        }
    }

模型类:

package com.example.start;

public class model {

    String username, email;

    public model() {
    }

    public model(String username, String email) {
        this.username = username;
        this.email = email;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

视图处理程序类:

package com.example.start;

import android.view.View;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

class MyViewHolder extends RecyclerView.ViewHolder {

TextView textViewname, textViewemail;




    public MyViewHolder(@NonNull View itemView) {
        super(itemView);

        textViewname = itemView.findViewById(R.id.textviewname);
        textViewemail = itemView.findViewById(R.id.textviewemail);
    }
}

recyclerview 布局:

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


    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/testrecycle"
        android:layout_marginRight="16dp"
        android:layout_marginLeft="16dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >

    </androidx.recyclerview.widget.RecyclerView>

</LinearLayout>

RecyclerView 的单一视图布局:

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


<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/textviewname"
    android:text="title"
    android:textSize="30dp"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textviewemail"
        android:text="email"
        android:textSize="30dp"/>





</LinearLayout>

【问题讨论】:

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


    【解决方案1】:

    当您传递以下参考时:

    ref = rootNode.getReference("Users").child(Receive_username);
    

    还有:

    model.class
    

    对于setQuery() 方法,这意味着您正在尝试将Receive_username 节点下存在的所有对象作为model 类对象读取,这实际上是不可能的,因为在该节点下,只有字符串值,因此该错误。

    我正在尝试在登录后显示来自 firebase 的单个用户“电子邮件”和“用户名”数据。

    如果您只需要读取单个用户的“电子邮件”和“用户名”,那么根本不需要使用 Firebase-UI 库。例如,当您需要在 RecyclerView 中显示 Users 节点内的所有用户时,就会使用此库。

    如果只需要显示单个用户对应的那些属性的值,请使用以下代码行:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference userRef = rootRef.child("Users").child(Receive_username);
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String email = dataSnapshot.child("email").getValue(String.class);
            String username = dataSnapshot.child("username").getValue(String.class);
            Log.d("TAG", email + "/" + username);
        }
    
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.d("TAG", databaseError.getMessage()); //Don't ignore potential errors!
        }
    };
    userRef.addListenerForSingleValueEvent(valueEventListener);
    

    如果您的 Receive_username 变量包含 Jim 的值,则 logcat 中的结果将是:

    jim@test.com/Jim
    

    【讨论】:

    • 谢谢,这有助于我更好地理解使用数据库并进一步改进我的项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    相关资源
    最近更新 更多