3

2 レベルの DrawerLayout を実装しようとしています。ベースラインとして、 http://developer.android.com/training/implementing-navigation/nav-drawer.htmlの Google Planet の例を使用しています。そこで、この例を拡張して、惑星のリストから惑星を選択すると、惑星のリストがその惑星の都市のリストに置き換えられるようにしたいと思います (地球以外はほとんど空白です - 私はまだ自分のデータを肉付けしています :- ) ) )。

私が取ることができる3つのアプローチがあると考えました:-

  1. リストビューを置き換える
  2. ListView を保持しますが、その ArrayAdapter を置き換えます
  3. ListView と ArrayAdapter を保持しますが、アダプターのデータを置き換えます

したがって、オプション 3 を試してみてください (これが最善の方法ですか?)、私の DrawerItemClickListener で次のことを行います...

arrayAdapter.clear(); 
arrayAdapter.addAll(arrayListOfCities);
arrayAdapter.notifyDataSetChanged(); 
mDrawerList.invalidateViews();
mDrawerList.forceLayout();
mDrawerList.refreshDrawableState();

つまり、惑星のリストが都市のリストに置き換えられません。

私のアプローチは正しいですか?もしそうなら、どうすればリストを更新できますか?

4

1 に答える 1

5

リストビューを置き換える

その必要は本当にありません。


ListView を保持しますが、その ArrayAdapter を置き換えます

これが最も簡単に実装できます。最初に、次の文字列配列 (都市名) を res/values/strings.xml に追加します。

<string-array name="mercury_array">
    <item>Undiscovered City 1 (Mercury)</item>
    <item>Undiscovered City 2 (Mercury)</item>
    <item>Undiscovered City 3 (Mercury)</item>
    <item>Undiscovered City 4 (Mercury)</item>
</string-array>
<string-array name="venus_array">
    <item>Undiscovered City 1 (Venus)</item>
    <item>Undiscovered City 2 (Venus)</item>
    <item>Undiscovered City 3 (Venus)</item>
    <item>Undiscovered City 4 (Venus)</item>
</string-array>
<string-array name="earth_array">
    <item>New York</item>
    <item>Hong Kong</item>
    <item>New Delhi</item>
    <item>London</item>
</string-array>
<string-array name="mars_array">
    <item>Undiscovered City 1 (Mars)</item>
    <item>Undiscovered City 2 (Mars)</item>
    <item>Undiscovered City 3 (Mars)</item>
    <item>Undiscovered City 4 (Mars)</item>
</string-array>
<string-array name="jupiter_array">
    <item>Undiscovered City 1 (Jupiter)</item>
    <item>Undiscovered City 2 (Jupiter)</item>
    <item>Undiscovered City 3 (Jupiter)</item>
    <item>Undiscovered City 4 (Jupiter)</item>
</string-array>
<string-array name="saturn_array">
    <item>Undiscovered City 1 (Saturn)</item>
    <item>Undiscovered City 2 (Saturn)</item>
    <item>Undiscovered City 3 (Saturn)</item>
    <item>Undiscovered City 4 (Saturn)</item>
</string-array>
<string-array name="uranus_array">
    <item>Undiscovered City 1 (Uranus)</item>
    <item>Undiscovered City 2 (Uranus)</item>
    <item>Undiscovered City 3 (Uranus)</item>
    <item>Undiscovered City 4 (Uranus)</item>
</string-array>
<string-array name="neptune_array">
    <item>Undiscovered City 1 (Neptune)</item>
    <item>Undiscovered City 2 (Neptune)</item>
    <item>Undiscovered City 3 (Neptune)</item>
    <item>Undiscovered City 4 (Neptune)</item>
</string-array>

loadContentList(int)でメソッドを作成しますMainActivity。これは、メイン リストのアイテム クリック時に呼び出されるメソッドです。

private void loadContentList(int position) {

    setTitle(mPlanetTitles[position]);

    String[] content;

    switch(position) {
    case 0:
            content = getResources().getStringArray(R.array.mercury_array);
            break;
    case 1:
            content = getResources().getStringArray(R.array.venus_array);
            break;
    case 2:
            content = getResources().getStringArray(R.array.earth_array);
            break;
    case 3:
            content = getResources().getStringArray(R.array.mars_array);
            break;
    case 4:
            content = getResources().getStringArray(R.array.jupiter_array);
            break;
    case 5:
            content = getResources().getStringArray(R.array.saturn_array);
            break;
    case 6:
            content = getResources().getStringArray(R.array.uranus_array);
            break;
    case 7:
            content = getResources().getStringArray(R.array.neptune_array);
            break;
    default:
            content = getResources().getStringArray(R.array.neptune_array);     
}

    // Change ListView's adapter    
    mDrawerList.setAdapter(new ArrayAdapter<String>(this,
            R.layout.drawer_list_item, content));

    // Change OnItemClickListener // CityItemClickListener is defined below
    mDrawerList.setOnItemClickListener(new CityItemClickListener());
}

Planet アイテムがクリックされたときに ListView を更新したいので、DrawerItemClickListener のメソッド本体を変更し、新しく追加された を呼び出しますloadContentList(int)

/* The click listner for ListView in the navigation drawer */
private class DrawerItemClickListener implements ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        //selectItem(position);
        loadContentList(position);
    }
}

都市がクリックされたときにフラグメントを変更するには、別の OnItemClickListener が必要です。:

private class CityItemClickListener implements ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        // This is the method that was being called on planet click 
        // in the original example. Implementation of it is up to you
        selectItem(position);
    }
}

ListView と ArrayAdapter を保持しますが、アダプターのデータを置き換えます

ArrayAdapter を定義します。

private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;    
---------> private ArrayAdapter<String> mAdapter;     

MainActivity の onCreate(Bundle):

ArrayList<String> planetList = new ArrayList<String>();

planetList.addAll(Arrays.asList(mPlanetTitles));

mAdapter = new ArrayAdapter<String>(this,
            R.layout.drawer_list_item, planetList);

// set up the drawer's list view with items
mDrawerList.setAdapter(mAdapter);      

UnsupportedOperationExceptionを呼び出すときに避けるために、ArrayList を渡す必要がありmAdapter.clear()ます。

次のように変更loadContentList(int)します。

private void loadContentList2(int position) {

    setTitle(mPlanetTitles[position]);

    String[] content;

    switch(position) {

        ....
        ....
    }

    ArrayList<String> cityList = new ArrayList<String>();

    cityList.addAll(Arrays.asList(content));

    mAdapter.clear();

    mAdapter.addAll(cityList);

    // update
    mAdapter.notifyDataSetChanged();        

    // Change on item click listener
    mDrawerList.setOnItemClickListener(new CityItemClickListener());

}

CityItemClickListener と DrawerItemClickListener は以前と同じままです。唯一の変更点は、惑星リスト項目のクリックで新しい ArrayAdapter を作成しないことです。

ユーザーが都市ビューから惑星リストに戻る方法 (おそらくボタン) を理解する必要があります。

ExpandableListView を調べることもお勧めします。問題をよりエレガントに解決するかもしれません。

于 2013-09-13T23:12:25.260 に答える