2016-11-06 12 views
1

Webサービスのデータをロードするための1つのExpandable Listビューを含むAndroidアプリケーションを開発していますが、起動時にデータ全体を読み込むのではなく、親リストをロードしてから親リストをクリックします。リストビューの特定のアイテムの子アイテムをロードして、最初にそれが可能かどうかを確認します。子供のアイテムを動的に追加するにはどうすればいいのですか親のアイテムonClickアンドロイドの展開可能なリストビューですか?

ありがとうございました

+0

確か:どのアダプターを使用していますか? 'CursorTreeAdapter'? – pskink

+0

いいえ、私はBaseExpandableListAdapterを使用しています。 –

+0

BaseExpandableListAdapterを使用するとより多くの作業が必要になります – pskink

答えて

0

私はAPIの外観を知る必要があります。この「親」データが何であっても、いくつかのAPIから来る可能性がありますか?そして、あなたは別のAPIコールからこの "子"データを取得できますか?それが行うことができる

一つの方法は次のとおりです。

  1. は、API呼び出しを作る - > getParentList()あなたの親に行くすべての要素を取得しています。
  2. このリストを親の値としてアダプタにバインドします。
  3. 各親のonClick、その親の子要素を返す別のAPIを作成します。つまり、その特定の親の情報を返すgetChildOfParent(int parent_id)です。

UIに結合するときに、戦略のいくつかの並べ替えを持っている必要があり、覚えておいてください

の注意すべき事。このリストはどれくらい大きいですか?ページを変更する必要がありますか?あなたはそのページネーションをどうやって扱いますか?どのように/アイテムのリストをキャッシュしますか?ユーザーエクスペリエンスはどのように見えますか?

これはすべてのものであり、さらに多くのことを考えることができます。

retrofit/okhttp、sqlite/realm、Picasso(画像を展開する場合)、CursorAdapter(ページ設定)などがあります。

1

あなたの質問が何を意味するかは十分にはわかりませんが、必要なものがBaseExpandableListAdapterに子アイテムを動的に読み込むことです。関連するグループヘッダーをクリックすると(下のように)「子アイテム」をロードすると、解決策があります。

あなたの活動に
 
v Group header 1 
| -- Child item 1 
| -- Child item 2 
v Group header 2 
| -- Child item 1 
| -- Child item 2 

、このようなあなたのExpandableListViewを見つける:

ExpandableListView expandableListView = (ExpandableListView) findViewById(R.id.expandable_list_view); 

その後グループをチェックするためのリスナーを追加しますが、クリックした:

expandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() 
{ 
    @Override 
    public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) 
    { 
     if (expandableListView.isGroupExpanded(groupPosition)) 
      expandableListView.collapseGroup(groupPosition); 
     else 
      new BackgroundTask(groupPosition).execute(); 

     return true; 
    } 
}); 

リターン真のクリックを "消費" しますクリックするとグループのデフォルト展開を停止します。そのため、ASyncTaskでは手動で展開する必要があります。 falseを返すと、GUIでリストビューが自動的に展開され、グループを折りたたんで再展開するまで、バックグラウンド計算の結果は表示されません。

私のコードでは、SparseBooleanArrayを使用して、データが特定のグループに対してすでに設定されているかどうかを追跡しました。その値をonGroupClick()メソッドでチェックしました。私はこれを行って、グループが展開されたときにデータを一度読み込むだけで済むようにしましたが、明らかに各展開時にデータを変更したい場合は、この必要はありません。あなたの質問はむしろ漠然としていたので、正確なシナリオがあなたの使い方にどのようなものかはわかりません。

private class BackgroundTask extends AsyncTask<Void, Void, List<ReturnType>> 
{ 
    int groupPosition; 

    private BackgroundTask(int groupPosition) 
    { 
     this.groupPosition = groupPosition; 
    } 

    @Override 
    protected List<ReturnType> doInBackground(String... params) 
    { 
     // TODO: Do your background computation... 
     // Then return it 
    } 

    @Override 
    protected void onPostExecute(List<ReturnType> resultsList) 
    { 
     super.onPostExecute(resultsList); 

     // TODO: Add the resultsList to whatever structure you're using to store the data in the ListView Adapter 
     expandableListView.expandGroup(groupPosition); 
    } 
} 

これが最善の方法であるかどうかはわかりませんが、それは確かに私の仕事です。

関連する問題