java - 如何在android中设备方向改变后保持listview项目的高亮

标签 java android eclipse listview android-listview

我有一个用数据填充的 ListView 。用户可以长按某一行,它会高亮显示,上下文操作栏也会显示它已被选中。如果用户选择更多行,则上下文操作栏中选择的行数会增加。但是,一旦我改变设备的方向,突出显示就会消失,但列表项显示为已选中。我试过使用选择器,但没有用。在 XML 中,我使每一行都将 activatedBackgroundIndicator 作为其背景。

有谁知道为什么高光会消失?谢谢。

这是 onSaveInstanceState 代码:

@Override
public void onSaveInstanceState(Bundle outState) {
    //check if any items are selected
    if (listView.getCheckedItemCount() > 0) {
        //get the list of selected items and convert it to an int Array
        //because SparseBooleanArray cannot be stored in a bundle
        SparseBooleanArray selectedItems = listView.getCheckedItemPositions();
        int[] selectedItems_intArray = new int[listView.getCheckedItemCount()];
        for (int i = 0; i < selectedItems.size(); i++) {
            if (selectedItems.valueAt(i) == false)
                continue;
            selectedItems_intArray[i] = selectedItems.keyAt(i);
        }
        outState.putIntArray("Selected Items", selectedItems_intArray);
    }
}

这是 onCreate 中的代码:

       if (savedInstanceState != null) {
            int[] checkedItems = savedInstanceState.getIntArray("Selected Items");
            if (checkedItems != null) {

                for (int i = 0; i < checkedItems.length; i++) {
                   listView.setItemChecked(checkedItems[i], true);
                    adapter.setNewSelection(checkedItems[i], true);

                }
            }
        }

编辑:

这是 ListView Activity 的部分:

    <activity
        android:name="com.newapp.MainListActivity"
        android:label="@string/app_name"
        android:configChanges="orientation"
        >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

最佳答案

当您旋转设备时,当前 Activity 将被销毁并重新创建。

您可以将所选元素存储在 onPause() 中,然后在 onResume() 中选择它,或者您可以使用更简单的解决方案:不允许 Android 在设备旋转时破坏您的 Activity。

为此,您可以将 AndroidManifest 添加到该 Activity 的部分:

<activity android:configChanges="orientation|screenSize"
...
</activity>


注意:如果需要,您也可以对整个应用程序执行相同的操作(将相同的 android:configChanges="orientation|screenSize" 添加到 application 部分)。


编辑:

我的第一个答案是使用 android:configChanges="orientation"。我的第二个是使用 android:configChanges="orientation|screenSize"

对于那些想知道为什么的人来说,事情很简单:

  1. 方向 添加到 list 中,就是在告诉 Android“不用担心方向变化,我可以处理”。因此,当设备的方向发生变化时,Android 无需担心销毁和重新创建 Activity。

  2. screenSize 添加到 list 中,就是在告诉 Android“不要担心屏幕尺寸的变化,我可以处理”。在我们的案例中这不是必需的,但它可以。原因是某些版本的 Android(我真的不记得是哪些)对此有点愚蠢。当你有一个垂直位置的设备时,它有 480x800 像素;当你把它放在水平位置时,它有 800x480 像素。因此,屏幕尺寸确实发生了变化。某些版本的 Android 足够聪明,可以识别这种“屏幕尺寸变化”,因此他们将其视为 android:configChanges="orientation" 设置的一部分;某些 Android 版本不是那么聪明,您必须同时指定两者。


注意:当您使用这种技术时,请注意 Android 不会处理设备旋转。因此,如果纵向模式和横向模式的布局不同,则必须自己更改(但我建议不要使用这种方法,即使只有一种布局类型的应用程序更容易)。

关于java - 如何在android中设备方向改变后保持listview项目的高亮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25026545/

相关文章:

java - eclipse GWT "There are no CSS files referenced"

java - 有eclipse需要安装Java SDK吗

java - 为什么我的 android volley 的 http post 请求会抛出错误(localhost)?

java - 无法 Autowiring 字段 ParameterNameDiscoverer

java - Eclipse RCP : InternalPlatform. getDefault().getUserLocation() 不返回 C:\Users\用户名\AppData\Roaming

java - 错误 : createWindowSurface failed EGL_BAD_ALLOC

android - com.admob.android.ads.AdView 未绑定(bind)前缀?

java - Eclipse Web 项目名称

android - 在 Docker 中的 Android 模拟器上运行 AndroidTest

Android - PhoneGap 应用程序( keystore 文件错误)