ListActivity — onListItemClick

По какой-то причине мой onListItemClick(View listView, View view, int position, long id){} не срабатывает при определенных условиях. Мое приложение работает так. ListActivity запускает другое действие, и иногда пользователи или другие условия могут привести к завершению этого действия с результатом. При первом запуске ListActivity, что означает вызов метода onCreate, всегда работает onListemClick(). То же самое происходит в первый раз, когда пользователи возвращаются к той же активности, тогда onListItemClick всегда работает. Проблема возникает во второй раз, когда пользователи возвращаются к ListActivity, тогда onListItemClick вообще не срабатывает, как будто прослушиватель вообще не подключен к представлениям.

Я дважды проверил, установлен ли listAdapter. Это стандартный ArrayAdapter. Все остальные слушатели работают, поэтому мои подозрения вращаются вокруг того, что ListActivity по какой-то причине не используется в качестве слушателя, но я не могу понять, почему. Это один и тот же код с одинаковыми значениями, работающими оба раза, но кажется, что прослушиватель по какой-то причине обнулен. Код выполняется из метода onResume в строке после вызова setContentView(int id). Кто-нибудь знает, почему это происходит?

Следующий код инициирует верстку, там проблем нет, все работает как задумано.

private void initLayout(){

    projectsToList(user.getProjects());

    ttvEmailField = (TextView) findViewById(R.id.ttv_email);
    ttvNameField = (TextView) findViewById(R.id.ttv_username);

    String email = user.getEMail();
    String name = user.getName();

    if(email != null && email.length() > 0){
        ttvEmailField.setText(user.getEMail());
    }

    if(name != null && email.length() > 0){
        ttvNameField.setText(user.getName());
    }

    btnLogout = (Button) findViewById(R.id.btn_logout);

    btnLogout.setOnClickListener(this);

}

Приведенный ниже код устанавливает ArrayAdapter, onListItem работает только после onCreate и при первом переходе пользователя к текущей активности.

private void projectsToList(List<ProjectPojo> projects){
    int max = projects.size();
    String[] arrProjects = new String[max];

    for(int i = 0; i < max; ++i){
        arrProjects[i] = projects.get(i).getName();
    }
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item_simpletext, R.id.ttv_listtextview, arrProjects);

    setListAdapter(adapter);
}

person Geir    schedule 04.10.2013    source источник


Ответы (3)


Выполняйте инициализацию в oncreate, а также устанавливайте адаптер в методе oncreate(). Возможно, вы не устанавливаете прослушиватель в методе OnResume(). Или вы устанавливаете прослушиватель равным нулю в методе возобновления.

person Macrosoft-Dev    schedule 04.10.2013
comment
Метод oncreate вызывает только super.onCreate, фактическая инициализация класса происходит в onResume, поскольку этот метод вызывается, даже если действие возобновляется, а не создается. Поскольку слушатель - это "это", я думаю, что на самом деле он не может быть нулевым, и он действительно работает один раз после того, как пользователь вернулся из другого действия. Я дважды проверил, что никакие значения не равны нулю. - person Geir; 04.10.2013

Переинициализирован ваш список или прослушиватель в методе Onresume()! Ваше решение заключается только в методе onResume().

person Ajay    schedule 04.10.2013
comment
Да, я тоже так думаю. Оба метода в вопросе вызываются из метода onResume. Метод onResume всегда вызывается после метода onCreateMethod, а это означает, что эти методы вызываются всегда, независимо от того, создается действие или возобновляется. Удобство arrayAdapter должно заключаться в том, что он устанавливает слушателя для вас, и что слушатель на самом деле «это», или я ошибаюсь? - person Geir; 04.10.2013

Я так и не узнал, что происходит в этом. Решение, которое я придумал, заключалось в том, чтобы не использовать наследование и вместо этого реализовать OnItemClickListener вручную. Теперь работает каждый раз.

person Geir    schedule 10.10.2013