Search code examples
androidandroid-listviewandroid-alertdialog

AlertDialog with ListView inside it cannot be dismissed?


I have a ListView inside an AlertDialog like this:

enter image description here

The code:

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    Button btnDialog;
    String[] listData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnDialog = (Button) findViewById(R.id.btnShowDialog);
        btnDialog.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        int id = view.getId();

        if (id == R.id.btnShowDialog){
            fetchData();
        }
    }

    public void fetchData(){
        RequestQueue queue = Volley.newRequestQueue(this);
        String URL ="https://jsonplaceholder.typicode.com/users";

        StringRequest dataRequest = new StringRequest(Request.Method.GET, URL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            JSONArray jsoArray = new JSONArray(response);
                            int len = jsoArray.length();

                            listData = new String[len];

                            for (int x = 0; x < len; x++){
                                JSONObject obj = jsoArray.getJSONObject(x);
                                listData[x] = obj.getString("name");

                                AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
                                LayoutInflater inflater = getLayoutInflater();
                                View convertView = (View) inflater.inflate(R.layout.listdialog, null);
                                alertDialog.setView(convertView);
                                alertDialog.setTitle("List");
                                ListView lv = (ListView) convertView.findViewById(R.id.listView1);
                                ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, listData);
                                lv.setAdapter(adapter);
                                lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                                    @Override
                                    public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                                        Toast.makeText(getApplicationContext(), "You picked: "+listData[position], Toast.LENGTH_SHORT).show();
                                    }
                                });
                                alertDialog.show();
                            }
                        }
                        catch (JSONException je){
                            Toast.makeText(getApplicationContext(), "JSON error: "+je.getMessage(), Toast.LENGTH_SHORT).show();
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
               Toast.makeText(getApplicationContext(), "Error...", Toast.LENGTH_SHORT).show();
            }
        });

        queue.add(dataRequest);
    }
}

Parsing the JSON and displaying it with ListView works fine. But if you press the back button, the AlertDialog will not be dismissed (the repo is here). Normally, it should. Why?


Solution

  • Setting setCancelable(true) attribute to your dialog should make the work.

    Just before showing your dialog set this flags as below.

         AlertDialog dialog = alertDialog.create();
         dialog.setCancelable(true);
         dialog.show();
    

    If you want to close it only on outside dialog touch and not back button click then you can just set

         dialog.setCanceledOnTouchOutside(true);
    

    Regards!