example - listview android
arrayAdapter solo devuelve una posiciĆ³n, Android (5)
Configuré el arrayList a 12 elementos, sin embargo, el arrayAdapter solo devuelve un elemento en la pantalla, ¿por qué sucede esto? Se supone que debe mostrar 12 elementos en la 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>
Anular getCount
en su MyAdapter
public int getCount() {
return infoList == null ? 0 : infoList.size();
}
Por favor, muestre el código de row_layout
, creo que su error es for
bucle:
Intente crear 2 casillas de verificación y agregue un manual para probar:
cbr1 = new CheckBoxInfo();
cbr1.checkBoxName = "checkbox1";
cbr1.checkBoxState = true;
cfo.add(cbr1);
cbr2 = new CheckBoxInfo();
cbr2.checkBoxName = "checkbox2";
cbr2.checkBoxState = true;
cfo.add(cbr2);
Tuve este problema porque mi notifyDataSetChanged()
estaba dentro de un bucle y no fue llamado en ciertas circunstancias (si no hubiera elementos de datos).
¡Asegúrate de que notifyDataSetChanged()
cuando debería ser!
android: fillViewport = "true" en ScrollView resolverá el problema.
descubrí que el problema era que el ListView estaba dentro de un ScrollView en el diseño xml, una vez que quité el ScrollView externo, todos los elementos del ListView aparecieron.
por alguna razón, si encapsula un ListView anidado en varias capas, solo mostrará un elemento de posición si el ListView está dentro de un ScrollView