2011-01-23 2 views
1

Я хочу показать пустой список, который затем заполняется пользовательским вводом. У меня работает поток пользовательского интерфейса, и я заполняю список своих пользовательских объектов после того, как пользователь вводит некоторую информацию через представление, которое вызывается через setContentView (т. Е. Нет нового действия).Update ListView из пользовательского ввода после вызова setContentView

Я беру ввод и добавляю его в список, который я хочу обобщить в ListView. Однако всякий раз, когда я добавляю в список и/или ArrayAdapter и вызываю адаптер.notifyDataSetChanged(), он не делает то, что я хочу. ListView по-прежнему пуст. Argh! Это сводит меня с ума!

@Override 
public void onCreate(Bundle blah) { 
    ListView listView = (ListView) findViewById(R.id.results_list); 
    listView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, list)); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case R.id.mnu_add: 
     final Activity act = this; 
     setContentView(R.layout.record_details);// the sub-view that takes the user input 
     // the button on the form to 'add' details:- 
     ((Button) findViewById(R.id.recored_details_add_btn)) 
     .setOnClickListener(
      new OnClickListener() { 
      public void onClick(View v) { 
        // get input from widgets 
        list.add(someObject); 
        ((ArrayAdapter<Object>) listView.getAdapter()).notifyDataSetChanged(); 
        setContentView(R.layout.list_view); 

       } 
      } 
     ); 
     ((ArrayAdapter<Object>) listView.getAdapter()).notifyDataSetChanged(); 
     break; 
    } 
    return true; 
} 

Пожалуйста, спасите меня от моих страданий и сообщите мне о моей глупости?

Заранее спасибо.

ответ

2
public void onClick(View v) { 
    // get input from widgets 
    list.add(someObject); 
    ((ArrayAdapter<Object>) listView.getAdapter()).notifyDataSetChanged(); 
    setContentView(R.layout.list_view); 

Возможно ли, что это setContentView в onClick обработчик создает новый экземпляр представления списка виджетов (без адаптера) или переинициализация вид списка (очистное адаптер)?

Попробуйте положить что-то в список изначально в onCreate, а затем посмотреть, исчезнет ли он, когда вы нажмете кнопку.

Я не видел никакого кода (хотя я относительный новичок), который переключает представления в течение жизни активности, чтобы воспитывать, по существу, разворачивать разные страницы - большинство из них использует отдельное действие.

Edit:

OP спрашивает:

Спасибо ... Так как я могу получить то, что я хочу? Список, в котором я поддерживаю адаптер, является статическим; должен ли я просто использовать действия вместо этого и полагаться на onCreate loading из статического поля?

Некоторые опции:

  1. Используйте отдельные виды деятельности

  2. Re свяжите адаптер (звонок setAdapter снова) - вероятно, плохая идея

  3. Объявить как макеты в то же самое файл. Вы скроете один и отобразите другой, чтобы переключиться между видами, а может вызвать setContentView. Это похоже на то, как работает макет ListView (один, когда список пуст, а другой - когда он отсутствует). Я думаю, что я видел пример этого где-то в сети, но сейчас у меня нет ссылки.

+1

Я добавил экземпляр того же пользовательского класса в onCreate, который виден на первом представлении (ну, результат toString виден), но исчезает, когда я нажимаю кнопку добавления на подзадаче! –

+0

@atc - Я думаю, что это подтверждает теорию. Вы создаете/повторно инициализируете представление списка, когда вы вызываете 'setContentView()'. Независимо от этого, адаптер больше не связан. Могут быть другие побочные эффекты для вызова 'setContentView' несколько раз. –

+0

Спасибо ... Так как я могу получить то, что хочу? Список, в котором я поддерживаю адаптер, является статическим; должен ли я просто использовать действия вместо этого и полагаться на onCreate loading из статического поля? –

1

Вы можете возобновить ту же деятельность, используя Intent.FLAG_ACTIVITY_SINGLE_TOP флаг при создании намерения и переопределить метод onNewIntent().

Внутри onNewIntent() вы создаете адаптер с обновленными данными и звоните setAdapter.

Я думаю, что это даст вам предполагаемое поведение.