2011-07-06 6 views
0

맞춤 목록을 만드는 더 좋은 방법이 있습니까? 내 코드는 반응이 적은 목록을 만드는 것처럼 보입니다. ScrollView에 두 개의 ListView가 필요하기 때문에 표준 Android 목록을 사용할 수 없습니다. 일반적으로Android 사용자 정의 목록이 느림

ArrayList<TypeA> typeAList; 
ArrayList<TypeB> typeBList; 

@Override 
int getViewTypeCount(){ return 2; } // means you have two different views from it 

@Override 
int getItemViewType(int position){ 
    if (position>typeAList.size()) return 1; 
    return 0; 
} 

getView(int pos, View convertView, ViewGroup parent){ 
    // Check the pos 
    if (getItemViewType(pos) == 0){ 
     // Inflate view and bind for type A 
    } 
    else{ 
     // Inflate view and bind for type B 
    } 
} 

: 동일한 레이아웃 목록에 필요한 경우

setContentView(R.layout.alertsview); 

    inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    topRows = new ArrayList<View>(); 
    topLayout = (LinearLayout)findViewById(R.id.topListLayout); 
    topLayout.removeAllViews(); 
    topRows.clear(); 
    List<Camera> camList = new ArrayList<Camera>(SitesOrchestrator.getInstance().currentSite.cameraList); 

    for (int i = 0; i < camList.size(); i++) 
    { 
     Camera cam = camList.get(i); 
     View row = inflater.inflate(R.layout.cameraalertrow, null); 
     TextView name = (TextView)row.findViewById(R.id.cameraNameAlerts); 
     CheckBox chk = (CheckBox)row.findViewById(R.id.camAlertChk); 
     name.setText(cam.name); 
     chk.setChecked(cam.alertsEnabled); 
     chk.setOnCheckedChangeListener(this); 
     String index = Integer.toString(i); 
     chk.setTag(index); 
     topRows.add(row); 
     topLayout.addView(row); 
    } 
+0

camList가 실제로 작지 않은 한, 이는 항상 느리고 비효율적입니다. UI를 다시 생각해보고 두 개의 목록을 피하십시오. –

답변

1

, 당신이 당신의 자신의 어댑터를 만들어야 두 ArrayList에 있다고 가정, (좋은 수 있습니다 기본 어댑터에서 파생), 및 두 개의 목록보기를 세로로 가지는 것은 Android에서는 권장되지 않지만 두 콘텐츠를 하나의 목록에 넣는 것이 트릭입니다. 나는 또한 이것에 대해 tutorial을 가지고있다. MVVM에서 Android-Binding으로 행해진 다.

또한 ListView를 하나씩 ScrollView에 추가하여 ListView를 모방하는 것은 물론 비효율적입니다. Android ListView가 작동하는 방식 (데스크톱 프레임 워크와 다름)은보기를 재사용하는 것입니다. 위로 스크롤하는 경우, 아이가 보이지 않게 스크롤되면 listview는 맨 위의 것을 재사용하여 맨 아래에 놓고 재생 가능한보기는 getView 코드에서 convertView으로 전달됩니다. Inflating은 매우 비싼 프로세스로 간주되며, 여러 자식보기가 메모리를 많이 소비하므로 표준 ListView와 비교하여 코드가 비효율적 인 이유입니다.

+0

내 사용자 지정 목록에서 사용자 지정 어댑터를 사용하는 이유가 있습니까? 대기열을 제거하는 셀을 관리하는 것이 더 간편합니까? – spentak

+1

많은 목록, Android에서는 일부 맞춤 데이터를 텍스트가 아닌 다른 것으로 바인딩하는 경우 나만의 맞춤 어댑터를 작성해야합니다. 어댑터를 작성하는 것이 그렇게 어렵지는 않습니다. 셀을 관리하는 것보다 훨씬 쉽습니다 (자체 ListView를 작성하는 것입니다). http://developer.android.com/resources/samples/ApiDemos/src /com/example/android/apis/view/List4.html, API 데모의 데모 중 하나입니다 – xandy

+0

PS Android-Binding에서 다른 어댑터를 무제한으로 가져 와서 하나의 어댑터로 만드는 CombinedAdapter가 있습니다. http://code.google.com/p/android-binding/source/browse/trunk/AndroidBinding/src/gueei/ 바인딩/컬렉션/CombinedAdapter.java, 당신은 그것을 사용할 수 있습니다 (AB가 될 필요가 없습니다) – xandy

관련 문제