2013-09-04 6 views
2

Je veux définir listview pour afficher tous les éléments sans défilement.
ci-dessous est ma mise en page:ListView sans défiler sur Android

<LinearLayout 
      android:id="@+id/layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" > 

     <TextView 
     android:id="@+id/tv1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Large Text" 
     android:textColor="@android:color/black" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

     <ListView 
     android:id="@+id/list" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 
    </ListView> 

    <TextView 
     android:id="@+id/tv2" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Large Text" 
     android:textColor="@android:color/black" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    </LinearLayout> 

Le LinearLayout est appartiennent à un scrollview.
Donc, je veux définir la liste de tous les éléments et faire défiler par le défilement du parent.
Comment puis-je le faire?

+0

listview dans une vue défilante? – Raghunandan

+1

C'est mission impossible. Utilisez d'autres alternatives pour afficher des données fixes. –

+0

@PankajKumar ce n'est pas une mission impossible, mais surtout c'est une mauvaise pratique, regardez ma réponse ci-dessous – dumazy

Répondre

5

Voici comment vous devez définir votre listview dans un ScrollView, mais comme quelqu'un d'autre a répondu, vous ne devriez jamais mettre un listview dans un scrollview, surtout si le listview contiendra beaucoup d'éléments

ListView lv = (ListView)findViewById(R.id.list); // your listview inside scrollview 

lv.setOnTouchListener(new ListView.OnTouchListener() 
{ 
    @Override 
    public boolean onTouch(View v, MotionEvent event) 
    { 
     int action = event.getAction(); 
     switch (action) 
     { 
     case MotionEvent.ACTION_DOWN: 
      // Disallow ScrollView to intercept touch events. 
      v.getParent().requestDisallowInterceptTouchEvent(true); 
      break; 

     case MotionEvent.ACTION_UP: 
      // Allow ScrollView to intercept touch events. 
      v.getParent().requestDisallowInterceptTouchEvent(false); 
      break; 
     } 

     // Handle ListView touch events. 
     v.onTouchEvent(event); 
     return true; 
    } 
}); 
2

Ne placez pas listview dans un scrollview.

http://developer.android.com/reference/android/widget/ScrollView.html

Je cite docs Vous ne devez jamais utiliser un ScrollView avec un ListView, parce que ListView prend soin de son propre défilement vertical. Plus important encore, cela annule toutes les optimisations importantes dans ListView pour traiter les listes volumineuses, car cela oblige effectivement ListView à afficher toute sa liste d'éléments pour remplir le conteneur infini fourni par ScrollView.

Vous pouvez ajouter vos textview comme en-tête et pied de page à listview.

http://developer.android.com/reference/android/widget/ListView.html

Vérifiez les méthodes d'en-tête et pied de page dans le lien ci-dessus

Vous pouvez avoir une disposition relative ajouter textviews en haut et en bas. Par rapport aux textviews ont la liste entre les textview

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:text="TextView1" /> 

    <TextView 
     android:id="@+id/textView2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignLeft="@+id/textView1" 
     android:layout_alignParentBottom="true" 
     android:text="TextView1" /> 

    <ListView 
     android:id="@+id/listView1" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@+id/textView1" 
     android:layout_above="@+id/textView2" 
     > 

    </ListView> 

</RelativeLayout> 
+0

Utiliser les en-têtes/pieds de page fonctionne bien pour les mises en page simples, mais devient enfer si vous voulez mettre des champs dynamiques tels que edittext dans l'en-tête/pied de page – craigrs84

2

Je pense que ce n'est pas possible. Si nous remplaçons le comportement de défilement de la liste par le biais du défilement parent, la vue liste ne fonctionne pas correctement.

3

Si la raison de cette exigence est similaire à ce dont j'avais besoin, la classe ci-dessous peut vous aider. C'est un remplacement ListView, celui qui observe un adaptateur et ses changements et réagit en conséquence, mais utilise un LinearLayout peuplé manuellement sous le capot, en fait. Je suppose que j'ai trouvé ce code quelque part sur le net mais je ne pouvais pas le localiser maintenant pour le lier. Mes besoins étaient d'utiliser les avantages d'un ListView, à savoir sa fonctionnalité d'adaptateur, pour afficher un très peu d'éléments (1 à 5) sur une page, avec éventuellement plus d'un tel remplacement ListView sur un seul écran. Une fois affichés, les éléments eux-mêmes deviennent une partie de la page plus grande, donc ils ne sont pas déroulés séparément dans leur propre ListView, plutôt avec la page dans son ensemble.

public class StaticListView extends LinearLayout { 
    protected Adapter adapter; 
    protected Observer observer = new Observer(this); 

    public StaticListView(Context context) { 
    super(context); 
    } 

    public StaticListView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    } 

    public void setAdapter(Adapter adapter) { 
    if (this.adapter != null) 
     this.adapter.unregisterDataSetObserver(observer); 
    this.adapter = adapter; 
    adapter.registerDataSetObserver(observer); 
    observer.onChanged(); 
    } 

    private class Observer extends DataSetObserver { 
    StaticListView context; 

    public Observer(StaticListView context) { 
     this.context = context; 
    } 

    @Override 
    public void onChanged() { 
     List<View> oldViews = new ArrayList<View>(context.getChildCount()); 
     for (int i = 0; i < context.getChildCount(); i++) 
     oldViews.add(context.getChildAt(i)); 

     Iterator<View> iter = oldViews.iterator(); 
     context.removeAllViews(); 
     for (int i = 0; i < context.adapter.getCount(); i++) { 
     View convertView = iter.hasNext() ? iter.next() : null; 
     context.addView(context.adapter.getView(i, convertView, context)); 
     } 
     super.onChanged(); 
    } 

    @Override 
    public void onInvalidated() { 
     context.removeAllViews(); 
     super.onInvalidated(); 
    } 
    } 
} 
Questions connexes