Ich habe eine ListView mit 5+ Arten von Ansichten in Zeilen, das Problem ist: Ich habe 18 Zeilen 10 ist auf dem Bildschirm sichtbar, wenn ich scroll es ist load: 1,2,3 , 4,5,6,7,8,9,10, , , 3, 11, 4 , , 6, 7 Wenn ich tun es ohne ViewHolder alles funktioniert gut, aber alle meine EditText ist weg, weil es neue Ansicht jedes Mal erstellt und ich muss diese Ansicht mit erstellen 40 Zeilen in Zukunft. Der Code:ListViews Recycling-Mechanismus und ViewHolder Konflikt
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Row row = arrayRows.get(position);
if (convertView==null) {
Log.i("LOG", "convertView == null");
LayoutInflater inflater = (LayoutInflater) this.context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//setting view holder
ViewHolder viewHolder = new ViewHolder();
//build rows
if (row.getClass() == RowTextViewEditText.class) {
convertView = inflater.inflate(R.layout.row_textview_edittext, null);
viewHolder.textView = (TextView) convertView.findViewById(R.id.textViewRowTextViewEditText);
viewHolder.editText = (EditText) convertView.findViewById(R.id.editTextRowTextViewEditText);
RowTextViewEditText rowTextViewEditText = (RowTextViewEditText) row;
viewHolder.textView.setText(rowTextViewEditText.textViewText);
viewHolder.editText.setHint(rowTextViewEditText.hint);
viewHolder.editText.setText(rowTextViewEditText.editTextText);
convertView.setTag(viewHolder);
}
if (row.getClass() == RowTextViewEditTextTextViewEditText.class) {
convertView = inflater.inflate(R.layout.row_textview_edittext_textview_edittext, null);
viewHolder.editText = (EditText) convertView.findViewById(R.id.editTextRowTextViewEditTextTextViewEditText);
viewHolder.editText2 = (EditText) convertView.findViewById(R.id.editText2RowTextViewEditTextTextViewEditText);
viewHolder.textView = (TextView) convertView.findViewById(R.id.textViewRowTextViewEditTextTextViewEditText);
viewHolder.textView2 = (TextView) convertView.findViewById(R.id.textView2RowTextViewEditTextTextViewEditText);
RowTextViewEditTextTextViewEditText rowEditTextEditText = (RowTextViewEditTextTextViewEditText) row;
viewHolder.textView.setText(rowEditTextEditText.textViewText);
viewHolder.textView2.setText(rowEditTextEditText.textViewText2);
viewHolder.editText.setText(rowEditTextEditText.editTextText);
viewHolder.editText2.setText(rowEditTextEditText.editTextText2);
convertView.setTag(viewHolder);
}
}
//I have at least 5 types of rows
else{
viewHolder = (ViewHolder)convertView.getTag();
Log.i("LOG", "convertView=" + convertView.getTag());
}
return convertView;
}
Dies ist Logcat:
convertView == null
convertView == null
convertView == null
convertView == null
convertView == null
convertView == null
convertView == null
convertView == null
convertView == null
convertView == null
convertView == null
convertView == null
convertVi[email protected]
[email protected]0
[email protected]0
[email protected]0
[email protected]0
[email protected]8
[email protected]0
Wie ich aus Reihe 10 convertView nicht null aus irgendeinem Grund zu verstehen, und es ist mir Objekte von 1,2,3,4 zurückkehren .. WARUM ?
Dies ist die ViewHolder Klasse:
public static class ViewHolder {
TextView textView;
TextView textView2;
EditText editText;
EditText editText2;
Spinner spinner;
CheckBox checkBox;
}
ich eine Reihe von Ansichten und dann von Position take'em von dort schaffen kann, aber es ist falsch Lösung, und ich will verstehen, warum convertView von Zeile unsichtbar Reihe null ist Danke für den Rat.
Bevor Sie versuchen, die Listenansicht und Ansicht Halter zu lernen. Ich würde das [RecyclerView] (http://developer.android.com/intl/es/reference/android/support/v7/widget/RecyclerView.html) empfehlen. Es kümmert sich um das gesamte Recycling für Sie und ist der empfohlene Weg. – Naveed
Und bitte verwenden Sie keine Klassenübereinstimmungen verwenden enum oder Konstanten – drulabs
drulabs ich benutze Klasse für die Übertragung von Daten von Array zu Zeile nicht für enum arrayRows.add (neue StringTextViewEditTextSpinner (new String [] {"Firma"}, this.getString (R. string.company_name), this.getString (R.string.or_type_company_name_here), arrayCompanies, "", arrayCompanies.get (0), 0)); – adamofsky