2013-04-08 14 views
17

Ustawiam arrayList na 12 pozycji, jednak arrayAdapter zwraca tylko jeden element na ekranie, dlaczego tak jest? Ma pokazywać 12 pozycji na liście.arrayAdapter zwraca tylko jedną pozycję, 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> 

Odpowiedz

63

okazało się, że problem ListView się wewnątrz Scrollview w układzie xml Raz usunięta zewnętrzna Scrollview wszystkie elementy ListView pojawił.

z jakiegoś powodu, jeśli hermetyzacji ListView zagnieżdżony w kilku warstwach pokaże tylko jeden element sytuacji, gdyby w ListView wewnątrz Scrollview

+5

Bardzo, bardzo, prawda. I niestety nieudokumentowane. Dzięki. –

+1

Dzięki, zacząłem doprowadzać mnie do szału. – Simon

+0

Świetne znalezisko. Gdzie jest dokumentacja tego ???? – toobsco42

2

Zastąp getCount w MyAdapter

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

Czy to naprawdę ma być takie? Dlaczego, na Boga, byłbym zmuszony do wdrożenia getCount? Przekazałem listę tablic w super (...)? Co więcej, mam inny projekt dla systemu Android, który opracowałem jak 1 rok temu ... A potem nie ma potrzeby, aby to przesłonić ... – Ted

+1

... również, przesłonięcie tej metody nie zmienia niczego dla mnie. – Ted

1

Proszę pokazać kodeksu row_layout, myślę, że błąd jest for pętla:

Spróbuj utworzyć 2 checkboxy i dodaj instrukcję do 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

miałem ten problem, ponieważ mój notifyDataSetChanged() był wewnątrz pętli i nie był wywoływana w pewnych okolicznościach (w przypadku braku danych).

Upewnij się, że notifyDataSetChanged() jest wywoływane, kiedy powinno być!

0

android: fillViewport = "true" na ScrollView rozwiąże problem.

Powiązane problemy