2014-07-23 18 views
18

Kann der Adapter auf LinearLayout eingestellt werden?ist es möglich, Adapter auf lineares Layout zu setzen?

Ich möchte ListView nicht verwenden, da ich ScrollView verwende. so ich LinearLayout bin mit ...

Indem ich Ansichten dynamisch bin das Hinzufügen und jetzt brauche ich Adapter zu verwenden .. Vorschläge so jemand noch?

ich das tue ...

LinearLayout clientList = (LinearLayout) findViewById(R.id.clients); 
adapter = new Sample1AdapterActivity(this, arrayList); 
View list = (ListView) getLayoutInflater().inflate(R.layout.user_details, getListView(), false); 

Antwort

24

keine kann man nicht. Sie können die einzelne Zeile aufblasen und zum LinearLayout hinzufügen. In Pseudo-Code:

+0

Sie können von einigen Adapter-Feinheiten mit meinem obigen Code profitieren (z. B. Layout-Aktualisierung, wenn der Adapter aktualisiert wird). –

+0

Es ist definitiv möglich, aber Sie zahlen die Mühe, schreiben Sie auch den Adapter. Und in einem benutzerdefinierten getView müssen Sie das Layout auf jeden Fall aufblasen und auffüllen. +1 von mir @MarvinLabs – Blackbelt

+0

seine Arbeit .... aber kann ich einige weitere Operationen darauf machen? wie onClick Event-Handling etc.? – shashi2459

18

Ja können Sie durch Hinzufügen Ihrer eigenen spezifischen LinearLayout-Implementierung, um Kind Ansichten vom Adapter zu erhalten. In meiner grundlegenden Implementierung wird jedoch nicht der gesamte Ansichtsrecyclingcode bereitgestellt, der von der Listenansicht bereitgestellt wird.

/** 
* A linear layout that will contain views taken from an adapter. It differs 
* from the list view in the fact that it will not optimize anything and 
* draw all the views from the adapter. It also does not provide scrolling. 
* However, when you need a layout that will render views horizontally and 
* you know there are not many child views, this is a good option. 

* 
* @author Vincent Mimoun-Prat @ MarvinLabs 
*/ 
public class AdapterLinearLayout extends LinearLayout { 

    private Adapter adapter; 
    private DataSetObserver dataSetObserver = new DataSetObserver() { 
     @Override 
     public void onChanged() { 
      super.onChanged(); 
      reloadChildViews(); 
     } 
    }; 

    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
    public AdapterLinearLayout(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     setOrientation(LinearLayout.HORIZONTAL); 
    } 

    public AdapterLinearLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setOrientation(LinearLayout.HORIZONTAL); 
    } 

    public AdapterLinearLayout(Context context) { 
     super(context); 
     setOrientation(LinearLayout.HORIZONTAL); 
    } 

    public void setAdapter(Adapter adapter) { 
     if (this.adapter == adapter) return; 
     this.adapter = adapter; 
     if (adapter != null) adapter.registerDataSetObserver(dataSetObserver); 
     reloadChildViews(); 
    } 

    @Override 
    protected void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 
     if (adapter != null) adapter.unregisterDataSetObserver(dataSetObserver); 
    } 

    private void reloadChildViews() { 
     removeAllViews(); 

     if (adapter == null) return; 

     int count = adapter.getCount(); 
     for (int position = 0; position < count; ++position) { 
      View v = adapter.getView(position, null, this); 
      if (v != null) addView(v); 
     } 

     requestLayout(); 
    } 
} 
+1

Große Antwort! Aber eine Frage - als Android-Noob, können Sie mir sagen, warum setOrientation (LinearLayout.HORIZONTAL); scheint die Ausrichtung VERTICAL I in XML überschreiben? Eine Art von Vorrang? –

Verwandte Themen