2013-04-08 16 views
17

Ho impostato l'elenco di array su 12 elementi, tuttavia l'arrayAdapter restituisce solo un elemento sullo schermo, perché questo? Dovrebbe mostrare 12 articoli sulla lista.arrayAdapter restituisce solo una posizione, Android

public class MainActivity extends Activity { 

ArrayList<CheckBoxInfo> cfo = new ArrayList<CheckBoxInfo>(); 
CheckBoxInfo cbr; 
private ListAdapter MyAdapter; 
ListView listview; 
MyAdapter myAdapter; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    cbr = new CheckBoxInfo(); 
    cbr.checkBoxName = "dfdjklfjdkljf"; 
    cbr.checkBoxState = true; 

     for(int i = 0; i <12; i++){ 
      cfo.add(cbr); 
     } 

     Toast.makeText(MainActivity.this, "size: " + cfo.size(), Toast.LENGTH_SHORT).show(); 

    listview = (ListView) findViewById(R.id.listView); 
    myAdapter = new MyAdapter(cfo, this); 
    listview.setAdapter(myAdapter); 
} 

public class MyAdapter extends ArrayAdapter<CheckBoxInfo> { 

    private List<CheckBoxInfo> checkBoxList; 
    private Context context; 

    public MyAdapter(List<CheckBoxInfo> infoList, Context context) { 
     super(context, R.layout.row_layout, infoList); 
     this.checkBoxList = infoList; 
     this.context = context; 

    } 

    public View getView(int position, View convertView, ViewGroup parent) { 

     // First let's verify the convertView is not null 
     if (convertView == null) { 
      // This a new view we inflate the new layout 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.row_layout, parent, false); 
     } 
      // Now we can fill the layout with the right values 
      TextView tv = (TextView) convertView.findViewById(R.id.textView1); 
      CheckBox cb = (CheckBox) convertView.findViewById(R.id.checkBox1); 
      CheckBoxInfo cbi = checkBoxList.get(position); 

       Toast.makeText(MainActivity.this, "position: " + position, Toast.LENGTH_SHORT).show(); 


      tv.setText(cbi.checkBoxName); 

     return convertView; 
    } 

} // end MyAdapter 
    } 

row_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/LinearLayout1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 

<CheckBox 
    android:id="@+id/checkBox1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text=" " /> 

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Large Text" 
    android:textAppearance="?android:attr/textAppearanceLarge" /> 

</LinearLayout> 

risposta

63

scoperto che il problema era ListView era dentro uno ScrollView nel Layout XML, una volta rimosso lo ScrollView esterno tutti gli elementi della ListView presentati.

per qualche motivo se incapsulare un controllo ListView annidati in vari strati che mostrerà un solo elemento posizione se il ListView in all'interno di uno ScrollView

+5

Molto, molto, vero. E purtroppo senza documenti. Grazie. –

+1

Grazie, stava iniziando a farmi impazzire. – Simon

+0

Grande scoperta. Dov'è la documentazione per questo ???? – toobsco42

2

Override getCount nel vostro MyAdapter

public int getCount() { 
    return infoList == null ? 0 : infoList.size(); 
} 
+1

Questo significava davvero essere così? Perché mai sarei costretto a implementare il getCount da solo? Ho passato l'arrayList nel super (...) ?? Inoltre, ho un altro progetto per Android, che ho sviluppato come 1 anno fa ... E poi non c'è bisogno di quella sostituzione ... – Ted

+1

... inoltre, ignorando quel metodo non cambia nulla per me. – Ted

1

Si prega di mostrare il codice di row_layout, penso che il tuo errore è for ciclo:

Prova creare 2 caselle di controllo e aggiungi manuale a tes t:

cbr1 = new CheckBoxInfo(); 
cbr1.checkBoxName = "checkbox1"; 
cbr1.checkBoxState = true; 
cfo.add(cbr1); 

cbr2 = new CheckBoxInfo(); 
cbr2.checkBoxName = "checkbox2"; 
cbr2.checkBoxState = true; 
cfo.add(cbr2); 
1

ho avuto questo problema perché il mio notifyDataSetChanged() era all'interno di un ciclo e non è stato in chiamato in determinate circostanze (se non ci fossero elementi di dati).

Assicurarsi che notifyDataSetChanged() venga chiamato quando dovrebbe essere!

0

android: fillViewport = "true" su ScrollView risolverà il problema.

Problemi correlati