【问题标题】:ListView- setChoiceMode with CHOICE_MODE_MULTIPLE_MODAL for different orientationsListView- setChoiceMode 和 CHOICE_MODE_MULTIPLE_MODAL 用于不同的方向
【发布时间】:2017-12-16 11:30:01
【问题描述】:

我在我的应用程序中使用列表视图,其中使用 ListView.CHOICE_MODE_MULTIPLE_MODAL 实现了 setChoiceMode。长按列表视图时,可以选择项目,但之后,如果屏幕方向改变,操作栏会很烦人。

我的代码是这样的

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    adapter = new ItemListAdapter();
    listView.setAdapter(adapter);
    listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);

    listView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
        @Override

        public void onItemCheckedStateChanged(ActionMode actionMode, int position, long l, boolean b) {
            final int checkedItemCount = listView.getCheckedItemCount();
            actionMode.setTitle(checkedItemCount + " Selected");
            /*get the selected items*/
        }

        @Override
        public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
            actionMode.getMenuInflater().inflate(R.menu.menu_listview_delete, menu);
            return true;
        }

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

        @Override
        public boolean onActionItemClicked(final ActionMode actionMode, MenuItem menuItem) {
            switch (menuItem.getItemId()){
                case R.id.delete_item:
                    /*delete selected items*/
                    return true;
                default:
                    return false;
            }
        }

        @Override
        public void onDestroyActionMode(ActionMode actionMode) {
            adapter.removeSelection();
        }
    });
}

portrait mode & landscape mode 中的图片,显示选择项为 0 & 当尝试删除相应的选定项目时不会被删除。然后如果按下后退按钮(在我的应用程序活动中实现的横向模式下),操作栏颜色将变为白色。

(以其他方式尝试在横向模式下选择项目并旋转以删除纵向模式时也会发生同样的情况)

一个解决方案是在清单中使用下面的

android:configChanges="orientation|screenSize"

如果使用此方法,则不会在方向更改时重新创建活动。由于纵向和横向的布局不同,因此必须在方向更改时重新创建活动。

我知道问题是因为在方向更改时重新创建了活动,这使得 setMultiChoiceModeListener 每次都被调用。

有人可以帮助解决这个问题吗?谢谢!

【问题讨论】:

    标签: android listview listener orientation custom-adapter


    【解决方案1】:

    使用这些方法来存储和恢复所选项目的值。

    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putInt("count",checkedItemCount);
        super.onSaveInstanceState(outState);
    }
    

    然后在onCreate方法中恢复

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState != null) {
            //will return value of selecteditems
            int countedItems = savedInstanceState.getInt("count");
    
        }
    }
    

    这里是更多信息的链接:
    How to use onSavedInstanceState example please

    【讨论】:

    • 我之前也试过了,问题是计数值会恢复,但所选项目不会被删除。还有其他建议吗?
    • 有人可以帮忙吗?
    • 它在 onActionItemClicked 方法中并且工作正常。正如我之前提到的,如果我们正在处理一种模式横向或纵向,它工作正常。如果我尝试以纵向选择项目,然后尝试通过将屏幕旋转到横向来删除这些项目,反之亦然是不可能的。有什么方法可以处理 setMultiChoice 模式的屏幕方向?
    • 得到了解决方案。我在纵向和横向模式下使用了不同的布局,以便在布局上具有正确的项目对齐方式。那不允许我使用 configChanges。现在,我处理了这些布局文件并使用 android:configChanges="orientation|screenSize" 来确保在方向更改时不会重新创建活动并且像魅力一样工作。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多