0

リストビューの行数が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である理由を理解したいです ありがとうございました。

+2

であればかもしれ場合は私に知らせてください。私は[RecyclerView](http://developer.android.com/intl/es/reference/android/support/v7/widget/RecyclerView.html)をお勧めします。それはあなたのためのすべてのリサイクルの世話をし、お勧めの方法です。 – Naveed

+0

そしてクラスマッチング用の列挙型または定数を使用しないでください – drulabs

+0

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

答えて

1

まず:

ListView(ならびに他のすべてのAdapterView S)が「行タイプ」としてのより良い考えである「ビュータイプ」の概念を有しています。行を区別するには、getItemViewType()getViewTypeCount()を使用する必要があります。これにより、getView()を呼び出すときにListViewが適切な行レイアウトをリサイクルすることができます。

getView()の中にgetItemViewType()を使用して、どの種類の列を膨張(またはリサイクル)しているのかを判断するのはよくあることです。ビューの型を正しく使用する場合は、これらのクラスを作成する必要はありません。

通常、各ビュータイプには独自のViewHolderがあります。さまざまなビュータイプに同じViewHolderクラスを使用すると、混乱することがあります。

第二:

getView()呼び出しの順序についての仮定を作ることはありません。 ListViewはさまざまな理由でこのメソッドをさまざまな時点で呼び出すことができます。ポジションを増減する順序で呼び出すことができます。ビューを表示することを計画していなくても、それを測定に使用するだけではありません。

第三:他の人が示唆したように

、あなたがRecyclerView代わりのListViewを使用することを検討すべきです。また、異なるビュータイプをサポートしており、ViewHolderパターンは設計によって適用されます。


ListViewの理解を深めるため、The World of ListViewというビデオを参照します。 RecyclerViewを使用する予定がある場合でも、このビデオの原則は引き続き適用されます。

0

[OK]を、多くの人が私のコードでロジックの一部を理解していないように見えるので、私はそれを説明し、自分の質問に答えるより。 クラスの使用は、列挙型または検出行型ではなく、アダプターでの行の転送およびデータの取得用です。すべての行は異なる変数を持っていると私は行であり、例えば行からそれらを得るよりも、それらを設定する必要があります。

class RowTextViewEditTextCheckBox extends Row{ 
String textViewText; //for set text:name 
String hint; //for set text: please type name here 
String checkBoxTitle; //for set checkBoxTitle 
String editTextText; // for get text after user will fill the field 
boolean checkBoxChecked; //for get result of checkbox when user will check it} 

ので、私は戻って、質問に今、アレイ

arrayRows.add(new RowTextViewEditTextCheckBox(new String[]{"amounts"},this.getString(R.string.burglary),this.getString(R.string.content),this.getString(R.string.amount),"",false)); 

にこのオブジェクトを送信します。 このlinkは、すべての間違った型にViewHolderから取らcontentViewsを見ていないのはなぜ私のミス私はListViewの

で「ビュータイプ」へのポイントのKarakuriへ 感謝を理解するために私を助け必要なタイプの新しいcontentViewを作成しますか?

リストビューは行の型を検出しています。この型がすでに作成されていて、彼がリサイクラに入っている場合、新しいcontentViewを作成していません。同じタイプのリサイクラからcontentViewを返します。

なぜ彼は間違ったタイプを返すのですか?

彼はデフォルトで何行の行があるかわからないので、1種類です。 getViewTypeCount()では、ビュータイプの数を設定する必要があります。

何か間違っていることが分かっている場合は、お知らせください。 これは魔法のように動作し、新しいコードです:

@Override 
public int getItemViewType(int position) { 
    Row row = arrayRows.get(position); 
    if (row.getClass()==RowTextViewEditTextSpinner.class){ 
     return 0; 
    } 
    if (row.getClass()==RowTextViewEditTextTextViewEditText.class){ 
     return 1; 
    } 
    if (row.getClass()==RowTextViewEditTextCheckBox.class){ 
     return 2; 
    } 
    if (row.getClass()==RowTextViewEditText.class){ 
     return 3; 
    } 
    if (row.getClass()==RowEditText.class){ 
     return 4; 
    } 
    if (row.getClass()==RowTextView.class){ 
     return 5; 
    } 
    else { 
     return 5; 
    } 
} 
@Override 
public int getViewTypeCount() { 
    return 6;//if types creates by code may be here some logic of counting 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    Row row = arrayRows.get(position); 
    int type = getItemViewType(position); 

    //setting view holders 
    ViewHolderTextViewEditTextSpinner viewHolderTextViewEditTextSpinner; 
    ViewHolderTextViewEditTextTextViewEditText viewHolderTextViewEditTextTextViewEditText; 

    //build rows 
    switch (type){ 
     case TEXTVIEW_EDITTEXT_SPINNER: 
      if (convertView==null){ 
       convertView = inflater.inflate(R.layout.row_textview_edittext_spinner, parent, false); 
       viewHolderTextViewEditTextSpinner = new ViewHolderTextViewEditTextSpinner(); 
       viewHolderTextViewEditTextSpinner.textView = (TextView) convertView.findViewById(R.id.textViewRowTextViewEditTextSpinner); 
       viewHolderTextViewEditTextSpinner.editText = (EditText) convertView.findViewById(R.id.editTextRowTextViewEditTextSpinner); 
       viewHolderTextViewEditTextSpinner.spinner = (Spinner) convertView.findViewById(R.id.spinnerRowTextViewEditTextSpinner); 
       convertView.setTag(viewHolderTextViewEditTextSpinner); 
      } 
      else { 
       viewHolderTextViewEditTextSpinner = (ViewHolderTextViewEditTextSpinner)convertView.getTag(); 
      } 
      final RowTextViewEditTextSpinner rowEditTextSpinner = (RowTextViewEditTextSpinner)row; 
      ArrayAdapter<String> dataAdapter = new ArrayAdapter<>(context, android.R.layout.simple_spinner_item, rowEditTextSpinner.spinnerStrings); 
      viewHolderTextViewEditTextSpinner.textView.setText(rowEditTextSpinner.textViewText); 
      viewHolderTextViewEditTextSpinner.editText.setHint(rowEditTextSpinner.hint); 
      viewHolderTextViewEditTextSpinner.editText.setText(rowEditTextSpinner.editTextText); 
      viewHolderTextViewEditTextSpinner.spinner.setAdapter(dataAdapter); 
      viewHolderTextViewEditTextSpinner.spinner.setSelection(rowEditTextSpinner.spinnerSelectedPosition); 
      break; 
     case TEXTVIEW_EDITTEXT_TEXTVIEW_EDITTEXT: 
      if (convertView==null){ 
       convertView = inflater.inflate(R.layout.row_textview_edittext_textview_edittext, parent, false); 
       viewHolderTextViewEditTextTextViewEditText = new ViewHolderTextViewEditTextTextViewEditText(); 
       viewHolderTextViewEditTextTextViewEditText.editText = (EditText) convertView.findViewById(R.id.editTextRowTextViewEditTextTextViewEditText); 
       viewHolderTextViewEditTextTextViewEditText.editText2 = (EditText) convertView.findViewById(R.id.editText2RowTextViewEditTextTextViewEditText); 
       viewHolderTextViewEditTextTextViewEditText.textView = (TextView) convertView.findViewById(R.id.textViewRowTextViewEditTextTextViewEditText); 
       viewHolderTextViewEditTextTextViewEditText.textView2 = (TextView) convertView.findViewById(R.id.textView2RowTextViewEditTextTextViewEditText); 
       convertView.setTag(viewHolderTextViewEditTextTextViewEditText); 
      } 
      else { 
       viewHolderTextViewEditTextTextViewEditText = (ViewHolderTextViewEditTextTextViewEditText)convertView.getTag(); 
      } 
      RowTextViewEditTextTextViewEditText rowEditTextEditText = (RowTextViewEditTextTextViewEditText)row; 
      viewHolderTextViewEditTextTextViewEditText.textView.setText(rowEditTextEditText.textViewText); 
      viewHolderTextViewEditTextTextViewEditText.textView2.setText(rowEditTextEditText.textViewText2); 
      viewHolderTextViewEditTextTextViewEditText.editText.setText(rowEditTextEditText.editTextText); 
      viewHolderTextViewEditTextTextViewEditText.editText2.setText(rowEditTextEditText.editTextText2); 
      break; 

    } 
    return convertView; 
} 

    static public class ViewHolderTextViewEditTextSpinner{ 
    TextView textView; 
    EditText editText; 
    Spinner spinner; 
} 
static public class ViewHolderTextViewEditTextTextViewEditText{ 
    TextView textView; 
    TextView textView2; 
    EditText editText; 
    EditText editText2; 
} 
static public class ViewHolderTextViewEditTextCheckBox{ 
    TextView textView; 
    EditText editText; 
    CheckBox checkBox; 
} 
static public class ViewHolderTextViewEditText{ 
    TextView textView; 
    EditText editText; 
} 
static public class ViewHolderEditText{ 
    EditText editText; 
} 
static public class ViewHolderTextView{ 
    TextView textView; 
} 

より良い解決したり、リストビューとビューホルダーを学ぼうとする前に、これは間違った解決策