问题描述
在我们的 android 应用程序中,高级设置显示在正常设置下的自己的列表视图中。默认情况下,仅当事先输入密码时才会填充列表视图。 这一直很好,直到我们在 Android 11 上测试了该应用程序。现在,如果输入密码,列表视图将保持为空。调试显示连接到列表视图的 ArrayAdapter 确实填充了正确的数据。在 Android 10 或更低版本的设备上测试工作正常。
任何进一步调试或查阅 android 迁移指南的尝试都没有结果。有人拍过吗?
XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<View
style="@style/Divider"
android:background="@color/BlueDark" />
<ListView
android:id="@+id/settings_list_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="0dp"
android:divider="@color/Blue"
android:dividerHeight="1dp"></ListView>
<View
style="@style/Divider"
android:background="@color/Blue" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="4dp"
android:layout_marginTop="0dp"
android:orientation="vertical">
<ListView
android:id="@+id/advanced_settings_list_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@color/Green"
android:dividerHeight="1dp">
</ListView>
</LinearLayout>
<View
style="@style/Divider"
android:background="@color/BlueDark" />
</LinearLayout>
ArrayAdapter:
public class Settingslistadapter extends ArrayAdapter<SettingsItemDataModel> {
// View lookup cache
private static class ViewHolder {
TextView txtSettingLabel;
TextView txtSetting;
}
Context mContext;
public Settingslistadapter(ArrayList<SettingsItemDataModel> data,Context context) {
super(context,R.layout.row_item,data);
this.mContext = context;
}
@Override
public View getView(int position,View convertView,ViewGroup parent) {
// Get the data item for this position
SettingsItemDataModel dataModel = getItem(position);
// Check if an existing view is being reused,otherwise inflate the view
ViewHolder viewHolder; // view lookup cache stored in tag
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.row_item,parent,false);
viewHolder.txtSettingLabel = convertView.findViewById(R.id.setting_list_child_label);
viewHolder.txtSetting = convertView.findViewById(R.id.setting_list_child_setting);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.txtSettingLabel.setText(dataModel.getSettingPair()[0]);
viewHolder.txtSetting.setText(dataModel.getSettingPair()[1]);
// Return the completed view to render on screen
return convertView;
}
}
Activity(仅相关部分。当用户正确输入密码时,updateAdvancedSettings() 被调用):
private ArrayList<SettingsItemDataModel> settings;
private ListView advancedSettingsListView;
private Settingslistadapter advancedSettingslistadapter;
private ArrayList<SettingsItemDataModel> advancedSettings = new ArrayList<>();
private void setupListViews(View tabView) {
settings = new ArrayList<>();
for (SettingsItemDataModel.Identifier key : SettingsService.getInstance().getSettings().keySet()) {
SettingsItemDataModel chldData = new SettingsItemDataModel(key,SettingsService.getInstance().getSettings().get(key));
settings.add(chldData);
}
ListView settingsListView = tabView.findViewById(R.id.settings_list_view);
Settingslistadapter settingslistadapter = new Settingslistadapter(settings,context);
settingsListView.setAdapter(settingslistadapter);
settingsListView.setonItemClickListener((parent,view,position,id) -> {
if (!isNavigationLocked()) {
Object object = parent.getItemAtPosition(position);
SettingsItemDataModel dataModel = (SettingsItemDataModel) object;
if (SettingsItemDataModel.Identifier.ADV_SETTINGS.equals(dataModel.getSettingsIdentifier())) {
showAdvancedSettingsDialog();
} else if (SettingsItemDataModel.Identifier.LANGUAGE.equals(dataModel.getSettingsIdentifier())) {
Intent intent = new Intent(Settings.ACTION_LOCALE_SETTINGS);
startActivity(intent);
} else if (FASTMODE.equals(dataModel.getSettingsIdentifier())) {
showInputSettingsRadioDialog(dataModel);
}
}
});
advancedSettingsListView = tabView.findViewById(R.id.advanced_settings_list_view);
advancedSettingslistadapter = new Settingslistadapter(advancedSettings,context);
advancedSettingsListView.setAdapter(advancedSettingslistadapter);
advancedSettingsListView.setonItemClickListener((parent,id) -> {
if (!isNavigationLocked()) {
Object object = parent.getItemAtPosition(position);
SettingsItemDataModel dataModel = (SettingsItemDataModel) object;
if (DEL_ALL_MAILS.equals(dataModel.getSettingsIdentifier())) {
showSimpleSettingsDialog(dataModel);
} else if (IMG_FILE_TYPE.equals(dataModel.getSettingsIdentifier())) {
showInputSettingsRadioDialog(dataModel);
} else if (IMG_COMP_LEV.equals(dataModel.getSettingsIdentifier())) {
showInputSettingsSeekBarDialog(dataModel);
} else if (SWIPE.equals(dataModel.getSettingsIdentifier())) {
showInputSettingsRadioDialog(dataModel);
} else if (ZIP_COMP_TYPE.equals(dataModel.getSettingsIdentifier())) {
showInputSettingsRadioDialog(dataModel);
} else if (ZIP_COMP_LEV.equals(dataModel.getSettingsIdentifier())) {
showInputSettingsspinnerDialog(dataModel);
} else {
showInputSettingsDialog(dataModel);
}
}
});
settingsListView.invalidate();
advancedSettingsListView.invalidate();
}
public void updateAdvancedSettings() {
advancedSettings.clear();
LinkedHashMap<SettingsItemDataModel.Identifier,String[]> advSettingData = null;
advSettingData = SettingsService.getInstance().getAdvancedSettings();
for (SettingsItemDataModel.Identifier key : advSettingData.keySet()) {
SettingsItemDataModel chldData = new SettingsItemDataModel(key,advSettingData.get(key));
advancedSettings.add(chldData);
}
try {
SettingsService.getInstance().saveExtAdvancedSetting();
} catch (IOException e) {
e.printstacktrace();
}
}
解决方法
答案很简单。我得打电话
advancedSettingsListAdapter.notifyDataSetChanged();
在我填充适配器后手动执行。无论出于何种原因,这似乎是从以前版本的操作系统自动完成的。