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

huangapple 未分类评论50阅读模式
英文:

First and last switch button getting triggred in recycler view

问题

public class MyAdaptorUser extends RecyclerView.Adapter<MyAdaptorUser.myViewHolder> {
    // ... (other fields and methods)

    @NonNull
    @Override
    public MyAdaptorUser.myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // ... (other code)
        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) {
        // ... (other code)
        switchTaskFinished.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(final CompoundButton buttonView, boolean isChecked) {
                taskConfirmationSender = new TaskConfirmationSender();
                sendConfirmationToAdmin(new FirebaseCallBack() {
                    @Override
                    public void Callback(TaskConfirmationSender taskConfirmationSender) {
                        taskConfirmationSender.setButtonStatus(String.valueOf(buttonView.isChecked()));
                        // ... (other code)
                        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();
                                }
                            });
                        }
                    }
                });
            }
        });
    }

    // ... (other methods and inner classes)
}

Note: I have provided the translated code segments that pertain to the issue you mentioned. Please make sure to integrate these segments into your existing code structure. If you encounter any errors or need further assistance, feel free to ask.

英文:

Hi I have switch button (switchTaskFinished) on my recycler view,when I am clicking any button, the last button is getting selected. Also when I press button it updates the data to firebase. And changes the button status accordingly. But even though buttons value is true it only updates last button status not others.

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

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

    public MyAdaptorUser(Context c, ArrayList&lt;TaskModel&gt; 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(&quot;Please Wait&quot;).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(&quot;taskAwatingConfirmation&quot;)
                    .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(&quot;buttonStatus&quot;).getValue();
                    if (buttonStatus != null) {
                        Log.d(&quot;taskerror&quot;, buttonStatus);
                        if (buttonStatus.equals(&quot;true&quot;)) {
                            switchTaskFinished.setChecked(true);
                        } else if (buttonStatus.equals(&quot;false&quot;)) {
                            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&lt;Void&gt;() {
                                    @Override
                                    public void onSuccess(Void aVoid) {
                                        dialog.dismiss();
                                    }
                                });
                            }else{
                                taskConfirmationRef.setValue(taskConfirmationSender).addOnSuccessListener(new OnSuccessListener&lt;Void&gt;() {
                                    @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(&quot;@&quot;, &quot;_&quot;);
    }

    private void sendConfirmationToAdmin(final FirebaseCallBack firebaseCallBack) {
        DatabaseReference volunteerRef = FirebaseDatabase.getInstance().getReference()
                .child(&quot;Volunteer&quot;).child(&quot;Member&quot;)
                .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(&quot;fullName&quot;).getValue().toString();
                    String userEmail = dataSnapshot.child(&quot;email&quot;).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 + &quot;/&quot; + month + &quot;/&quot; + 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

可能是因为保持连接的 valueEventListener

不要这样做:

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

而要这样做:

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

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

if (buttonView.isChecked()) {

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

    // 在这里
    switchTaskFinished.setChecked(false);
    ...................
英文:

Maybe its because of the valueEventListener that stays attached:

Instead of this:

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

Do this:

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

And set the switch to checked or unchecked when you turn on or off:

                        if (buttonView.isChecked()) {

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

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

huangapple
  • 本文由 发表于 2020年5月5日 20:55:17
  • 转载请务必保留本文链接:https://java.coder-hub.com/61613684.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定