A. Reverté
A. Reverté

Reputation: 35

How to delete an Item from a Spinner Using an AlertDialog

I'm trying to make an Activity that deletes the item pressed on the Spinner using an AlertDialog. I'm not deleting anything yet, I just added a Toast to make sure it will work.

This is my code:

public class SpinnerActivity extends AppCompatActivity {

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

    final Spinner spinner = (Spinner) findViewById(R.id.spinner);
    final Context context = getApplicationContext();

    // Create an ArrayAdapter using the string array and a default spinner layout
    final ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
            R.array.planets_array, android.R.layout.simple_spinner_item);

    // Specify the layout to use when the list of choices appears
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    // Apply the adapter to the spinner
    spinner.setAdapter(adapter);

    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        int selectionCurrent = spinner.getSelectedItemPosition();
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            if (selectionCurrent != position) {
                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);

                // set title
                alertDialogBuilder.setTitle(R.string.dialogtitle);

                //set dialog message
                alertDialogBuilder.setMessage(R.string.dialogtext).setCancelable(false)
                        .setPositiveButton(R.string.si,new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,int id) {
                                // if this button is clicked,
                                Toast.makeText(context, "Eliminar", Toast.LENGTH_SHORT).show();
                            }
                        }) .setNegativeButton(R.string.no
                        , new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        // if this button is clicked, do nothing
                        dialog.cancel();
                    }
                });
                alertDialogBuilder.setView(spinner);
                AlertDialog alertDialog = alertDialogBuilder.create();
                // show it
                alertDialog.show();
            }
            selectionCurrent = position;
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

}

When I run the code, the following error is displayed: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

I tried to use ((ViewGroup)spinner.getParent()).removeView(spinner); before the alertDialog.show(); but it still not working.

It says: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

Anyone knows how to solve the problem?

Upvotes: 1

Views: 176

Answers (1)

Miguel Benitez
Miguel Benitez

Reputation: 2322

First create a variable to inflate the ArrayAdapter:

String[] mTestArray;

Get the data from resources:

mTestArray = getResources().getStringArray(R.array.planets_array);  

Inflate the ArrayAdapter with this array:

final ArrayList<String> list =new ArrayList<String>(Arrays.asList(mTestArray));  
    final ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, list);

And finally remove it in your dialog:

final ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
        mTestArray , android.R.layout.simple_spinner_item);

        String item = list.get(position);


@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    if (selectionCurrent != position) {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);

        // set title
        alertDialogBuilder.setTitle(R.string.dialogtitle);

        //set dialog message
        alertDialogBuilder.setMessage(R.string.dialogtext).setCancelable(false)
                .setPositiveButton(R.string.si,new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,int id) {
                        list.remove(position);
                        adapter.notifyDataSetChanged();
                        // if this button is clicked,
                        Toast.makeText(context, "Eliminar", Toast.LENGTH_SHORT).show();
                    }
                }) .setNegativeButton(R.string.no
                , new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                // if this button is clicked, do nothing
                dialog.cancel();
            }
        });
        alertDialogBuilder.setView(spinner);
        AlertDialog alertDialog = alertDialogBuilder.create();
        // show it
        alertDialog.show();
    }
    selectionCurrent = position;
}           

Upvotes: 1

Related Questions