2016-11-06 55 views
1

我正在開發一個Android應用程序,該應用程序包含一個用於從Web服務加載數據的可擴展列表視圖,但我不想在啓動時加載整個數據,但首先加載父列表,然後單擊父列表,展開子列表的特定列表項列表視圖加載特定項目的子項目,所以首先它可能與否?如何動態添加子項目onClick在父項目可擴展列表視圖在android中?

謝謝

+0

確定:您使用的是哪個適配器? 'CursorTreeAdapter'? – pskink

+0

不,我正在使用BaseExpandableListAdapter。使用BaseExpandableListAdapter的 –

+0

您需要更多的工作 – pskink

回答

0

我需要知道api的樣子。無論這個「父母」數據是什麼,可能來自一些API?你可以從另一個API調用中檢索這個「孩子」數據嗎?它可以做

一種方法是:

  1. 調用API - > getParentList()的檢索去你的父母的所有元素。
  2. 將此列表作爲父值綁定到您的適配器中
  3. onClick每個父級,創建另一個返回該父級的子元素的api,即返回該特定父級信息的getChildOfParent(int parent_id)。

事情要注意的

記住,綁定到用戶界面時,你應該有某種策略。這份名單有多大?它需要分頁嗎?你將如何處理分頁?你如何/將在哪裏緩存你的物品清單?用戶體驗應該是什麼樣子?

這些都是需要考慮的東西,還有更多。

你應該研究的一些東西是retrofit/okhttp,sqlite/realm,畢加索(如果你想擴大圖像),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; 
    } 
}); 

返回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); 
    } 
} 

我不確定這是否是最好的方法,但它確實對我有效。