【问题标题】:delete listview items deleting only first item删除列表视图项目仅删除第一个项目
【发布时间】:2017-10-12 06:49:37
【问题描述】:

我有一个包含许多项目的列表视图。我正在对列表视图项目进行多次删除。但是当我从列表视图中仅选择第二个或第三个项目时,它只会删除列表中的第一个项目而不是所选项目。 请帮我解决这个问题。

这是我的代码:

/////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;
}
}

【问题讨论】:

  • 您需要将其从列表中删除。并刷新您的列表视图。通过在适配器上调用notifyDataSetChanged()。并且只设置一次适配器。还有populateList() 是做什么的?您也应该发布这些详细信息
  • @Raghunandan 说得好。
  • populatelist() 是我的列表视图项功能。当我输入数据时,它将填充为列表。

标签: android listview


【解决方案1】:

getItemId

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

你应该传递 position 而不是 0

不要

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

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

【讨论】:

  • 是的,我已按照您的建议更改了代码。但它只删除第一项
  • @teddy 你应该调试你的代码。首先检查位置。关注#Raghunandan 的评论。
【解决方案2】:

更改您的删除方法以获取特定位置而不是对象。

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

并且在调用方法时传递ID而不是对象

adapter.remove(i);

编辑: 您使用的是稀疏布尔数组,单击项目时不会更新。

 SparseBooleanArray selected = adapter.getSelectedIds();

此值始终返回零,所选项目始终为零。因此第一项始终被删除。

【讨论】:

  • 是的。我已经改变了。但它只删除第一项
  • 你的 clickListener 在哪里?你在哪里更新 mSelectedItemsIds?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
相关资源
最近更新 更多