【问题标题】:App updates data in firebase real-time database but doesn't show anything in recyclerview应用程序更新 firebase 实时数据库中的数据,但在 recyclerview 中不显示任何内容
【发布时间】:2020-06-16 14:06:48
【问题描述】:

我正在尝试将数据添加到 firbase 实时数据库并在 recyclerview 上检索该数据。我成功地能够做到这一点,但是当我尝试从 firebase 检索数据时它没有发生,即使当我尝试打印我的数据时在 logacat 窗口上,我可以成功地做到这一点。

MainActivity.java

    import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.shivam.fireapp.model.User;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private  Button button;
    private  Button button2;
    EditText editText;
    EditText editText2;
    String TAG ="MyTag";
    private ChildEventListener mchildeventlistener;
    private RecyclerView mRecyclerView;
    private mModelAdapter modelAdapter;
    private List<User> mDataList;

    DatabaseReference mRootRef= FirebaseDatabase.getInstance().getReference();
    DatabaseReference mRefMain =mRootRef.child("Users");
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.Senddata);
        button2 = (Button) findViewById((R.id.GetData));
        editText = (EditText) findViewById(R.id.Firstname);
        editText2 = (EditText) findViewById(R.id.Agee);
        mDataList = new ArrayList<>();

        mRecyclerView= findViewById(R.id.recyclerView);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        modelAdapter = new mModelAdapter(this,mDataList);
        mRecyclerView.setAdapter(modelAdapter);
        mchildeventlistener = new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                User user = dataSnapshot.getValue(User.class);
                mDataList.add(user);
                modelAdapter.notifyDataSetChanged();

                Log.d(TAG,"OnChildAdded : Name    "+ user.getFirst_name());
                Log.d(TAG,"OnChildAdded : ageeee    "+ user.getAgeeee());



            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        };

        mRefMain.addChildEventListener(mchildeventlistener);





    }
    @Override
    protected void onStart(){
        super.onStart();
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String Name = editText.getText().toString();
                String Age = editText2.getText().toString();

                User user = new User(Name,Age);

                String key = mRefMain.push().getKey();
                mRefMain.child(key).setValue(user);

                Toast.makeText(MainActivity.this,"Done",Toast.LENGTH_SHORT).show();
            }
        });







        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {



            }});



    }
    @Override
    protected void onDestroy(){
        super.onDestroy();
        mRefMain.removeEventListener(mchildeventlistener);
    }


}

activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <Button
        android:id="@+id/Senddata"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="32dp"
        android:text="Send Data"
        app:layout_constraintBottom_toBottomOf="@+id/GetData"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/GetData" />

    <EditText
        android:id="@+id/Firstname"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="32dp"
        android:layout_marginTop="41dp"
        android:layout_marginEnd="39dp"
        android:ems="10"
        android:hint="Enter Name"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toStartOf="@+id/Agee"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/GetData"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="160dp"
        android:layout_marginEnd="40dp"
        android:text="Get Data"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/Agee"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="41dp"
        android:layout_marginEnd="40dp"
        android:ems="10"
        android:hint="Entre a Age"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/Firstname"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="345dp"
        android:layout_marginTop="55dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/Senddata" />
</androidx.constraintlayout.widget.ConstraintLayout>

mModelAdapter.java

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

import com.shivam.fireapp.model.User;

import java.util.List;

public class mModelAdapter extends RecyclerView.Adapter<mModelAdapter.MyViewHolder> {
    private Context context;
    private List<User> mDataList;

    public mModelAdapter(Context context, List<User> mDataList) {
        this.context = context;
        this.mDataList = mDataList;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View rootView= LayoutInflater.from(context).inflate(R.layout.recycler_view_item,parent,false);

        return new MyViewHolder(rootView);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        User user = mDataList.get(position);
        holder.textView.setText(user.getFirst_name()+"  |  "+user.getAgeeee());

    }

    @Override
    public int getItemCount() {
        return mDataList.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder{
        TextView textView;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            textView = itemView.findViewWithTag(R.id.textView);
        }
    }
}

用户.java

    public class User {

    String first_name, ageeee;

    public User(String first_name, String ageeee) {
        this.first_name = first_name;
        this.ageeee = ageeee;
    }

    public User() {
    }

    public String getFirst_name() {
        return first_name;
    }

    public void setFirst_name(String first_name) {
        this.first_name = first_name;
    }

    public String getAgeeee() {
        return ageeee;
    }

    public void setAgeeee(String ageeee) {
        this.ageeee = ageeee;
    }
}

recycler_view_item.xml

    <?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:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="TextView"
        android:textSize="24sp"
        android:gravity="center"/>
</LinearLayout>

【问题讨论】:

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


    【解决方案1】:

    我遇到了同样的问题。其原因是当firebase还没有从实时数据库中读取数据时,recyclerview已经做了;而且它还没有任何数据。为了解决这个问题,当您确定 firebase 已读取数据时,您应该进行 recyclerview。然后 recyclerview 将使用正确的数据进行。

    【讨论】:

    • 这个答案会对你有更多帮助:stackoverflow.com/questions/43143134
    • 设置适配器后应用程序崩溃
    • 这个问题是你的recyclerview 的问题,这是另一个问题。您为什么取消选中我的答案作为正确答案?再问一个关于你的 recyclerview 的问题。
    • 我的问题出现在我将文本设置到文本视图中时,当我不传递任何文本时,它只会显示空的文本视图 holder.textView.setText(user.getName()); holder.textView.setText(user.getAge());当我简单地省略这两个语句时,我在回收器视图中得到 epmty textviews 但是当我添加这些行时,我进入运行时错误。
    【解决方案2】:

    首先我会建议你不要在适配器中传递列表。在适配器中创建setList 方法。

    如果您仍然在适配器中传递list,那么试试这个

    childadded方法中替换这个

      modelAdapter.notifyDataSetChanged();
    

    这两行

        modelAdapter = new mModelAdapter(this,mDataList); //this will recreate the adapter with new data
        mRecyclerView.setAdapter(modelAdapter); //Again set adapter to recyclerview
    

    【讨论】:

    • 我认为问题不在于我设置适配器时,因为当我没有在适配器 onBindViewholder 方法中设置任何值时,它只会显示空文本视图来代替我在火基上的数据。跨度>
    • @ShivamSehrawat notifyDataSetChanged 在您的 mDataList 更新但您没有更新列表时工作。这就是问题所在。
    【解决方案3】:

    java内部类不访问外部局部声明变量。所以你需要这样做

     public List<User> mDataList = new ArrayList<>();
    

    使用界面

    【讨论】:

      猜你喜欢
      • 2016-02-15
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多