Проблема обновления Android ListView - PullRequest
0 голосов
/ 24 октября 2010

У меня возникает странная проблема при обновлении моего ListView, оно работает нормально до тех пор, пока устройство не будет повернуто, а затем при повторном обновлении полностью гаснет.Это можно исправить только путем повторного вращения устройства (так как оно также обновляется в onCreate()), но затем, когда оно обновляется снова, оно гаснет.Проблема сохраняется до перезапуска приложения.

РЕДАКТИРОВАТЬ:

Некоторый код:

private ListView contactlist = null;
private static MatrixCursor matrixcursor = null;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    contactlist = (ListView) findViewById(R.id.contactlist);
    if (savedInstanceState == null) {
        matrixcursor = new MatrixCursor(new String[] {"_id","name","one","two","three","four"});
    } else {
        contactlist.setAdapter(new listCursorAdapter(this,matrixcursor));
    }
}

это работает нормально, но всякий раз, когда:

contactlist.setAdapter(new listCursorAdapter(this,matrixcursor));

вызывается после onCreate() и после поворота устройства ListView гаснет.

Ответы [ 2 ]

1 голос
/ 26 октября 2010

Ну, мне удалось это исправить, сделав contactlist статическим:

 private static ListView contactlist = null;

Я понятия не имею, почему это сработало (просто сделал пробу / ошибку в течение пары часов), так что если кто-нибудь сможет объяснить это, было бы здорово.

1 голос
/ 25 октября 2010

Я думаю, что ваш MatrixCursor фактически нулевой. Когда вы поворачиваете телефон, как вы знаете, деятельность разрушается. Таким образом, комплект saveinstanceState может быть не нулевым, но MatixCursor не будет повторно инициализирован. Да, он статический, но у меня есть ощущение, что по какой-то причине он не загружен в тот же загрузчик классов ... хорошо, что статика не будет слишком надежной.

Существует метод, который наиболее неловко назван:

onRetainNonConfigurationInstance ()

Что, я думаю, поможет вам решить это дело. Поэтому, если вы вернете туда свой экземпляр MatrixCursor, вы можете в последующем вызове onCreate () использовать getLastNonConfigurationInstance () для считывания данных обратно. Он не гарантированно будет вызван, поэтому вам все равно придется обрабатывать случай, когда у вас нет сохраненного состояния. Надеюсь, это поможет.

private ListView contactlist = null;
private MatrixCursor matrixcursor = null;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    contactlist = (ListView) findViewById(R.id.contactlist);
    matrixcursor = (MatrixCursor)getLastNonConfigurationInstance();
    if (matrixcursor == null) {
        matrixcursor = new MatrixCursor(new String[] {"_id","name","one","two","three","four"});
    } else {
        contactlist.setAdapter(new listCursorAdapter(this,matrixcursor));
    }
}

public MatrixCursor onRetainNonConfigurationInstance() {
return matrixcuror;
}

public MatrixCuror getLastNonConfigurationInstance() {
return (MatrixCursor) super.getLastNonConfigurationInstance();
}
...