屏幕旋转后 ListView 隐藏
ListView hides after screen rotation
我对如何组织 ListView 的保存-恢复过程 Activity 状态感到困惑。我为一个没有任何问题的 TextView 做了这件事。我找不到示例来理解 ListView 的行为方式。
我尝试保存 ArrayList、保存适配器状态然后恢复,但没有任何效果。其他一切正常。
public class MainActivity extends AppCompatActivity {
private static final int GOODS_REQUEST = 1;
private ListView listView;
private ArrayAdapter<String> adapter;
private ArrayList<String> arrayList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//creating Array list which will be populate returned Goods
arrayList = new ArrayList<String>();
//creating "Adapter" which behaves as a middleman between the data source and the layout
// retrieves the data and converts each entry into a view that can be added into the layout
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arrayList);
listView = findViewById(R.id.list_view_goods);
//Sets the adapter that provides the data and the views to represent the data in this widget.
listView.setAdapter(adapter);
//Restoring Activity instance state
if (savedInstanceState != null){
arrayList = savedInstanceState.getStringArrayList("received_goods");
adapter.notifyDataSetChanged();
}
}
//event handler
public void addGoods(View view) {
Intent openGoodsList = new Intent(this, GoodsList.class);
startActivityForResult(openGoodsList, GOODS_REQUEST);
}
//receiving Goods
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == GOODS_REQUEST && resultCode == RESULT_OK && null != data) {
String goods = data.getStringExtra(GoodsList.EXTRA_GOODS);
arrayList.add(goods);
//Notifies the attached observers that the underlying data has been changed and any View reflecting the data set should refresh itself.
// Use the method every time the list is updated.
adapter.notifyDataSetChanged();
}
}
//saving Activity instance state
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putStringArrayList("received_goods", arrayList);
}
需要解释 ListView 在保存-恢复过程中的行为方式或显示它的示例。
当你调用'savedInstanceState.getStringArrayList("received_goods")'时你的arrayList实例改变了,它现在不同于适配器中的数组列表实例,你应该这样做:
if (savedInstanceState != null){
ArrayList<String> tmp= savedInstanceState.getStringArrayList("received_goods");
arrayList.addAll(tmp);
adapter.notifyDataSetChanged();
}
我对如何组织 ListView 的保存-恢复过程 Activity 状态感到困惑。我为一个没有任何问题的 TextView 做了这件事。我找不到示例来理解 ListView 的行为方式。
我尝试保存 ArrayList、保存适配器状态然后恢复,但没有任何效果。其他一切正常。
public class MainActivity extends AppCompatActivity {
private static final int GOODS_REQUEST = 1;
private ListView listView;
private ArrayAdapter<String> adapter;
private ArrayList<String> arrayList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//creating Array list which will be populate returned Goods
arrayList = new ArrayList<String>();
//creating "Adapter" which behaves as a middleman between the data source and the layout
// retrieves the data and converts each entry into a view that can be added into the layout
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arrayList);
listView = findViewById(R.id.list_view_goods);
//Sets the adapter that provides the data and the views to represent the data in this widget.
listView.setAdapter(adapter);
//Restoring Activity instance state
if (savedInstanceState != null){
arrayList = savedInstanceState.getStringArrayList("received_goods");
adapter.notifyDataSetChanged();
}
}
//event handler
public void addGoods(View view) {
Intent openGoodsList = new Intent(this, GoodsList.class);
startActivityForResult(openGoodsList, GOODS_REQUEST);
}
//receiving Goods
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == GOODS_REQUEST && resultCode == RESULT_OK && null != data) {
String goods = data.getStringExtra(GoodsList.EXTRA_GOODS);
arrayList.add(goods);
//Notifies the attached observers that the underlying data has been changed and any View reflecting the data set should refresh itself.
// Use the method every time the list is updated.
adapter.notifyDataSetChanged();
}
}
//saving Activity instance state
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putStringArrayList("received_goods", arrayList);
}
需要解释 ListView 在保存-恢复过程中的行为方式或显示它的示例。
当你调用'savedInstanceState.getStringArrayList("received_goods")'时你的arrayList实例改变了,它现在不同于适配器中的数组列表实例,你应该这样做:
if (savedInstanceState != null){
ArrayList<String> tmp= savedInstanceState.getStringArrayList("received_goods");
arrayList.addAll(tmp);
adapter.notifyDataSetChanged();
}