ListView中的ListView-delete项目:android

时间:2013-03-19 02:45:28

标签: android eclipse

我是android的新手,我在我的代码中使用了ListView。我的代码如下:

import java.util.ArrayList;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.util.SparseBooleanArray;
import android.view.Menu;
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 android.content.DialogInterface;

@SuppressLint("NewApi")
public class MainActivity extends Activity 
{
int counter;
ListView listView;
ArrayAdapter <String> adapter;
Button btnAddAgain, btnDeleteSelected;
ArrayList <String>listItems=new ArrayList<String>();

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    counter=0;
    listView=(ListView) findViewById(R.id.myList);
    adapter= new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice,listItems);
    listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    listView.setAdapter(adapter);

    btnAddAgain=(Button) findViewById(R.id.addAgain);
    btnAddAgain.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View arg0) 
        {
            listItems.add("Clicked " +counter++);
            adapter.notifyDataSetChanged();
        }
    });

    btnDeleteSelected=(Button) findViewById(R.id.btnDelete);
    btnDeleteSelected.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View arg0) 
        {
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setMessage("Delete?");
            builder.setTitle("Confirm Action");
            builder.setPositiveButton("Delete", new DialogInterface.OnClickListener() 
            {
                public void onClick(DialogInterface dialog, int id) 
                {
                    SparseBooleanArray checked = listView.getCheckedItemPositions();
                    for (int i = 0; i < listItems.size(); i++)
                    {
                        if (checked.get(i)==true)
                        {
                            listItems.remove(i);
                            adapter.notifyDataSetChanged();
                        }
                    }
                    //checked.clear();
                }
             });
            builder.setNegativeButton("Cancel", null);
            builder.create();
            builder.show();
        }
    });




}

@Override
public boolean onCreateOptionsMenu(Menu menu) 
{
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

但删除按钮只删除ListView的第一个元素。有人请帮帮我。我正在尝试自己学习android。你的帮助对我学习android非常有益。我在代码中做了哪些更改,以从列表中删除已检查的项目。谢谢你们

3 个答案:

答案 0 :(得分:0)

如果我没记错的话,当你使用.get()时,getCheckedItemPositions()会为所有值返回false。 你想要使用的是checked.valueAt(i)== true 请看SparseBooleanArray

在你的情况下填充SparseBooleanArray的方式似乎没有键,这意味着你的所有.get(key)都将返回false,因为它无法找到该项。相反,您应该只使用valueAt(int index),因为您可以使用索引来查找哪些项是真的。

因此,您的代码应如下所示:

for (int i = 0; i < listItems.size(); i++)
                    {
                        if (checked.valueAt(i)==true)
                        {
                            listItems.remove(i);
                            adapter.notifyDataSetChanged();
                        }
                    }

答案 1 :(得分:0)

listView.getCheckedItemPositions();仅返回已检查的位置

试试此代码

SparseBooleanArray checked = listView.getCheckedItemPositions();
int min = 0;
for(int i=0; i<checked.size();i++){
    int pos = checked.keyAt(i);
    listItems.remove(pos - min);
    min++;
}
adapter.notifyDataSetChanged();

希望这有助于你;

答案 2 :(得分:0)

试试这个

public void onClick(DialogInterface dialog, int id) 
            {
                SparseBooleanArray checked = listView.getCheckedItemPositions();
                int size = listItems.size() - 1;
                for (int i = size; i > -1; i--)
                {
                    if (checked.get(i))
                    {
                        listItems.remove(i);

                    }
                }
                adapter.notifyDataSetChanged();
                //checked.clear();
            }
         });