Alert dialog doesn't close in 1 click

Viewed 131

I have a recyclcer view(which I copyed from this site) in which I have some buttons. Onclicking the buttons, I wanted to show a confirmation dialog. I followed this answer to construct the dialog. Now I have to press the close button 4 times in order to close the dialog. How do I fix it to close the dialog in one press.

This is my adapter code:

package com.example.sample_app;
import ...

public class delete_server_adapter extends RecyclerView.Adapter<delete_server_adapter.ViewHolder> {

    private ArrayList<String> localDataSet;
    private Context my_context;
    private String selected_server_name;
    private String server_key;

    /**
     * Provide a reference to the type of views that you are using
     * (custom ViewHolder).
     */
    public static class ViewHolder extends RecyclerView.ViewHolder {
        private final Button server_name_button;

        public ViewHolder(View view) {
            super(view);
            // Define click listener for the ViewHolder's View
            server_name_button = view.findViewById(R.id.button2);
        }

        public TextView getTextView() {
            return server_name_button;
        }
    }

    /**
     * Initialize the dataset of the Adapter.
     *
     * @param dataSet String[] containing the data to populate views to be used
     * by RecyclerView.
     */
    public delete_server_adapter(Context context, ArrayList<String> dataSet) {
        localDataSet = dataSet;
        my_context = context;
    }

    // Create new views (invoked by the layout manager)
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        // Create a new view, which defines the UI of the list item
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.delete_server_button, viewGroup, false);
        view.findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                remove(v);
            }
        });
        return new ViewHolder(view);
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(ViewHolder viewHolder, final int position) {

        // Get element from your dataset at this position and replace the
        // contents of the view with that element
        viewHolder.getTextView().setText(localDataSet.toArray()[position].toString());
    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return localDataSet.size();
    }
    private void remove(View v){
        selected_server_name = ((Button) v).getText().toString();
        DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("/server_list");
        ChildEventListener server_listener = new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
                for (DataSnapshot child_snapshot: snapshot.getChildren()){
                    server_key = child_snapshot.getKey();
                }
                DatabaseReference server = FirebaseDatabase.getInstance().getReference("/server_list"+ server_key);
                AlertDialog.Builder builder = new AlertDialog.Builder(my_context);
                builder.setCancelable(true);
                builder.setTitle("Delete Vault");
                builder.setMessage("Are you sure you want to delete this vault? It's data will be lost for ever");
                builder.setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                server.removeValue();
                            }
                        });
                builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });
                AlertDialog dialog = builder.create();
                dialog.show();
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

            }

            @Override public void onChildRemoved(@NonNull DataSnapshot snapshot){}
            @Override public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName){}
            @Override public void onCancelled(@NonNull DatabaseError error){}
        };
        databaseReference.addChildEventListener(server_listener);
    }
}

I call this adapter like this:

delete_server_adapter adapter = new delete_server_adapter(context, data); //Here context is the context of the parent activty which contains the recyclerview
recyclerView.setAdapter(adapter);
recyclerView.scrollToPosition(0);
2 Answers

Alert Dialog auto Dismiss when we click any of button Yes/No

Change "builder.setCancelable(true);" to "builder.setCancelable(false);"

Related