Autore Topic: ListView altezza dinamica  (Letto 541 volte)

Offline k3v1n

  • Utente junior
  • **
  • Post: 61
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung S3
ListView altezza dinamica
« il: 29 Aprile 2013, 12:14:00 CEST »
0
Salve a tutti,

ho uno scroll View all'interno del quale, oltre ad elementi come immagini, button ecc ecc, c'è anche una listview. Purtroppo però se non imposto nel file xml di layout l'altezza fissa per la listview, questa non compare tutta e non è scrollabile. Vorrei che la lista comparisse tutta e non sia autonomamente scrollabile poichè affido tutta la gestione allo scrollView.

Sapreste dirmi come gestire questo scenario?

grazie

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:ListView altezza dinamica
« Risposta #1 il: 29 Aprile 2013, 12:25:47 CEST »
+1
Teoricamente, secondo gli sviluppatori di Android, due elementi scrollabili non dovrebbe stare l'uno dentro l'altro.
Qua trovi una domanda a cui partecipa anche Romain Guy.
Qua, comunque, trovi una possibile soluzione (che non ho testato personalmente).

Comunque io credo che si possa evitare di mettere una ListView dentro una ScrollView. Per esempio applicando un header e/o footer alla ListView.
Postate il LogCat LogCat LogCat LogCat LogCat

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +153
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:ListView altezza dinamica
« Risposta #2 il: 29 Aprile 2013, 12:28:23 CEST »
+2
Non dovresti usare la listView, perchè sei già all'interno di una ScrollView, per di più se la vuoi non scrollable è decisamente oneroso usarla.

Puoi usare per esempio  LinearLayout con un Adapter.
Qualcosa come questo:

Codice (Java): [Seleziona]
public class ListLayout extends LinearLayout implements
                View.OnClickListener {

        private Adapter list;
        private View.OnClickListener mListener;

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

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

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

        @Override
        public void onClick(View v) {
                if (mListener!=null)
                        mListener.onClick(v);
        }

        public void setList(Adapter list) {
                this.list = list;
               
                //Popolute list
                if (this.list!=null){
                        for (int i=0;i<this.list.getCount();i++){
                                View item= list.getView(i, null,null);
                                this.addView(item);
                        }
                }              
        }

        public void setmListener(View.OnClickListener mListener) {
                this.mListener = mListener;
        }
}

E poi usare un adapter. Per esempio:

Codice (Java): [Seleziona]
private class MyListAdapter extends BaseAdapter {
               
                String[] items = new String[] { "Title1", "Title2", "Title3", "Title4",
                "Title5" , "Title 6" , "Title 7" };            
               
                @Override
                public int getCount() {
                        return items.length;
                }

                @Override
                public Object getItem(int position) {
                        return items[position];
                }

                @Override
                public long getItemId(int position) {
                        return 0;
                }

                @Override
                public View getView(int position, View convertView, ViewGroup parent) {
                           //TODO .....
                }
        }

E richiamare il tutto con:

Codice (Java): [Seleziona]
     // Create ArrayAdapter
    MyListAdapter mListAdapter = new MyListAdapter();
    ListLayout mLay = (ListLayout) findViewById(R.id.box_list_ev);
    if (mLay != null) {
                mLay.setList(mListAdapter);
    }