ArrayAdapterをオーバーライドするとき、次のようなパターンを使用して正しいことがわかります。
if(view != null){
...create new view setting fields from data
}else
return view; //reuse view
cursorAdaptersでこのパターンを使用することも正しいですか?私の問題は、カーソルフィールドに応じて赤または青のテキストカラーがあるため、青い色を必要とするフィールドがあるセルの赤い色のようなエラーが発生しないようにすることです。私のbindViewコードは次のようなものです:
if(c.getString(2).equals("red"))
textView.setTextColor(<red here>);
else
textView.setTextColor(<blue here>);
ビューを再利用する場合、赤が赤になり、青が青になることを確認できますか?
CursorAdapter
では、newView
でレイアウトを取得し、bindView
でデータをバインドします。 CursorAdapter
はすでにgetView
でパターンを再利用しているので、再度実行する必要はありません。以下は、元のgetView
ソースコードです。
public View getView(int position, View convertView, ViewGroup parent) {
if (!mDataValid) {
throw new IllegalStateException("this should only be called when the cursor is valid");
}
if (!mCursor.moveToPosition(position)) {
throw new IllegalStateException("couldn't move cursor to position " + position);
}
View v;
if (convertView == null) {
v = newView(mContext, mCursor, parent);
} else {
v = convertView;
}
bindView(v, mContext, mCursor);
return v;
}
ViewHolder Pattern
を使用してさらに最適化する場合は、次に例を示します。newView
でタグを作成し、bindView
で取得します。
public class TimeListAdapter extends CursorAdapter {
private LayoutInflater inflater;
private static class ViewHolder {
int nameIndex;
int timeIndex;
TextView name;
TextView time;
}
public TimeListAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
ViewHolder holder = (ViewHolder) view.getTag();
holder.name.setText(cursor.getString(holder.nameIndex));
holder.time.setText(cursor.getString(holder.timeIndex));
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup
p parent) {
View view = inflater.inflate(R.layout.time_row, null);
ViewHolder holder = new ViewHolder();
holder.name = (TextView) view.findViewById(R.id.task_name);
holder.time = (TextView) view.findViewById(R.id.task_time);
holder.nameIndex = cursor.getColumnIndexOrThrow
(TaskProvider.Task.NAME);
holder.timeIndex = cursor.getColumnIndexOrThrow
(TaskProvider.Task.DATE);
view.setTag(holder);
return view;
}
}
はい、getView
はAdapter
にあり、ArrayAdapter
にもCursorAdapter
にも依存していません。
リサイクルは常に良い習慣です。コードがあらゆる状況で色を設定することを確認してください。