2012-09-07 8 views
0

다른 "Mother"Listview 안에 여러 Listviews를 가져 오려고했습니다.ExpandableListView 또는 중첩 된 ListView의 다중 ListView

나는 ListView가 생성 된 클래스와이 뷰를 호출하는 Activity 클래스를 가지고있다. 내가하고 관리하는 유일한 항목 @ ListPerms와 "어머니"(개체가 같아요)

다음

이 (지금) 복수의 ListView

public ListPerms(Context context, String a, int docid) { 
    super(context); 
    table=a; 
    did=docid; 
    list= (ListView) findViewById(R.id.specific_perm_list); 
    getdata(list,ar_list); 
} 


private void getdata(ListView list, ArrayList<String> arlist){ 
    Database openHelper = new Database(getContext()); 
    myDB = openHelper.getReadableDatabase(); 
    myDB=SQLiteDatabase.openDatabase("data/data/com.example.login2/databases/aeglea", null, SQLiteDatabase.OPEN_READONLY); 

    try{fill(list,arlist);}catch(Exception e){Log.e("NAT EXISTANT","THIS->"+e);} 

} 

private void fill(ListView list, ArrayList<String> arlist){ 
    Cursor temp = null; 
    Cursor buffer = null; 
    String type_from_table = null; 
    String[] items = null; 

    if(table=="med") {type_from_table = "medication";} 
    if(table=="test") {type_from_table = "test";} 
    if(table=="all") {type_from_table = "allergy";} 
    if(table=="proc") {type_from_table = "procedure";} 
    if(table=="cond") {type_from_table = "condition";} 
    if(table=="vacc") {type_from_table = "vaccine";} 


    temp = fetchOption("SELECT * FROM permission WHERE did="+did+" AND type='"+type_from_table+"'"); 
    if(temp.getCount()>0){ 

     buffer = fetchOption("SELECT * FROM user_"+table+" WHERE id="+temp.getString(temp.getColumnIndex("fileid"))); 
     items = new String[] {buffer.getString(buffer.getColumnIndex("name"))}; 
     arlist.addAll(Arrays.asList(items)); 
     listAdapter = new ArrayAdapter<String>(getContext(), R.layout.item, arlist); 

     for(int i=1;i<temp.getCount();i++){ 
      temp.moveToNext(); 
      buffer = fetchOption("SELECT * FROM user_"+table+" WHERE id="+temp.getString(temp.getColumnIndex("fileid"))); 
      listAdapter.add(buffer.getString(buffer.getColumnIndex("name"))); 
     } 

     list.setAdapter(listAdapter); 
    }else{ 
     items = new String[] { "None."}; 
     arlist.addAll(Arrays.asList(items)); 
     listAdapter = new ArrayAdapter<String>(getContext(), R.layout.item, arlist); 
     list.setAdapter(listAdapter); 
    } 
} 

그리고 활동 클래스는 다음과 내 클래스입니다 채우기입니다

{.... LV, LV} 나는 ExpandableListView를 가지고,하지만 난 ELV가있는 ListView {LV, 레벨 ...} 또는 ExpandableListView을 수행하는 방법에

protected void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.docp); 
     general = (ExpandableListView) findViewById(R.id.Tot_perm_list); 
    //random data 
} 
protected void onResume(){ 
    super.onResume(); 

    ListPerms me = new ListPerms(getApplicationContext(),"med",did); 
    ListPerms te = new ListPerms(getApplicationContext(),"test",did); 
    ListPerms all = new ListPerms(getApplicationContext(),"all",did); 
    ListPerms proc = new ListPerms(getApplicationContext(),"proc",did); 
    ListPerms cond = new ListPerms(getApplicationContext(),"cond",did); 
    ListPerms vacc = new ListPerms(getApplicationContext(),"vacc",did); 

    me.setActivated(isChild()); 
    te.setActivated(isChild()); 
    all.setActivated(isChild()); 
    proc.setActivated(isChild()); 
    cond.setActivated(isChild()); 
    vacc.setActivated(isChild()); 
    list.add(me); 
    list.add(te); 
    list.add(all); 
    list.add(proc); 
    list.add(cond); 
    list.add(vacc); 

    general.setAdapter(listAdapter); 
    general.addChildrenForAccessibility(list); 
    //what do I do 
} 

조언을 어떻게 작동하는지 이해하는 것이 정말 멍청한 놈이야

답변

1

필자의 이해에 따라 두 개 이상의 목록보기를 하나로 통합하는 것은 좋지 않습니다. 물론 스크롤링에 문제가있을 것입니다 (물론 더러운 해킹으로 해결할 수 있습니다). 아마도 단일 목록보다 성능이 최악이 될 것입니다.

나는 당신이 ExpandableList 및 ExpandableListAdapter와 함께 할 것을 제안합니다. 목록을 하나로 만들기 위해서는 어댑터를 작성해야합니다.
예 : 다음과 같이 표시 될 수 있습니다.

... 
// Your implementation of ExpandableListAdapter 

// To store all 'child' adapters, it should be filled by the owner 
SparseArray<BaseAdapter> mChildAdapters = new SparseArray<BaseAdapter>(); 

@Override 
public View getChildView(int groupPosition, int childPosition, 
     boolean isLastChild, View convertView, ViewGroup parent) { 
    final BaseAdapter childAdapter = mChildAdapters.get(groupPosition); 
    View view = null; 

    if (childAdapter != null) { 
     view = childAdapter.getView(childPosition, convertView, parent); 
    } 

    return view; 
} 

@Override 
public int getChildrenCount(int groupPosition) { 
    int childrenCount = 0; 
    final BaseAdapter childAdapter = mChildAdapters.get(groupPosition); 

    if (childAdapter != null) { 
     childrenCount = mChildAdapter.getCount(); 
    } 

    return childrenCount; 
} 
... 

위의 코드는 초안이지만이 아이디어는 분명히 분명합니다. 이 접근법에서 직면 할 수있는 유일한 트릭은 convertView입니다. 하나의 childAdapter가 다른 childAdapter에서 가져온 것일 수 있으므로 convertView를 다시 사용하기 전에 일부 검사 (아주 사소한)를 적용해야합니다.

또한 확장 가능한 목록을 사용하면 모든 목록에 groupView를 통해 헤더를 제공 할 수 있습니다.

+0

고마워요! 나는 그것을 시도 할 것이다. 데이터를 많은 ListViews로 파싱하는 대신 ExpandableListView에 데이터를 채우는 방법을 볼 수 없습니다. – MayTheSchwartzBeWithYou

+1

hm, 예 : asynctask를 사용하여 하위 어댑터를 만들고 데이터를 준비합니다. 또는 http://developer.android.com/guide/components/loaders.html - CursorLoader를 통해 mChildAdapters에 새로운 하위 어댑터를 추가하면 데이터가 준비됩니다 (하나씩) - 빈 화면이 표시됩니다. – sandrstar

관련 문제