Domanda arrayAdapter restituisce solo una posizione, Android


Ho impostato la lista degli array su 12 elementi, tuttavia l'arrayAdapter restituisce solo un elemento sullo schermo, perché è questo? Dovrebbe mostrare 12 articoli sulla lista.

  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>

17
2018-04-08 09:21


origine


risposte:


Ho scoperto che il problema era che ListView era all'interno di una ScrollView nel layout xml, una volta rimossa la ScrollView esterna, apparivano tutti gli elementi di ListView.

per qualche ragione se incapsuli un ListView annidato in più livelli, mostrerà solo un oggetto posizione se il ListView all'interno di ScrollView


63
2018-04-09 06:01



Oltrepassare getCount nel tuo MyAdapter

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

2
2018-04-08 09:22



Si prega di mostrare il codice di row_layout, Penso che il tuo errore sia for ciclo continuo:

Prova a creare 2 caselle di controllo e aggiungi il manuale per testare:

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
2018-04-08 09:25



Ho avuto questo problema perché il mio notifyDataSetChanged() era all'interno di un ciclo e non veniva chiamato in determinate circostanze (se non c'erano elementi di dati).

Assicurarsi notifyDataSetChanged() viene chiamato quando dovrebbe essere!


1
2017-08-22 16:58



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


0
2018-02-13 22:45