2010-07-07 13 views
16

Ich versuche, ein Layout zu machen, das ähnlich wie der Android-Markt ist ... wo unter den Kommentaren gibt es, was scheint, ein ListView zu sein, aber es scrollt nicht (die ganze Seite blättern, aber nicht die Kommentare) . Ich bin mir nicht sicher, ob es sogar ein ListView ist, aber ich möchte etwas, das wie die Listenansicht aussieht (dh. Diese Trennbalken und was nicht, aber nicht scrollbar). Es gibt Leute, die vorschlagen, eine LinearLayout anstelle einer ListView zu verwenden, aber ich möchte auch, dass die Elemente klickbar sind und eine neue Aktivität öffnen. Bitte helfen Sie?Android ListView, die nicht scrollt?

Mein aktuelles Layout Baum ist wie so

<LinearLayout> 
    <ScrollView> 
    <RelativeLayout> 

Suche Inhalte in den RelativeLayout zu setzen.

Antwort

28

Wie von den Programmierern, die die listView in diesem video von GoogleIo getan haben, nie ein ListView in eine Bildlaufansicht. Wenn Ihre Liste nicht scrollen soll, verwenden Sie eine ViewGroup wie ein lineares Layout und fügen Sie dieser ViewGroup alle Elemente in einer Schleife in Ihrem Code hinzu. Wenn Sie möchten, dass eine ganze Zeile anklickbar ist, müssen Sie eine andere ViewGroup als Stammknoten für jede Zeile verwenden und den OnClickListener zu dieser Ansicht hinzufügen.

Beispielcode:

LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

for (int current = 0; current < itemCount; current++) { 
    View view = inflater.inflate(R.layout.layout_id, parent, false); 

    //initialize the view 

    view.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(getApplicationContext(), CLASS_TO_START) 
      startActivity(intent); 
     } 
    }); 
    viewGroup.addView(view); 
    if (current < itemCount - 1) { 
     inflater.inflate(R.layout.line, viewGroup); 
    } 
} 

Dieser Code wird eine Ansicht für jedes Element generieren, die Sie haben und es in die Viewgroup stellen. Nach jedem Element außer dem letzten fügt es auch einen Teiler zur ViewGroup hinzu.

+1

danke =) Ich endete mit dieser Methode nach herauszufinden, was ein LayoutInflater war und wie man es benutzt ... jetzt muss ich nur Dinge in XML verschönern. – Kman

+4

Schnelle Frage ... Wie kann ich die Ansicht hervorheben, wenn ich darauf klicke? – Kman

+0

@Kman Ich weiß, dass es sich um einen alten Beitrag handelt, aber wussten Sie, wie Sie eine untergeordnete Ansicht markieren, nachdem Sie darauf geklickt haben? –

0

Sie könnten einen ListView machen und alles hineinlegen, so dass die ganze Seite scrollt. Sie könnten Ihre eigene Adapterimplementierung implementieren, aber ich empfehle die Verwendung von CommonsWare ausgezeichnet MergeAdapter Sie könnten die Etiketten oder Trennleisten mit addView() und die Listen mit addAdapter() hinzufügen. Auf der Seite finden Sie weitere Informationen zur Verwendung und zum Demoprojekt.

14

Ich hatte das gleiche Problem. Ich verlängerte einfach die Standard-LinearLayout mit einer setAdapter Methode:

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

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

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

    public LinearListView(Context context, AttributeSet attrs, int defStyle) 
    { 
     super(context, attrs, defStyle); 
    } 

    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 
    { 
     LinearListView context; 

     public Observer(LinearListView 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(); 
     } 
    } 
} 

hoffte, das hilft!

+1

Dies ist eine schlechte Idee, wenn Sie in dieser "LinearListView" viele Elemente wegen der Wiederverwendung von Zeilen haben. – PaNaVTEC

+0

@PaNaVTEC: Was ist mit der Wiederverwendung von Zeilen schlecht? Es hängt auch vom Adapter ab, ob convertView verwendet wird oder nicht, na und? – Nappy

+1

Ihre LinearListView verwendet keine Zeilen, das ist das Problem. Das listView zeigt nur sichtbare Zeilen an und wenn Sie scrollen, werden die Zeilen wieder verwendet, dann haben Sie im Speicher nur sichtbare Zeilen. Mit Ihrer LinearlistView haben Sie alle Zeilen im Speicher, die Sie im Adapter ausgefüllt haben.Ich denke auch, ist eine nette Lösung für eine kleine Reihe von Zeilen – PaNaVTEC

3

ich nicht genug Ruf Punkte zu kommentieren, aber für diejenigen, die nur 1 Punkt mit in Nappy-Lösung erscheinen, stellen Sie sicher, die folgenden in Ihrem Layout-Datei festgelegt:

android:orientation="vertical" 

sonst wird es, dass erscheinen nur ein Element ist hinzugefügt werden, aber in Wirklichkeit werden sie nur horizontal hinzugefügt ... hoffe, das hilft jemandem.