チームごとに区切られたメンバーを表示するリストビューを実装しています。各メンバーのジョブの重みと、これまでにどれだけ完了したかを表示するプログレスバーがあります。リストは正しく表示されているように見えますが、上下にスクロールすると、進行状況バーが予期せず変更されました。これがコードです。
public class MyCursorAdapter extends CursorAdapter{
private static final int STATE_UNKNOWN = 0;
private int requiredJob;
private static final int STATE_SECTIONED_CELL = 1;
private static final int STATE_REGULAR_CELL = 2;
private int[] mCellStates;
public MyCursorAdapter(Context context, Cursor cursor, int requiredJob) {
super(context, cursor);
mCellStates = cursor == null ? null : new int[cursor.getCount()];
this.requiredJob=requiredJob;
}
@Override
public void changeCursor(Cursor cursor) {
super.changeCursor(cursor);
mCellStates = cursor == null ? null : new int[cursor.getCount()];
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
int memJob, memDone;
final ViewHolder holder= (ViewHolder)view.getTag();
boolean needSeparator = false;
final int position = cursor.getPosition();
String team= cursor.getString(cursor.getColumnIndex(DBAdapter.COL_TEAM));
switch (mCellStates[position]) {
case STATE_SECTIONED_CELL:
needSeparator = true;
break;
case STATE_REGULAR_CELL:
needSeparator = false;
break;
case STATE_UNKNOWN:
default:
if (position == 0) {
needSeparator = true;
} else {
cursor.moveToPosition(position-1);
String str=cursor.getString(cursor.getColumnIndex(DBAdapter.COL_TEAM));
if(!str.equalsIgnoreCase(String.valueOf(team))) {
needSeparator=true;
}
cursor.moveToPosition(position);
}
mCellStates[position] = needSeparator ? STATE_SECTIONED_CELL : STATE_REGULAR_CELL;
break;
}
if (needSeparator) {
holder.separator.setText(team);
holder.separator.setVisibility(View.VISIBLE);
} else{
holder.separator.setVisibility(View.GONE);
}
holder.member.setText(cursor.getString(cursor.getColumnIndex(DBAdapter.COL_MEMBER)));
memJob=cursor.getInt(cursor.getColumnIndex(DBAdapter.COL_MEMBER_JOB));
memDone=(int)cursor.getInt(cursor.getColumnIndex(DBAdapter.COL_MEMBER_JOB_DONE));
holder.pBar.getLayoutParams().width=(int)(400*memJob/requiredJob);
holder.pBar.setMax(memJob);
holder.pBar.setProgress(memDone);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View v=LayoutInflater.from(context).inflate(R.layout.row, parent, false);
ViewHolder holder= new ViewHolder();
holder.separator=(TextView)v.findViewById(R.id.sep_team);
holder.member=(TextView)v.findViewById(R.id.member);
holder.pBar=(MyProgressBar)v.findViewById(R.id.pBar);
v.setTag(holder);
return v;
}
}
コードの修正にご協力いただければ幸いです。私の悪い英語でごめんなさい。