2016-11-06 5 views
1

웹 서비스의 데이터로드에 대한 하나의 확장 가능 목록보기를 포함하는 Android 애플리케이션을 개발 중입니다. 그러나 시작시 전체 데이터를로드하고 싶지는 않지만 상위 목록을 먼저로드 한 다음 상위 목록을 클릭하여 하위의 특정 목록 항목을 확장하십시오. 목록보기에서 해당 항목의 하위 항목을로드하여 먼저 가능하거나 불가능합니까?하위 항목을 동적으로 추가하려면 어떻게해야합니까? 안드로이드에있는 상위 항목 Expandable listview?

고맙습니다.

+0

확실 : 어떤 어댑터를 사용하고 있습니까? 'CursorTreeAdapter'? – pskink

+0

아니요, BaseExpandableListAdapter를 사용하고 있습니다. –

+0

BaseExpandableListAdapter를 사용하면 더 많은 작업이 필요합니다. – pskink

답변

0

API의 모양을 알아야합니다. 이 "상위"데이터가 무엇이든, 일부 API에서 올 수 있습니까? 그리고 다른 API 호출에서이 "하위"데이터를 가져올 수 있습니까? 그것을 할 수

한 가지 방법은 다음과 같습니다

  1. 는 API 호출을 확인 -> getParentList() 부모에 가서 모든 요소를 ​​검색합니다. 특정 부모의 정보를 반환합니다> getChildOfParent (INT의 PARENT_ID) -
  2. 바인드 부모로서 어댑터에서이 목록은 부모 즉의 자식 요소를 반환 다른 API를 만들어, 각 부모의
  3. 의 onclick 값.

상황이

기억의 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); 
    } 
} 

이것이 최선의 방법인지는 확실하지 않지만 확실하게 잘 작동합니다.