2017-05-03 23 views
0

AdapterViewHolderのユーティリティはなんですか?カスタムアダプタでのViewHolderのユーティリティ

私はViewHolderを使用してAdapterを作成しましたが、これ以外のものは使用していません。これと同じ結果が得られます...これはどのようなユーティリティですか?


これはViewHolderと私のCustomAdapter.classです:

public class CustomAdapter extends ArrayAdapter<Fruit> { 

    public class ViewHolder { 
     TextView txtName; 
     TextView txtColor; 
    } 

    CustomAdapter(Context context, ArrayList<Fruit> data) { 
     super(context, R.layout.item_fruit, data); 
    } 

    @NonNull 
    @Override 
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 

     final Fruit fruit = getItem(position); 

     ViewHolder viewHolder = new ViewHolder(); 

     if (convertView == null) { 
      LayoutInflater inflater = LayoutInflater.from(getContext()); 
      convertView = inflater.inflate(R.layout.item_fruit, parent, false); 
     } 

     viewHolder.txtName = (TextView) convertView.findViewById(R.id.textView_fruit_name); 
     viewHolder.txtColor = (TextView) convertView.findViewById(R.id.textView_fruit_color); 

     if (fruit != null) { 
      viewHolder.txtName.setText(fruit.getName()); 
      viewHolder.txtColor.setText(fruit.getColor()); 
     } 

     return convertView; 
    } 
} 

これはViewHolderせずに私のCustomAdapter.classです:

public class CustomAdapter extends ArrayAdapter<Fruit> { 

    CustomAdapter(Context context, ArrayList<Fruit> data) { 
     super(context, R.layout.item_fruit, data); 
    } 

    @NonNull 
    @Override 
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 

     final Fruit fruit = getItem(position); 

     if (convertView == null) { 
      LayoutInflater inflater = LayoutInflater.from(getContext()); 
      convertView = inflater.inflate(R.layout.item_fruit, parent, false); 
     } 

     TextView txtName = (TextView) convertView.findViewById(R.id.textView_fruit_name); 
     TextView txtColor = (TextView) convertView.findViewById(R.id.textView_fruit_color); 

     if (fruit != null) { 
      txtName.setText(fruit.getName()); 
      txtColor.setText(fruit.getColor()); 
     } 

     return convertView; 
    } 
} 
+0

ビューホルダーパターンを正しく使用していません。ビューホルダーとビューを 'if(convertView == null)'ブロック内で初期化し、 'setTag'と' getTag'を使用してviewHolderを取得する必要があります – akash93

+0

ここにあなたの質問に対する解答があります
[Link] ://stackoverflow.com/questions/21501316/what-is-the-benefit-of-viewholder) –

答えて

1

findViewById()を呼び出す

private class ViewHolder { 
    public TextView txtName; 
    public TextView txtColor; 

    public ViewHolder(View view) { 
     txtName = (TextView) view.findViewById(R.id.txt_name); 
     txtColor = (TextView) view.findViewById(R.id.txt_color); 
    } 
} 

getView()をコールするたびに、あなたの意見でそれを呼び出して、高価である:ような何かがします

@NonNull 
@Override 
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 

    final Fruit fruit = getItem(position); 

    if (convertView == null) { 
     LayoutInflater inflater = LayoutInflater.from(getContext()); 
     convertView = inflater.inflate(R.layout.item_fruit, parent, false); 
     convertView.setTag(new ViewHolder(convertView)); 
    } 

    ViewHolder viewHolder = (ViewHolder) convertView.getTag(); 

    viewHolder.txtName = (TextView) convertView.findViewById(R.id.textView_fruit_name); 
    viewHolder.txtColor = (TextView) convertView.findViewById(R.id.textView_fruit_color); 

    if (fruit != null) { 
     viewHolder.txtName.setText(fruit.getName()); 
     viewHolder.txtColor.setText(fruit.getColor()); 
    } 

    return convertView; 
} 

そして、あなたのViewHolderViewHolder正しく、あなたのような何かにあなたのコードを変更する必要が使用多くの時間を無駄にするでしょう。

ViewHolderを使用しての唯一の利点は、ビューが再利用されているときconvertViewnullではない場合、すなわち、findViewById()を呼び出していないことで時間を節約することです。

+0

ありがとうございますが、convertView.setTag(new ViewHolder(convertView)); ViewHolderのViewHolder()を(android.view.View)に適用できません –

+1

更新された答えをチェックして、 'ViewHolder'の書き方を確認してください。 –