2011-07-06 4 views
0

Existe-t-il une meilleure façon de créer une liste personnalisée, car mon code semble ici faire pour une liste moins réactive. Je ne peux utiliser aucune des listes Android standard car j'ai besoin de deux ListView dans un ScrollView.Android liste personnalisée lente

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

À moins que camList ne soit vraiment petit, cela sera toujours lent et inefficace. Vous devriez repenser votre interface utilisateur et essayer d'éviter deux listes. –

Répondre

1

Si vous avez besoin de listes dans la même mise en page, vous devez créer votre propre adaptateur (tirer de l'adaptateur de base pourrait être bon), et, supposons que vous avez deux arraylist:

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 
    } 
} 

En général , avoir deux vues verticales n'est pas encouragé dans Android, mais mettre les deux de votre contenu à une liste fait l'affaire. J'ai aussi un tutorial à ce sujet, bien qu'il soit fait dans MVVM avec Android-Binding.

De plus, ajouter des vues une par une à ScrollView pour imiter le ListView serait, bien sûr, très inefficace. Le fonctionnement d'Android ListView (qui devrait différer des frameworks de bureau) est lié au recyclage. Supposons que vous faites défiler vers le haut, une fois que l'enfant défile hors de vue, le listview recyclera le plus haut et le placera vers le bas, et la vue éventuellement recyclée passera comme convertView dans le code getView ci-dessus. Le gonflement est considéré comme un processus assez coûteux, et plusieurs vues enfants consomment également de la mémoire, c'est la raison pour laquelle votre code, comparé à ListView standard, est très inefficace.

+0

Y a-t-il une raison pour laquelle j'utiliserais un adaptateur personnalisé dans ma liste personnalisée? Est-ce simplement pour mieux gérer les cellules de déquicheurs? – spentak

+1

de nombreuses listes, dans Android, si vous liez certaines données personnalisées à quelque chose de plus que du texte, vous devez écrire votre propre adaptateur personnalisé. L'écriture d'adaptateur n'est pas si difficile, beaucoup plus facile que vous gérez vos cellules (eh bien, c'est que vous écrivez votre propre ListView), jetez un oeil à ceci: http://developer.android.com/resources/samples/ApiDemos/src /com/example/android/apis/view/List4.html, qui est l'une des démo de l'API – xandy

+0

PS Dans Android-Binding, j'ai un CombinedAdapter qui prend une liste illimitée d'autres adaptateurs et en faire un: http://code.google.com/p/android-binding/source/browse/trunk/AndroidBinding/src/gueei/ binding/collections/CombinedAdapter.java, vous pouvez l'utiliser aussi (pas besoin d'être AB) – xandy