繁体   English   中英

在回收站视图中触发第一个和最后一个开关按钮

[英]First and last switch button getting triggred in recycler view

嗨,我的回收站视图上有切换按钮(switchTaskFinished),当我单击任何按钮时,最后一个按钮被选中。 此外,当我按下按钮时,它会将数据更新为 firebase。 并相应地更改按钮状态。 但即使按钮值是 true,它也只会更新最后一个按钮状态而不是其他按钮状态。

在此处输入图像描述

public class MyAdaptorUser extends RecyclerView.Adapter<MyAdaptorUser.myViewHolder> {
    private Context context;
    private ArrayList<TaskModel> taskLists;
    private Switch switchTaskFinished;
    private OnTaskClickListner mTaskListner;
    private AlertDialog dialog;
    private AlertDialog.Builder builder;
    private TaskConfirmationSender taskConfirmationSender;

    public MyAdaptorUser(Context c, ArrayList<TaskModel> t, OnTaskClickListner onTaskClickListner) {
        context = c;
        taskLists = t;
        this.mTaskListner = onTaskClickListner;
    }

    @NonNull
    @Override
    public MyAdaptorUser.myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        builder = new AlertDialog.Builder(parent.getContext());
        builder.setTitle("Please Wait").setView(R.layout.my_progress_view).setCancelable(false);
        dialog = builder.create();
        return new MyAdaptorUser.myViewHolder(LayoutInflater.from(context).inflate(R.layout.task_preview, parent, false), mTaskListner);
    }

    @Override
    public void onBindViewHolder(@NonNull MyAdaptorUser.myViewHolder holder, final int position) {
        //Set title and description to task preview textviews
        holder.title.setText(taskLists.get(position).getTaskTitle());
        holder.dueDate.setText(taskLists.get(position).getDueDate());
        holder.description.setText(taskLists.get(position).getTaskDescription());
        //Sets the path of database to taskAwatingConfirmation/task_title/UserEmail
        final DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference();
        try {
            String email = FirebaseAuth.getInstance().getCurrentUser().getEmail();
            email = removeSpecialCharacter(email);
            final DatabaseReference taskConfirmationRef = dbRef
                    .child("taskAwatingConfirmation")
                    .child(taskLists.get(position).getTaskTitle())
                    .child(email);
            taskConfirmationRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    //Fetching switchButton Status (Task finished) from database
                    switchTaskFinished.setChecked(false);
                    String buttonStatus = (String) dataSnapshot.child("buttonStatus").getValue();
                    if (buttonStatus != null) {
                        Log.d("taskerror", buttonStatus);
                        if (buttonStatus.equals("true")) {
                            switchTaskFinished.setChecked(true);
                        } else if (buttonStatus.equals("false")) {
                            switchTaskFinished.setChecked(false);
                        }
                    }
                }

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

                }
            });

            switchTaskFinished.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(final CompoundButton buttonView, boolean isChecked) {
                    //dialog = builder.show();
                    taskConfirmationSender = new TaskConfirmationSender();
                    //When Task Finished button is clicked send data to database
                    sendConfirmationToAdmin(new FirebaseCallBack() {
                        @Override
                        public void Callback(TaskConfirmationSender taskConfirmationSender) {
                            taskConfirmationSender.setButtonStatus(String.valueOf(buttonView.isChecked()));
                            taskConfirmationSender.setTaskDueDate(taskLists.get(position).getDueDate());
                            if (buttonView.isChecked()) {
                                taskConfirmationRef.setValue(taskConfirmationSender).addOnSuccessListener(new OnSuccessListener<Void>() {
                                    @Override
                                    public void onSuccess(Void aVoid) {
                                        dialog.dismiss();
                                    }
                                });
                            }else{
                                taskConfirmationRef.setValue(taskConfirmationSender).addOnSuccessListener(new OnSuccessListener<Void>() {
                                    @Override
                                    public void onSuccess(Void aVoid) {
                                        dialog.dismiss();
                                    }
                                });
                            }
                        }
                    });
                }
            });
        } catch (NullPointerException ignored) {
            dialog.dismiss();
        }
    }

    private String removeSpecialCharacter(String email) {
        StringBuffer sbf = new StringBuffer(email);
        email = String.valueOf(sbf.reverse());
        int length = email.length();
        email = email.substring(4, length);
        StringBuffer stringBuffer = new StringBuffer(email);
        email = String.valueOf(stringBuffer.reverse());
        return email.replace("@", "_");
    }

    private void sendConfirmationToAdmin(final FirebaseCallBack firebaseCallBack) {
        DatabaseReference volunteerRef = FirebaseDatabase.getInstance().getReference()
                .child("Volunteer").child("Member")
                .child(FirebaseAuth.getInstance().getCurrentUser().getUid());
        taskConfirmationSender = new TaskConfirmationSender();
        try {
            //Fetching details of users (full name, email) from database and setting their value to taskConfirmation Object
            volunteerRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    String userName = dataSnapshot.child("fullName").getValue().toString();
                    String userEmail = dataSnapshot.child("email").getValue().toString();
                    String userId = dataSnapshot.getKey();

                    //TODO: Fetch UID of user and set it to taskConfirmation OBject
                    taskConfirmationSender.setUserEmail(userEmail);
                    taskConfirmationSender.setUserName(userName);
                    taskConfirmationSender.setId(userId);

                    Calendar calendar = Calendar.getInstance();
                    int year = calendar.get(Calendar.YEAR);
                    int month = calendar.get(Calendar.MONTH) + 1;
                    int day = calendar.get(Calendar.DAY_OF_MONTH);
                    String submissionDate = day + "/" + month + "/" + year;
                    taskConfirmationSender.setSubmissionDate(submissionDate);

                    firebaseCallBack.Callback(taskConfirmationSender);
                    /**/
                }

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

                }
            });
        } catch (NullPointerException ee) {

        }
    }

    private interface FirebaseCallBack {
        void Callback(TaskConfirmationSender taskConfirmationSender);
    }

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

    class myViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView title, dueDate, description;
        OnTaskClickListner onTaskClickListner;

        public myViewHolder(@NonNull View itemView, OnTaskClickListner onTaskClickListner) {
            super(itemView);
            title = itemView.findViewById(R.id.taskTitle);
            dueDate = itemView.findViewById(R.id.taskDueDate);
            description = itemView.findViewById(R.id.taskDescription);
            switchTaskFinished = itemView.findViewById(R.id.switchTaskFinished);
            this.onTaskClickListner = onTaskClickListner;

            ConstraintLayout taskBar = itemView.findViewById(R.id.linearLayoutTaskBar);

            itemView.setOnClickListener(this);
            //hides delete task button
            taskBar.setVisibility(View.GONE);
        }

        @Override
        public void onClick(View v) {

            onTaskClickListner.onTaskClick(getAdapterPosition());
        }
    }

    public interface OnTaskClickListner {
        void onTaskClick(int position);
    }
}

也许是因为valueEventListener保持连接:

而不是这个:

taskConfirmationRef.addValueEventListener(new ValueEventListener() {.........

做这个:

taskConfirmationRef.addListenerForSingleValueEvent(new ValueEventListener() {......

并在打开或关闭时将switch设置为选中或未选中:

                        if (buttonView.isChecked()) {

                        //here
                        switchTaskFinished.setChecked(true);
                            taskConfirmationRef.setValue(taskConfirmationSender).addOnSuccessListener(new OnSuccessListener<Void>() {
                                @Override
                                public void onSuccess(Void aVoid) {
                                    dialog.dismiss();
                                }
                            });
                        }else{

                        //here
                        switchTaskFinished.setChecked(false);
                        ...................

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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