2014-07-23 17 views
18

È possibile impostare l'adattatore su LinearLayout?è possibile impostare l'adattatore sul layout lineare?

Non voglio usare ListView poiché sto usando ScrollView. così Sto usando LinearLayout ...

In che sto dinamicamente aggiungendo punti di vista e ora ho bisogno di utilizzare l'adattatore .. così qualcuno ha qualche suggerimento?

sto facendo questo ...

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

risposta

24

no non si può. Quello che puoi fare è gonfiare la singola riga e aggiungerla al LinearLayout. In pseudo codice:

LinearLayout linearLayout = (LinearLayout) findViewById(...); 
    LayoutInflater inflater = LayoutInflater.from(this); 
    for (item in arrayList) { 
    View view = inflater.inflate(R.layout.row, linearLayout, false); 
    // set item content in view 
    linearLayout.addView(view) 
    } 
+0

È possibile beneficiare di alcune sottigliezze dell'adattatore con il mio codice sopra (ad esempio l'aggiornamento del layout quando l'adattatore viene aggiornato). –

+0

È sicuramente possibile ma si paga lo sforzo di scrivere anche l'adattatore. E in un getView personalizzato è necessario gonfiare e riempire il layout in ogni caso. +1 da me @MarvinLabs – Blackbelt

+0

suo funzionamento .... ma posso fare alcune ulteriori operazioni su di esso? come la gestione degli eventi onClick, ecc.? – shashi2459

18

Sì, è possibile aggiungere la propria implementazione LinearLayout specifica per ottenere visualizzazioni figlio dall'adattatore. Tuttavia, la mia implementazione di base non fornirà tutto il codice di visualizzazione vista fornito dalla visualizzazione elenco.

/** 
* 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

Ottima risposta! Ma una domanda: come un noob Android, puoi dirmi perché setOrientation (LinearLayout.HORIZONTAL); sembra sovrascrivere l'orientamento VERTICAL I fornito in XML? Una sorta di precedenza? –

Problemi correlati