gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:22:48 26 4
gpt4 key购买 nike

我有一个用数据填充的 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/

26 4 0