Android-从列表视图中删除多个项目

Android-从列表视图中删除多个项目,android,listview,android-listview,items,Android,Listview,Android Listview,Items,问题已解决: 对于将来遇到此问题的任何人,我发现这本不错的教程: 并根据我自己的需要重新调整了它。我没有将MultichoiceModelListener与ActionBar一起使用,而是使用了我原来的OnClickListener 此外,我无法从xml中获得它们的高亮显示,因此我保留了原始的高亮显示代码。在我删除项目后,颜色没有消失,因此我最终遍历了所有视图,并在每次删除后将它们设置为透明。这不是最有效的方法,但它是有效的 原始问题: 我一直在尝试通过使用ListView ListView单击

问题已解决:

对于将来遇到此问题的任何人,我发现这本不错的教程:

并根据我自己的需要重新调整了它。我没有将MultichoiceModelListener与ActionBar一起使用,而是使用了我原来的OnClickListener

此外,我无法从xml中获得它们的高亮显示,因此我保留了原始的高亮显示代码。在我删除项目后,颜色没有消失,因此我最终遍历了所有视图,并在每次删除后将它们设置为透明。这不是最有效的方法,但它是有效的

原始问题:

我一直在尝试通过使用ListView ListView单击多个项目来选择它们,然后通过单击按钮来删除它们。我制作了一个数组适配器,这样我可以格式化我的项目。然而,问题是每当我删除一个或多个项目时,唯一被删除的是列表末尾的项目

我也看过其他有类似问题的人,但不幸的是,他们都没有用。我很难受,需要帮助

使用ListView的我的片段:

public class SellEquipment extends Fragment {
ListView listview;
String[] itemname ={
         "Safari",
         "Camera",
         "Global",
         "World",
         "Test"
         };

ArrayList<String> list;
private EquipmentViewAdapter adapter;
private ArrayList<Integer> sellList;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    View view = inflater.inflate(R.layout.sellequipment_activity, container, false);
    list = new ArrayList<String>();
    for (String item : itemname) {
        list.add(item);
    }


    sellList = new ArrayList<Integer>();
    adapter = new EquipmentViewAdapter(getActivity(), itemname, list);

    Button sellBtn = (Button) view.findViewById(R.id.sellBtn);

    sellBtn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
        /*  SparseBooleanArray itemPos = listview.getCheckedItemPositions();
            int itemCount = listview.getCount();
            for (int i = itemCount - 1; i >= 0; i--) {
                if (itemPos.get(i)) {
                    adapter.remove(list.get(i));
                }
            }
            listview.clearChoices();
            adapter.notifyDataSetChanged();*/

            for (int position : sellList) {
                list.remove(position);
            }
            sellList.clear();
            adapter.notifyDataSetChanged();
            listview.clearChoices();
        }
    });
    listview = (ListView) view.findViewById(R.id.list);
    listview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    listview.setAdapter(adapter);
    listview.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            //String SelectedItem = itemname[position];
            if (!sellList.contains(position)) {
                listview.setItemChecked(position, true);
                view.setBackgroundColor(Color.BLUE);
                sellList.add(position);
            } else {
                listview.setItemChecked(position, false);
                view.setBackgroundColor(Color.TRANSPARENT);
                sellList.remove(Integer.valueOf(position));
            }
            //list.remove(position);
            //adapter.notifyDataSetChanged();
            //Toast.makeText(getActivity().  getApplicationContext(), SelectedItem, Toast.LENGTH_SHORT).show();
        }
    });
    return view;
}  
}
公共类设备扩展片段{
列表视图列表视图;
字符串[]itemname={
“狩猎旅行”,
“摄像机”,
“全球”,
“世界”,
“测试”
};
数组列表;
专用设备视图适配器;
私有ArrayList销售列表;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
super.onCreate(savedInstanceState);
视图=充气机。充气(R.layout.sellequipment\u活动,容器,错误);
列表=新的ArrayList();
for(字符串项:itemname){
列表。添加(项目);
}
sellList=newarraylist();
适配器=新设备视图适配器(getActivity(),itemname,list);
Button sellBtn=(Button)view.findViewById(R.id.sellBtn);
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
/*SparseBooleanArray itemPos=listview.getCheckedItemPositions();
int itemCount=listview.getCount();
对于(int i=itemCount-1;i>=0;i--){
如果(项目位置获取(i)){
adapter.remove(list.get(i));
}
}
clearChoices();
adapter.notifyDataSetChanged()*/
对于(内部位置:sellList){
列表。删除(位置);
}
sellList.clear();
adapter.notifyDataSetChanged();
clearChoices();
}
});
listview=(listview)view.findViewById(R.id.list);
listview.setChoiceMode(listview.CHOICE\u MODE\u MULTIPLE);
setAdapter(适配器);
setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
//字符串SelectedItem=itemname[position];
如果(!sellList.contains(位置)){
setItemChecked(位置,true);
视图。setBackgroundColor(颜色。蓝色);
sellList.add(位置);
}否则{
setItemChecked(位置,false);
视图.setBackgroundColor(颜色.透明);
sellList.remove(Integer.valueOf(position));
}
//列表。删除(位置);
//adapter.notifyDataSetChanged();
//Toast.makeText(getActivity().getApplicationContext(),SelectedItem,Toast.LENGTH\u SHORT.show();
}
});
返回视图;
}  
}
这是我的适配器:

public class EquipmentViewAdapter extends ArrayAdapter<String> {

private final Activity context;
private final String[] itemname;
private final List<String> list;

public EquipmentViewAdapter(Activity context, String[] itemname, ArrayList<String> list) {
    super(context, R.layout.mylist, list);
    // TODO Auto-generated constructor stub

    this.context = context;
    this.itemname = itemname;
    this.list = list;
}
@Override
public View getView(int position,View view,ViewGroup parent) {
    View rowView = view;

    if (rowView == null) {
        LayoutInflater inflater = context.getLayoutInflater();
        rowView = inflater.inflate(R.layout.mylist, null);
    }

    TextView txtTitle = (TextView) rowView.findViewById(R.id.item);
    ImageView imageView = (ImageView) rowView.findViewById(R.id.icon);
    TextView lvl = (TextView) rowView.findViewById(R.id.textView1);
    TextView spd = (TextView) rowView.findViewById(R.id.textView2);
    TextView rch = (TextView) rowView.findViewById(R.id.textView3);

    txtTitle.setText(itemname[position]);
    //@todo get data from array list or 2D array
    imageView.setImageResource(R.drawable.ic_launcher); // have the pictured ordered correctly
    lvl.setText("lvl: " + itemname[position]);
    spd.setText("spd: " + itemname[position]);
    rch.setText("rch: " + itemname[position]);
    return rowView;
}
}
公共类设备ViewAdapter扩展了ArrayAdapter{
私人最终活动背景;
私有最终字符串[]itemname;
私人最终名单;
公共设备ViewAdapter(活动上下文,字符串[]项名称,ArrayList列表){
super(context,R.layout.mylist,list);
//TODO自动生成的构造函数存根
this.context=上下文;
this.itemname=itemname;
this.list=列表;
}
@凌驾
公共视图getView(内部位置、视图视图、视图组父视图){
视图行视图=视图;
if(rowView==null){
LayoutInflater充气器=上下文。getLayoutInflater();
rowView=充气机.充气(R.layout.mylist,null);
}
TextView txtTitle=(TextView)rowView.findViewById(R.id.item);
ImageView ImageView=(ImageView)rowView.findViewById(R.id.icon);
TextView lvl=(TextView)rowView.findViewById(R.id.textView1);
TextView spd=(TextView)rowView.findViewById(R.id.textView2);
TextView rch=(TextView)rowView.findViewById(R.id.textView3);
setText(项目名称[位置]);
//@todo从数组列表或二维数组获取数据
imageView.setImageResource(R.drawable.ic_launcher);//正确订购图片
lvl.setText(“lvl:+itemname[位置]);
spd.setText(“spd:+itemname[位置]);
rch.setText(“rch:+itemname[位置]);
返回行视图;
}
}
任何帮助都将不胜感激,我真的在这件事上大发雷霆!
谢谢大家!

您从中删除的列表不是适配器正在使用的列表。当您将
list
传递到适配器时,它会被复制。您需要从适配器正在使用的列表中删除。

更新:

sellList
更改为包含
String
s

private ArrayList<String> sellList;

@Override
public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
    String item = adapter.getItem( position );
    if (!sellList.contains( item )) {
        listview.setItemChecked(position, true);
        view.setBackgroundColor(Color.BLUE);
        sellList.add( item );
    } else {
        listview.setItemChecked(position, false);
        view.setBackgroundColor(Color.TRANSPARENT);
        sellList.remove( item );
    }
}

是的,我想这也是我所看到的。您可以使用“sellList.remove”,它只从Intiger列表中删除项目。但您需要做的是删除它自己的ListItem。所以我猜测类似于“listview.remove(item)”的东西。看看这是否有助于
adapter.remove(adapter.getItem(position)),正如injecteer所写。但是,我无法确定项目是如何从列表末尾删除的,至少不能从发布的代码中删除。我已经尝试了两种方法,不幸的是,我仍然收到了
        for (String item : sellList) {
            adapter.remove( item );
        }
        sellList.clear();
        adapter.notifyDataSetChanged();
        listview.clearChoices();