【发布时间】:2023-03-19 22:05:02
【问题描述】:
我正在片段中创建一个列表视图并旋转设备。除了奥利奥外,它都很好用。
在运行时它不会抱怨,我会看到我的列表。然后我旋转,我再也看不到列表了。在 Oreo 之前,以下代码按原样工作:旋转设备后,我仍然可以正确看到我的列表。
为了让这个小例子有效,我必须在 onResume 中添加重新创建列表(代码注释掉,以便您可以使用低于 O 的版本进行测试)。
似乎我在旋转时错过了刷新视图的调用。我的 ListView 出现了一个空白屏幕。
我找不到一些解释如何在设备旋转时处理列表视图的 oreo 文档?或教程/示例?我使用列表/适配器机制。
奥利奥有什么变化?
片段代码:
public class ListFragment extends Fragment {
private ListView listView;
private List<ListItems> listItems;
private ListAdapter listAdapter;
public ListFragment() {
// Required empty public constructor
}
@Override
public void onResume() {
Log.i("ROT","onResume");
/*
String[] name = {"linux","win","android" };
listItems = new ArrayList<>();
listAdapter = new ListAdapter(getActivity().getApplicationContext(), listItems);
listView = getActivity().findViewById(R.id.listview);
for(int i=0;i<name.length;i++){
ListItems items = new ListItems();
items.setOsName(name[i]);
listItems.add(items);
listView.setAdapter(listAdapter);
}
*/
super.onResume();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.i("ROT","onCreateView");
super.onCreateView(inflater, container, savedInstanceState);
return inflater.inflate(R.layout.layout_fragment, null);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
// public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.i("ROT","onActivityCreated");
String[] name = {"linux","win","android" };
listItems = new ArrayList<>();
listAdapter = new ListAdapter(getActivity().getApplicationContext(), listItems);
listView = getActivity().findViewById(R.id.listview);
for(int i=0;i<name.length;i++){
ListItems items = new ListItems();
items.setOsName(name[i]);
listItems.add(items);
listView.setAdapter(listAdapter);
}
}
}
这是我的主要内容:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ListFragment listFragment = new ListFragment();
ft.replace(R.id.content_frame, listFragment);
ft.addToBackStack(null);
ft.commit();
}
}
项目创建:
public class ListItems {
private String osName;
String getOsName(){
return osName;
}
void setOsName(String s){
osName = s;
}
}
适配器:
public class ListAdapter extends BaseAdapter {
private static List<ListItems> listItems;
private LayoutInflater layoutInflater;
ListAdapter(Context context, List<ListItems> objects) {
listItems = objects;
layoutInflater = LayoutInflater.from(context);
}
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
}
@Override
public int getCount() {
return listItems.size();
}
@Override
public Object getItem(int position) {
return listItems.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
private class ViewIPHolder {
TextView os;
}
@SuppressLint("InflateParams")
public View getView(int position, View convertView, ViewGroup parent) {
ViewIPHolder viewHolder;
if(convertView == null) {
viewHolder = new ViewIPHolder();
convertView = layoutInflater.inflate(R.layout.layout_list, null);
viewHolder.os = convertView.findViewById(R.id.osname);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewIPHolder) convertView.getTag();
}
viewHolder.os.setText(listItems.get(position).getOsName());
return convertView;
}
}
最后是 xml 布局。
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</LinearLayout>
layout_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/listview"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="32dp"
android:layout_marginEnd="32dp"
android:layout_marginStart="32dp"
android:layout_marginTop="32dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
layout_list.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/osname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:text="TextView"
android:textColor="@color/colorPrimary"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
【问题讨论】:
-
logcat 中是否有一些警告/错误?
-
@rushi 我重温了...有一些。我将编辑 Q
-
另外,如果listViewState为null或为空,是否可以记录,一般情况下,您可以按照developer.android.com/studio/debug/#startdebug进行逐步调试,然后准确提供oreo和其他行为不同的地方.
-
listViewstate 有一个值。如果没有,它会在 listTest.onRestoreInstanceState(listViewState); 上崩溃;并且相同的代码在其他 android 版本上运行良好。对于奥利奥,它的顺序与前 M 相同。
-
你能一步步调试并找出差异吗?
标签: android listview android-8.0-oreo screen-rotation