简体   繁体   中英

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

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 and if I don't using this method "push" the data stored in second id directly and retrieved well in Android and in log cat:

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

This is my code:

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


}

the class about tasks model

public class Tasks {

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

                    }
                });

            }

You are getting the following warning:

W/ClassMapper: No setter/field for -L9VWgoCymRWj9zbgK5H

Because you are using wrong getters for your fields. The correct getter for a field that looks like this:

private String mMemberEmail;

Should be:

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

The correct naming for the fields and getters inside a model should be:

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

So remember, when the Firebase Realtime Database SDK deserializes objects coming from the database, is looking for fields that follow the principles of the JavaBeans and are named accordingly to Java Naming Conventions . So the corresponding getter for a field like memberEmail is getMemberEmail() and not getmemberEmail() . To make it work entirely, delete old data and add fresh one.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM