Первая и последняя кнопка переключателя срабатывает в представлении ресайклера - PullRequest
1 голос
/ 05 мая 2020

Привет, у меня есть кнопка переключения (switchTaskFinished) в моем представлении ресайклера, когда я нажимаю любую кнопку, выбирается последняя кнопка. Также, когда я нажимаю кнопку, он обновляет данные до firebase. И соответственно меняет статус кнопки. Но даже если значение кнопок истинно, оно обновляет только состояние последней кнопки, а не другие.

enter image description here

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

1 Ответ

0 голосов
/ 05 мая 2020

Может быть, это из-за 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);
                        ...................
...