Вопрос

I am currently having issues accessing public array list in an setPositiveButton onClick function. accessing it with this doesn't work. Here is my code:

Declaring the array list with title modules.

public class DisplayModulesActivity extends ActionBarActivity implements AdapterView.OnItemClickListener {

    ArrayList<Modules> modules;
    ArrayAdapter adapter;

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

        modules = new ArrayList<Modules>();
        modules.add(new Modules("387COM Smartphone App Development"));

        ListView listView = (ListView) findViewById(R.id.moduleList);

        adapter = new ArrayAdapter<Modules>(this,
                android.R.layout.simple_list_item_1, modules);

        listView.setAdapter(adapter);
        registerForContextMenu(listView);
        listView.setOnItemClickListener(this);
    }
}

I want to access the array list here and remove something from it (line with modules.remove(i); it does not work.

public boolean onContextItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.delete_module) {
        AlertDialog.Builder confirmDel = new AlertDialog.Builder(this);
        confirmDel
                .setMessage("Are you sure you want to delete this module and all its contents?");
        confirmDel.setCancelable(true);
        confirmDel.setPositiveButton("Yes",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface,
                            int i) {
                        Log.v("Test", "Confirm Delete YES pressed");
                        // AdapterView.AdapterContextMenuInfo info =
                        // (AdapterView.AdapterContextMenuInfo)
                        // item.getMenuInfo();
                        // int i = info.position;
                        modules.remove(i);
                        // adapter.notifyDataSetChanged();
                    }
                });
        confirmDel.setNegativeButton("No", null);

        confirmDel.show();
    }
}

Any ideas please?

FIX

public boolean onContextItemSelected(final MenuItem item)
{
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
    final int arrayItem = info.position;

    if(item.getItemId() == R.id.delete_module)
    {
        AlertDialog.Builder confirmDel = new AlertDialog.Builder(this);
        confirmDel.setMessage("Are you sure you want to delete this module and all its contents?");
        confirmDel.setCancelable(true);
        confirmDel.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                Log.v("Test", "Confirm Delete YES pressed");

                modules.remove(arrayItem);
                adapter.notifyDataSetChanged();
            }
        });
        confirmDel.setNegativeButton("No", null);

        confirmDel.show();
    }
Это было полезно?

Решение

You problem is, that i is not the position of the item in the ArrayList modules.
It is the position of the positive button (which might be 0 or 1 or 2 on every click, no matter which icon; maybe it's -1).

To fix this problem do the following:

Save/use the position given in onItemClick(AdapterView<?> parent, View view, int position, long id) and somehow pass it through to the onClickListener() of the dialog. Use this position to remove an item from your modules list.

E.g. in onItemClick() save position to a filed of your class mClickedPosition and call modules.remove(mClickedPosition) in the listener.

Другие советы

just add this in your code:

         adapter = new ArrayAdapter<Modules>(this,android.R.layout.simple_list_item_1,modules);

         listView.setAdapter(adapter);

do this ;)

public boolean onContextItemSelected(MenuItem item)
{
if(item.getItemId() == R.id.delete_module)
{
    AlertDialog.Builder confirmDel = new AlertDialog.Builder(this);
    confirmDel.setMessage("Are you sure you want to delete this module and all its contents?");
    confirmDel.setCancelable(true);
    confirmDel.setPositiveButton("Yes", new DialogInterface.OnClickListener()
    {
        @Override
        public void onClick(DialogInterface dialogInterface, int i)
        {
            Log.v("Test", "Confirm Delete YES pressed");
            //AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
            //int i = info.position;
            modules.remove(i);
             adapter = new ArrayAdapter<Modules>(this,android.R.layout.simple_list_item_1,modules);

             listView.setAdapter(adapter);
        }
    });
    confirmDel.setNegativeButton("No", null);

    confirmDel.show();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top