从ListView中删除所选项目

4
我使用了List和ArrayAdapter来将字符串放入ListView中。现在我想删除所选项目。我尝试了下面的代码,但它并不起作用。我该如何解决?
这是我的代码:
TextView t1;
String[] temp;
mylist = (ListView) findViewById(R.id.list);
final List<String> wordList = Arrays.asList(temp);
adapter = new ArrayAdapter<String>(this,
                                   android.R.layout.simple_list_item_multiple_choice, 
                                   wordList);
delete.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View arg0) {
       int index = mylist.getSelectedItemPosition();
       int count=mylist.getCount();
       for(int i=0;i<=count;i++) {
           if (index >= 0) {
               t1.setText(wordList.remove(index));
           }
           adapter.notifyDataSetChanged();
       } 
   }
});

以下是更多的源代码:

    public class Edit extends Activity {
        SharedPreferences sharedpref;
        ListView mylist;
        String[] temp;
        String name, 
        ArrayAdapter<String> adapter;
        Button save, delete, cancel;
        TextView t1;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.edit);
            mylist = (ListView) findViewById(R.id.list);
            cancel = (Button) findViewById(R.id.cancel1);
            save = (Button) findViewById(R.id.save1);
            delete = (Button) findViewById(R.id.delete1);
            t1=(TextView)findViewById(R.id.textView1);
            sharedpref = PreferenceManager
                    .getDefaultSharedPreferences(getApplicationContext());
            name = sharedpref.getString("Visible_selected", "");

            String delimiter = "\n";
            temp = name.split(delimiter);

            mylist.setItemsCanFocus(true);
            mylist.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
             final List<String> wordList = Arrays.asList(temp);  

            adapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_multiple_choice, wordList);
            mylist.setAdapter(adapter);
            save.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub

                }
            });

            delete.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
                    mylist.setOnItemClickListener(new OnItemClickListener() {
                        private String getSelectedItemOfList;
                        @Override
                        public void onItemClick(AdapterView<?> arg0, View arg1,
                                int arg2, long arg3) {
                            // TODO Auto-generated method stub
                             getSelectedItemOfList = sortedList.get(arg2).getStr_movieParam();


                }
            });

            cancel.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub

                }
            });

        }

    }

这是我的更新代码:

enter code here

delete.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
         adapter.remove(getSelectedItemOfList);
         adapter.notifyDataSetChanged();
            }
        });
        mylist.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                // TODO Auto-generated method stub
                SparseBooleanArray checkedPositions =mylist.getCheckedItemPositions();
                if(checkedPositions.get(arg2)==true){
                getSelectedItemOfList = (String) mylist.getItemAtPosition(arg2);
                t1.append(getSelectedItemOfList.toString()+"\n");}
            }
        });

这是否会产生任何错误或异常? - Avi Kumar
没有错误显示。 - user1580945
什么按钮?“simple_list_item_multiple_choice”长什么样子? 你怎么知道哪些已经被选中了? 你展示的是一个小东西。我通常会从我的ArrayList中删除,然后创建一个新的适配器,将其设置为列表视图,并调用notifydatasetchanged。 - Anders Metnik
为列表设置onitemclick,而不是为按钮设置。 - G_S
@sharath G,我可以像您说的那样使用列表的onitem,但是我希望在单击删除按钮时显示更改。 - user1580945
然后,您需要保存从列表视图的onitemclick获取的列表项单击的内容,并在下一步单击删除按钮时从arrayadapter中删除它。 - G_S
10个回答

6
尝试实现onitemclickListener并获取item id,然后在arrayadapter中删除所点击的项,接下来调用adapter.notifyDataSetChanged()。

2

试试这个...

        mylist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapter, View v, int position,
                                long arg3) {
            String value = (String) adapter.getItemAtPosition(position);
            adapter.remove(value);
            adapter.notifyDataSetChanged();               
        }
    });

Android Studio 2.3.3 => 这里的 .remove(value) 和 .notifyDataSetChanged() 是适配器类方法,而不是 AdapterView<?> 方法。例如,如果适配器类名为 ProductAdapter,对象名为 prodAdapter,则 Product prod = (Product) adapter.getItemAtPosition(position); prodAdapter.remove(prod); prodAdapter.notifyDataSetChanged(); - Saravanan Sachi

1
我认为你应该使用OnItemClickListener()来处理listview,这样当你选择/点击任何列表项时,你将得到所选项目的名称,然后你可以执行删除操作。尝试一下。
    mylist.OnItemClickListener(listenerOflistView);

private OnItemClickListener listenerOflistView = new OnItemClickListener() {
    private String getSelectedItemOfList;

    public void onItemClick(AdapterView<?> view, View view1, int pos,
            long arg3) {
        // TODO Auto-generated method stub

    getSelectedItemOfList = mylist.get(pos).toString(); // here you will get selected item name.
      }
    }

希望这能对您有所帮助。

不在logcat中...它向我显示要创建一个局部变量..SortedList是一种属性吗? - user1580945
我已经更改了我的帖子,SortedList是我在应用程序中使用的列表,请更新您的代码。 - Akshay
呀..我已经使用了单独的监听器..而且我用了这个..adapter.remove(getSelectedItemOfList); adapter.notifyDataSetchange();..但它显示强制关闭.. - user1580945
我的列表.设置在项上{获取列表所选项 = (String) 我的列表.获取项目位置(arg2); t1.append(获取列表所选项.toString()+"\n");}} - user1580945
delete.setonclick{getSelectedItemOfList);adapter.notifyDataSetchange();}...我正在使用这个。 - user1580945
显示剩余9条评论

1

看一下这段代码,它可以帮助你理解如何在ListView中删除项目。

private ArrayList<String> students = new ArrayList<>();
private ArrayAdapter<String> arrayAdapter;
private ListView myListView;
private int getSelectedIndex = -1;


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

    myListView = (ListView) findViewById(R.id.myListView);
    students.add("rahim");
    students.add("karim");
    students.add("sumon");
    students.add("rakib");
    students.add("porag");
    arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, students);
    myListView.setAdapter(arrayAdapter);
    myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {


        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Toast.makeText(getApplicationContext(), "hello " + students.get(position), Toast.LENGTH_LONG).show();
            MainActivity.this.getSelectedIndex = position;
            for (int i = 0; i < myListView.getChildCount(); i++) {
                if(position == i ){
                    myListView.getChildAt(i).setBackgroundColor(Color.BLUE);
                }else{
                    myListView.getChildAt(i).setBackgroundColor(Color.TRANSPARENT);
                }
            }


        }
    });

}

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.add:
            Toast.makeText(getApplicationContext(), "Item 1 Selected", Toast.LENGTH_LONG).show();
            return true;
        case R.id.delete:
            if(this.getSelectedIndex!=-1){
                students.remove(this.getSelectedIndex);
                this.getSelectedIndex = -1;

                arrayAdapter.notifyDataSetChanged();
                myListView.setAdapter(arrayAdapter);

            }
            return true;
        default:
            return false;
    }
}

0

首先我想告诉你,你写的代码是错误的...也许你想在列表视图上使用上下文菜单。

如果你正在获取所选项目的位置,那么你可以有:

adapter.removeItem(adapter.getItem(position));
adapter.notifyDatasetChanged()

希望这能帮到你


也许我们想要通过设置的项目ID而不是位置来进行删除。 - Habib Zare

0

替换

delete.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            mylist.setOnItemClickListener(new OnItemClickListener() {
                private String getSelectedItemOfList;
                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1,
                        int arg2, long arg3) {
                    // TODO Auto-generated method stub
                     getSelectedItemOfList = sortedList.get(arg2).getStr_movieParam();
        }
    });

使用

 mylist.setOnItemClickListener(new OnItemClickListener() {
                private String getSelectedItemOfList;
                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1,
                        int arg2, long arg3) {
                    // TODO Auto-generated method stub
                     getSelectedItemOfList = sortedList.get(arg2).getStr_movieParam();
        }
    });

并且

delete.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {

                 adapter.remove(getSelectedItemOfList );
adapter.notifydatasetChanged

        }
    });

检查这个


@Sharath和Akshay,我已经按照你们说的使用notifydatasetchanged进行了更新。我会在这里更新代码,命名为update3,请查看并提供您的解决方案。 - user1580945
您正在尝试从适配器列表中删除所有元素。 我认为那不是您需要的。 您的列表视图中甚至有一个复选框? - G_S
抱歉,请原谅我犯了一个错误。我会清楚地告诉您,我选择的项目应该从列表中删除。我在我的ListView中使用simple_list_item_multiple_choice命令来创建复选框。现在我想要删除存储在getSelectedItemOfList中的项目。 - user1580945
你正在使用多选框的多选功能吗? - G_S
是的,我明白了。 可以使用类似以下代码获取ListView中所有选中项的位置: SparseBooleanArray selectedPos = getListView().getCheckedItemPositions(); 或者尝试查看以下链接:https://dev59.com/5m445IYBdhLWcg3wfKYZ - G_S
显示剩余7条评论

0

公共类ListTest扩展自Activity {

String selectedItem;
ArrayAdapter<String> adapter;
ArrayList<String> newList = new ArrayList<String>();
ListView l1;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.list_test);

  l1 = (ListView) findViewById(R.id.lsvSign);

    newList.add("Android");
    newList.add("iOS");
    newList.add("Mac");
    newList.add("Windows");
    newList.add("Linux");;
    Collections.sort(newList);
    adapter = new new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,newList);
    l1.setAdapter(adapter);  


  l1.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position,
            long arg3) {            
         selectedItem = l1.getItemAtPosition(position).toString();           
       RemoveItem(selectedItem);

    }
});  
protected void RemoveItem(String item) {
    newList.remove(item);
    adp2.notifyDataSetChanged();
}   
}

}


0
我认为最好的方法是(真正的最佳方法是自定义适配器),在您的类中保留项目的arraylist副本。然后,当调用删除时,从您的arraylist副本中删除该项并重新初始化listview。


0
尝试以下可行代码:listAdapter.remove(listAdapter.getItem(position));mainListView.setAdapter(listAdapter);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接