【问题标题】:First and last switch button getting triggred in recycler view在recyclerview中触发第一个和最后一个开关按钮
【发布时间】:2020-08-20 03:29:56
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    可能是因为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);
                            ...................
    

    【讨论】:

      猜你喜欢
      • 2018-12-04
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 2017-08-30
      • 2021-07-18
      • 2020-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多