0

当我长按列表视图中的任何项目时,会显示上下文操作栏。现在我想要的是,当我在选择项目后按下删除按钮时,所选项目会被删除,但我无法获得所选项目的位置。我的多选模式代码是:

listViewMessages.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listViewMessages.setMultiChoiceModeListener(new MultiChoiceModeListener() {

    @Override
    public void onItemCheckedStateChanged(ActionMode mode, int position,
                                      long id, boolean checked) {
       mode.setTitle(listViewMessages.getCheckedItemCount()+ " Selected");

    }

    @Override
    public boolean onActionItemClicked(final ActionMode mode, MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu:
                deleteScreenedMessageFromInbox();                                       
                  mode.finish();
                return true;
            default:
                return false;
        }
    }

    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        // Inflate the menu for the CAB
        MenuInflater inflater = mode.getMenuInflater();
        inflater.inflate(R.menu.contextual, menu);
        return true;
    }


    @Override
    public void onDestroyActionMode(ActionMode mode) {

    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false;
    }
});

当我单击删除按钮时,此方法正在调用:

deleteScreenedMessageFromInbox();

我必须在此方法中传递一个参数,即所选项目的位置。此方法的代码是:

public void deleteScreenedMessageFromInbox(Integer position) {

Integer id = smsIDs.get(position);

String deleteScreenedMessage = "delete from " + "sms" + " where " + "id" + " = " + id;

DBsms smsDb = new DBsms(this);
SQLiteDatabase dbw = smsDb.getWritableDatabase();
dbw.execSQL(deleteScreenedMessage);
dbw.close();

有什么解决方案吗?

4

2 回答 2

1

这是我的建议:

List<Integer> positionsList = new ArrayList<>();//declare this as a member variable--outside of any method
listViewMessages.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listViewMessages.setMultiChoiceModeListener(new MultiChoiceModeListener() {

@Override
public void onItemCheckedStateChanged(ActionMode mode, int position,
                                  long id, boolean checked) {
   mode.setTitle(listViewMessages.getCheckedItemCount()+ " Selected");
   if(checked)
       positionsList.add(position)
   else
       positionsList.remove(position)
}

@Override
public boolean onActionItemClicked(final ActionMode mode, MenuItem item) {
    switch (item.getItemId()) {
        case R.id.menu:
            deleteScreenedMessageFromInbox();                                       
              mode.finish();
            return true;
        default:
            return false;
    }
}

@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
    // Inflate the menu for the CAB
    MenuInflater inflater = mode.getMenuInflater();
    inflater.inflate(R.menu.contextual, menu);
    return true;
}


@Override
public void onDestroyActionMode(ActionMode mode) {

}

@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
    return false;
}
});

然后在您的deleteScreenedMessageFromInbox()访问中positionsList像这样:

public void deleteScreenedMessageFromInbox() {

    DBsms smsDb = new DBsms(this);
    SQLiteDatabase dbw = smsDb.getWritableDatabase();

    for(int position : positionsList) {
        Integer id = smsIDs.get(position);

        String deleteScreenedMessage = "delete from " + "sms" + " where " + "id" + " = " + id;
        dbw.execSQL(deleteScreenedMessage);
    }
    dbw.close();
}
于 2016-06-08T08:50:50.603 回答
0

实现 onitemclickListener 并获取项目 id 并将其保存在任何变量中,并在用户单击删除时删除项目,然后调用 adapter.notifyDataSetChanged();

例如

listViewMessages.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapter, View v, int position,
                            long arg3) {
        //you can pass position from here to your method like this
         deleteScreenedMessageFromInbox(position)


        String value = (String) adapter.getItemAtPosition(position);
        adapter.remove(value);
        adapter.notifyDataSetChanged();               
    }
});
于 2016-06-08T08:35:01.247 回答