如何通过方向更改来维护过滤后的 CursorAdapter 的状态?

How to maintain state of filtered CursorAdapter through orientation changes?

我有一个应用程序可以帮助用户整理处方。我有一个显示药物的列表视图,我使用 EditText 允许用户过滤列表。我遇到的问题是每次方向改变时 CursorLoader 都会被替换。

据我了解,LoaderManager.initLoader()函数应该在onActivityCreated()中调用。在我的特殊情况下,我没有片段,所以我将 initLoader() 调用放在 onPostCreate():

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    getSupportLoaderManager().initLoader(MEDICATION_LOADER, null, this);
}

这是我正在使用的过滤器:

// Set text filter
mMedication.addTextChangedListener(new TextWatcher() {
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        mMedicationAdapter.getFilter().filter(s);
    }
});

我删除了空的 beforeTextChanged 和 afterTextChanged 方法来缩短它。

所以,似乎正在发生的事情(通过使用调试器)是每次我更改设备方向时,都会再次调用 initLoader() 并显示整个药物列表,而不仅仅是过滤的药物.有没有办法实现 onSaveInstanceState() 来存储适配器的当前过滤状态?

还是我使用的文本过滤器有误?我应该将 charSequence 作为 Bundle 参数传递给加载器,还是创建另一个加载器将文本作为参数处理?

如果您的 edittext 是通过布局文件扩充的并且它有一个 id;该框架应该会自动保存其文本。

您可以尝试在附加 textwatcher 之前检查,如果 edittext 中有任何文本,然后过滤您的列表,然后附加您的 textwatcher。

一个解决方案是当方向改变时你可以保持当前 activity,只需设置 Activity 来处理 AndroidManifest.xml 中的配置变化: Android config changes

例如

 <activity
        android:name="com.test.MyActivity"
        android:configChanges="screenSize|orientation"/>