リストビューの行数が5以上の場合、問題は次のようになります。 ロードがスクロールしたときに画面に表示される行が18行あります。 1,2,3 、4,5,6,7,8,9,10、、、、11、、、、 私はせずにそれを行う場合ViewHolderはすべてうまくいきますが、いつも新しいビューを作成していて、このビューを作成する必要があるため、すべてのEditTextがなくなりました将来は40行。 コード:ListViewのリサイクルメカニズムとViewHolderの競合
@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;
}
これは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
[email protected]0
[email protected]0
[email protected]0
[email protected]0
[email protected]0
[email protected]8
[email protected]0
私はいくつかの理由でnullでない行10 convertViewから理解し、それは私に1,2,3,4のオブジェクトを返すだと... WHY ?
これはViewHolderクラスです:私は、ビューの配列を作成することができ、その後、位置take'emによってそこからが、それは間違っているソリューションです
public static class ViewHolder {
TextView textView;
TextView textView2;
EditText editText;
EditText editText2;
Spinner spinner;
CheckBox checkBox;
}
と私が行目に見えない行からconvertViewがnullである理由を理解したいです ありがとうございました。
であればかもしれ場合は私に知らせてください。私は[RecyclerView](http://developer.android.com/intl/es/reference/android/support/v7/widget/RecyclerView.html)をお勧めします。それはあなたのためのすべてのリサイクルの世話をし、お勧めの方法です。 – Naveed
そしてクラスマッチング用の列挙型または定数を使用しないでください – drulabs
drulabs配列から行への転送データにclassを使用します。列挙型ではありませんarrayRows.add(new RowTextViewEditTextSpinner(new String [] {"company"}、this.getString(R。 string.company_name)、this.getString(R.string.or_type_company_name_here)、arrayCompanies、 ""、arrayCompanies.get(0)、0)); – adamofsky