2017-10-12 127 views
2

我有一个listview包含很多项目。我在列表视图项目上做了多个删除操作。但是,当我从列表视图中只选择第二个或第三个项目时,它只删除列表中的第一个项目而不是选定的项目。 请帮我解决这个家伙。删除listview项只删除第一项

这里是我的代码:

/////multiple delete on clicking listview/////// 

    listview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 

    listview.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() { 

     @Override 
     public void onItemCheckedStateChanged(ActionMode mode, 
               int position, long id, boolean checked) { 
      // Capture total checked items 
      final int checkedCount = listview.getCheckedItemCount(); 

      // Set the CAB title according to total checked items 
      mode.setTitle(checkedCount + " Selected"); 
      // Calls toggleSelection method from ListViewAdapter Class 
      adapter.toggleSelection(position); 

     } 

     @Override 
     public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
      switch (item.getItemId()) { 
       case R.id.delete: 
        // Calls getSelectedIds method from ListViewAdapter Class 
        SparseBooleanArray selected = adapter.getSelectedIds(); 
        // Captures all selected ids with a loop 
        for (int i = 0; i < (selected.size()); i++) { 
         if (selected.valueAt(i)) { 

          all_memories_getter_setter selecteditem = (all_memories_getter_setter) adapter.getItem(selected.keyAt(i)); 


          getContentResolver().delete(DataProvider.WRITE_URI, DataProvider.ID + '=' + list.get(i).getId(), null); 

          System.out.println("##############values of ss" + list.get(i).getId()); 

          // Remove selected items following the ids 
          adapter.remove(selecteditem); 

         } 

         populateList(); 

        } 
        adapter = new ListViewAdapter(All_memories.this, list); 
        listview.setAdapter(adapter); 


        mode.finish(); 
        return true; 

     default: 
        return false; 
      } 
     } 
    @Override 
     public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
      mode.getMenuInflater().inflate(R.menu.main, menu); 
      return true; 
     } 

     @Override 
     public void onDestroyActionMode(ActionMode mode) { 
      // TODO Auto-generated method stub 
      adapter.removeSelection(); 
     } 

     @Override 
     public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
      // TODO Auto-generated method stub 
      return false; 
     } 
    }); 

这里是我的适配器代码: 多个删除列表视图项目在这里我加入了代码。

public class ListViewAdapter extends BaseAdapter { 

public ArrayList<all_memories_getter_setter>list; 
Activity activity; 

/////**///// multiple delete 
private SparseBooleanArray mSelectedItemsIds; 

public ListViewAdapter(Activity activity, ArrayList<all_memories_getter_setter>list) 
{ 
    super(); 
    mSelectedItemsIds= new SparseBooleanArray(); 
    this.activity=activity; 
    this.list=list; 
} 
@Override 
public int getCount() { 
    return list.size(); 
} 

@Override 
public Object getItem(int position) { 
    return list.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return 0; 
} 


/////**/////// for multiple delete 
public void remove(all_memories_getter_setter object){ 
    list.remove(object); 
    notifyDataSetChanged(); 
} 

public List<all_memories_getter_setter> getall_memories_getter_setter(){ 
    return list; 
} 

public void toggleSelection(int position){ 
    selectView(position, !mSelectedItemsIds.get(position)); 

} 
public void removeSelection(){ 
    mSelectedItemsIds = new SparseBooleanArray(); 
    notifyDataSetChanged(); 
} 

public void selectView(int position , boolean value){ 
    if(value){ 
     mSelectedItemsIds.put(position, value); 
    }else{ 
     mSelectedItemsIds.delete(position); 
     notifyDataSetChanged(); 
    } 

} 
public int getSelectedCount(){ 
    return mSelectedItemsIds.size(); 
} 
public SparseBooleanArray getSelectedIds(){ 
    return mSelectedItemsIds; 
} 



/////**/////// for multiple delete 

public class Viewholder 
{ 
    TextView txtFirst; 
    TextView txtSecond; 
    TextView txtThird; 
} 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 


    Viewholder holder; 
    LayoutInflater inflater = activity.getLayoutInflater(); 

    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.activity_all_memories_listview, null); 
     holder = new Viewholder(); 

     holder.txtFirst = (TextView) convertView.findViewById(R.id.list_date); 
     holder.txtSecond = (TextView) convertView.findViewById(R.id.list_title); 
     holder.txtThird = (TextView) convertView.findViewById(R.id.list_content); 
     convertView.setTag(holder); 

    } else { 
     holder = (Viewholder) convertView.getTag(); 
    } 

    holder.txtFirst.setText("" + list.get(position).getDate()); 
    holder.txtSecond.setText("" + list.get(position).getTitle()); 
    holder.txtThird.setText("" + list.get(position).getContent()); 
    return convertView; 
} 
} 
+2

您需要将其从列表中删除。并刷新你的列表视图。通过调用适配器上的'notifyDataSetChanged()'。并设置适配器只有一次。另外'populateList()'做什么?你应该发布这些细节以及 – Raghunandan

+0

@Raghunandan说得好。 –

+0

populatelist()是我的列表视图项目函数。当我输入数据时,它将填充为列表。 – teddy

回答

4

getItemId

获取与该列表中的指定位置相关的行ID。

你应该通过position,而不是0

不要

@Override 
public long getItemId(int position) { 
    return 0; // WRONG 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 
+0

是的,我按照你的建议改变了我的代码。但是它只能删除第一个项目 – teddy

+0

@teddy,你应该调试你的代码。首先检查位置。关注#拉古南丹的评论。 –

0

更改您remove方法采取特定的位置,而不是目的。

public void remove(int position){ 
    list.remove(position); 
    notifyDataSetChanged(); 
} 

而在同时调用方法传递,而不是对象的ID

adapter.remove(i); 

编辑: 您正在使用被点击的项目时,不更新稀疏布尔矩阵。

SparseBooleanArray selected = adapter.getSelectedIds(); 

该值总是返回零并且选定的项目始终为零。因此,第一个项目总是被删除。

+0

是的,我改变了。但它只删除第一项 – teddy

+0

你的clickListener在哪里?你在哪里更新mSelectedItemsIds? – Anonymous