【问题标题】:How to Retrieve Value in RecyclerView I tried a lot but it Retrieve a Null Value from Generated ID by Firebase after Push Data in Database in Android如何在 RecyclerView 中检索值我尝试了很多,但在 Android 中的数据库中推送数据后,它从 Firebase 生成的 ID 中检索空值
【发布时间】:2018-09-18 08:30:55
【问题描述】:

如何在RecyclerView 中检索值我尝试了很多,但在将数据推送到数据库后,它会从 Firebase 生成的 id 中检索空值,如果我不使用此方法“推送”存储在第二个 id 中的数据直接并在 Android 和 log cat 中很好地检索:

W/ClassMapper: No setter/field for -L9VWgoCymRWj9zbgK5H [image for database stracture][1]

这是我的代码:

public class TasksListActivity extends AppCompatActivity {

    RecyclerView recyclerView;
    TaskAdapter adapter;
    List<Tasks>tasksList;
    FirebaseDatabase FDB;
    DatabaseReference DBR;
    private FirebaseAuth mAuth;

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

        recyclerView=(RecyclerView) findViewById(R.id.testingss);
        RecyclerView.LayoutManager manager=new LinearLayoutManager(getApplicationContext());
        recyclerView.setLayoutManager(manager);
        recyclerView.setHasFixedSize(true);
        mAuth = FirebaseAuth.getInstance();



        tasksList=new ArrayList<>();
        adapter=new TaskAdapter(tasksList);

        FDB=FirebaseDatabase.getInstance();

        GetDataFirebase();
    }

    void GetDataFirebase (){
        FirebaseUser currentUser = mAuth.getCurrentUser();
        final String currentid=currentUser.getUid();

        DBR=FDB.getReference("tasks").child(currentid);

        DBR.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                Tasks data=dataSnapshot.getValue(Tasks.class);

                //Toast.makeText(getApplicationContext(),tas,Toast.LENGTH_SHORT).show();
                tasksList.add(data);
                adapter.notifyDataSetChanged();
                recyclerView.setAdapter(adapter);
            }

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

            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

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

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

    }



    public  class TaskAdapter extends RecyclerView.Adapter<TaskAdapter.TaskViewHolder>{

        List<Tasks> data=new ArrayList<>();

        public TaskAdapter(List<Tasks> tasks){
            this.data=tasks;


        }




        @Override
        public TaskAdapter.TaskViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.taskslistitem,parent,false);

            return new TaskViewHolder(view);
        }

        @Override
        public void onBindViewHolder(TaskAdapter.TaskViewHolder holder, int position) {

            Tasks tasks=data.get(position);

            holder.taskName.setText(tasks.getmTaskname());
            Toast.makeText(getApplicationContext(),tasks.getmTaskname(),Toast.LENGTH_SHORT).show();
            //Toast.makeText(getApplication(),tasks.getmTaskname(),Toast.LENGTH_SHORT).show();
           // Toast.makeText(getApplicationContext(),holder.taskName.getText(),Toast.LENGTH_SHORT).show();


        }

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

        public class TaskViewHolder extends RecyclerView.ViewHolder {

            TextView taskName;

            public TaskViewHolder(View itemView) {
                super(itemView);
                taskName=(TextView) itemView.findViewById(R.id.tasksnameId);
            }
        }
    }


}

关于任务模型的类

公开课任务{

private String mMemberEmail;
private String mTaskname;
private String mTaskDsc;
private String mTaskDeadline;


public Tasks() {
}

public Tasks(String mMemberEmail, String mTaskname, String mTaskDsc, String mTaskDeadline) {
    this.mMemberEmail = mMemberEmail;
    this.mTaskname = mTaskname;
    this.mTaskDsc = mTaskDsc;
    this.mTaskDeadline = mTaskDeadline;
}

public String getmMemberEmail() {
    return mMemberEmail;
}

public void setmMemberEmail(String mMemberEmail) {
    this.mMemberEmail = mMemberEmail;
}

public String getmTaskname() {
    return mTaskname;
}

public void setmTaskname(String mTaskname) {
    this.mTaskname = mTaskname;
}

public String getmTaskDsc() {
    return mTaskDsc;
}

public void setmTaskDsc(String mTaskDsc) {
    this.mTaskDsc = mTaskDsc;
}

public String getmTaskDeadline() {
    return mTaskDeadline;
}

public void setmTaskDeadline(String mTaskDeadline) {
    this.mTaskDeadline = mTaskDeadline;
}

}

                final Tasks tasks=new Tasks(mMemberEmail,mTasksName,mTaskDsc,mTaskDeadline);

                mUserDatabase.child("tasks").child(current_id).child(id).push().setValue(tasks).addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {

                        mAuth = FirebaseAuth.getInstance();
                        user = mAuth.getCurrentUser();

                        String current_id = user.getUid();

                        Tasks tasks=new Tasks(mMemberEmail,mTasksName,mTaskDsc,mTaskDeadline);

                        String id = child.getKey();

                        mUserDatabase.child("tasks").child(id).child(current_id).push().setValue(tasks);

                    }
                });

            }

【问题讨论】:

  • 不要使用 push ,你能显示你从哪里插入数据到 firebase 数据库的代码吗?

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


【解决方案1】:

您收到以下警告:

W/ClassMapper: No setter/field for -L9VWgoCymRWj9zbgK5H

因为您在字段中使用了错误的 getter。如下所示的字段的正确 getter:

private String mMemberEmail;

应该是:

public String getMMemberEmail() { //See the first capital M
    return mMemberEmail;
}

模型中的字段和 getter 的正确命名应该是:

public class Tasks {
    private String memberEmail;
    private String taskName;
    private String taskDsc;
    private String taskDeadline;

    public Tasks() {}

    public Tasks(String memberEmail, String taskName, String taskDsc, String taskDeadline) {
        this.memberEmail = memberEmail;
        this.taskName = taskName;
        this.taskDsc = taskDsc;
        this.taskDeadline = taskDeadline;
    }

    public String getMemberEmail() {return memberEmail;}

    public String getTaskName() {return taskName;}

    public String getTaskDsc() {return taskDsc;}

    public String getTaskDeadline() {return taskDeadline;}
}

请记住,当 Firebase 实时数据库 SDK 反序列化来自数据库的对象时,它正在寻找遵循 JavaBeans 原则并根据Java Naming Conventions 命名的字段。所以像memberEmail 这样的字段对应的getter 是getMemberEmail() 而不是getmemberEmail()。要使其完全正常工作,请删除旧数据并添加新数据。

【讨论】:

  • 我改了但还是一样的问题
  • 您是否删除了旧数据并添加了新数据?你能告诉我它现在的样子吗?
猜你喜欢
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
相关资源
最近更新 更多