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