ListView скрывается после поворота экрана

Я запутался в том, как организовать сохранение-восстановление состояния активности процесса для ListView. Я сделал это для одного TextView, который работал без проблем. Я не могу найти пример, чтобы понять, как ведет себя ListView.

Я попытался сохранить ArrayList, сохранить состояние адаптера, а затем восстановить, но ничего не получилось. Остальное работает корректно.

открытый класс MainActivity расширяет 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 ведет себя в процессе сохранения-восстановления, или пример, который это показывает.


person Mykhailo Vasylenko    schedule 10.01.2019    source источник


Ответы (1)


Ваш экземпляр arrayList изменился, когда вы вызвали saveInstanceState.getStringArrayList("received_goods")', теперь он отличается от экземпляра списка массивов, который в адаптере. Вы должны сделать так:

if (savedInstanceState != null){
    ArrayList<String> tmp= savedInstanceState.getStringArrayList("received_goods");
    arrayList.addAll(tmp);
    adapter.notifyDataSetChanged();
} 
person Alex    schedule 10.01.2019
comment
Это работает спасибо. Но я не совсем понял, почему мы используем tmp ArrayList. - person Mykhailo Vasylenko; 10.01.2019
comment
Когда вы вызвали arrayList = saveInstanceState.getStringArrayList(received_goods); вы изменили экземпляр arrayList на другой экземпляр, но arraylist, который внутри адаптера, является исходным объектом и не был изменен. - person Alex; 10.01.2019