Android внутренняя передача данных из ListView в асинхронный режим - PullRequest
0 голосов
/ 16 июня 2011

Я пытаюсь узнать, как выбор элементов списка может быть передан в рамках одного действия в приложении Android. Ниже у меня есть простой макет страницы, который создает ListView, который заполняется массивом статических строк. У меня есть три других статических массива строк, перечисленных ниже. Когда страница загружается впервые, она загружает первый массив в ListView. Много кода на этой странице я собрал вместе, читая статьи по Android здесь на stackoverflow, поэтому, если я делаю что-то глупое, я хочу услышать об этом. Моя цель в конечном итоге состоит в том, чтобы эти статические строковые массивы фактически заполнялись из раздутого XML-файла, который синхронизируется с приложением, но обо всем по порядку. Сначала я пытаюсь создать основы.

Итак, у меня есть прослушиватель, настроенный на щелчок элемента для ListView. С чем мне нужно помочь, так это как мне захватить элемент, на который они нажали, и затем воссоздать действие с загруженным в него новым строковым массивом? Я видел один пример, который я эмулировал, и это заставляло приложение выглядеть так, как будто оно действительно меняло страницы каждый раз. Учитывая, что на экране есть статические элементы (строка меню), я бы хотел, чтобы он обновлялся независимо от общего макета (я думаю, лучший способ описать его в веб-терминологии - асинхронно, как в AJAX или jQuery). ).

Порядок событий TEST_1 - это корень с одним выбором. Нажмите на выбор, и он загрузит TEST_2. Если выбран элемент 1 в TEST_2, загрузить TEST_3a и наоборот с 2, TEST_3b.

Надеюсь, это имеет смысл ... дайте мне знать, если я могу уточнить.

открытый класс MyLayout extends ListActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  setListAdapter(new ArrayAdapter<String>(this, R.layout.listlayout, TEST_1));

  ListView lv = getListView();
  lv.setTextFilterEnabled(true);

  lv.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view,
        int position, long id) {

        //What do I do here?
    }
  });
}

static final String[] TEST_1 = new String[] {
        "Members"
      };

static final String[] TEST_2 = new String[] {
    "Joe A. Member", "Paula B. User"
  };

static final String[] TEST_3a = new String[] {
    "Personal", "Medical", "Financial"
  };

    static final String[] TEST_3b = new String[] {
    "Personal", "Medical", "Financial"
  };

}

Ответы [ 2 ]

0 голосов
/ 16 июня 2011
lv.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        String selectedItem = (String) parent.getItemAtPosition(position);

        // then lookup whatever you need to based on that selectedItem (e.g., via HashMap lookup, etc)
        ArrayAdapter<String> adapter = (ArrayAdapter<String>) getListAdapter();
        adapter.clear();
        adapter.addAll(TEST_2); // or whatever the results were of your lookup above ^
        adapter.notifyDataSetInvalidated();
    }
});

См. AdapterView#getItemAtPosition(). Я бы посоветовал не жестко кодировать ваши списки, как показано в вашем примере (TEST_1, TEST_2 и т. Д.), А вместо этого определить структуру логического отображения того, что вы хотите, и позволить вашему пользовательскому интерфейсу отражать связность структуры данных. Как упомянуто в комментарии выше, хорошее место для начала было бы HashMap.

0 голосов
/ 16 июня 2011

Начать деятельность действительно легко и прямо. В контексте действия назовите это:

Intent myIntent = new Intent(this, OtherActivity.class); startActivity(myIntent);

Чтобы выполнить то, что вы ищете, нужно выполнить три действия, каждое из которых содержит массив статических строк. Если вы нажмете одну опцию, вы перейдете к следующей операции.

ПРИМЕЧАНИЕ : Не забудьте указать название действия в манифесте.

http://developer.android.com/guide/topics/fundamentals/activities.html

Редактировать 1: для адреса комментария

1) Ваш onItemClickListener хорош. Единственная проблема, с которой вы здесь столкнетесь, заключается в том, что вы должны предварительно проверять чеки, которые будут добавлены в список.

2 & 3) То, что вы хотите сделать здесь, - это создать новый адаптер для ListView и передать адаптеру новый массив строк. Как только это будет сделано, просто позвоните invalidate().

Редактировать 2: пример того, что вы можете сделать

class MyActivity extends ListActivity {
    String[] mContent;

    @Override public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        // Set content view and widgets set up
        mContent = inflateFromXml(R.xml.basexml);
        ListView lv = getListView();
        lv.setAdapter(MyAdapter(this, R.layout.listlayout, mContent);
        // Set up your onItemClickListener()
        // This is quick and dirty
        lv.setOnItemClickListener(new OnItemClickListener() {
            public boolean onItemClick(Adapter<?> a, View v, int pos, long something) {
                 // Now when the user clicks an option, you will want to inflateFromXml(id)
                 // the option they clicked. Then create a new adapter and assign the 
                 // adapter to the list view and do something like
                 ((MyAdapter)lv.getAdapter()).notifyDataSetChanged();
    }

    public String[] inflateFromXml(int id) {
        // Here is where you will inflate your xml list of options
    }

    private class MyAdapter extends ArrayAdapter<String> {
        // ...
    }
}

Это очень быстро и грязно, это должно помочь. Теперь, что вы могли бы сделать вместо сброса адаптера, это иметь MyAdapter, напрямую ссылающийся на mContent из MyActivity. Это когда вы меняете mContent, вызывайте notifyDataSetChanged ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...