0

チームごとに区切られたメンバーを表示するリストビューを実装しています。各メンバーのジョブの重みと、これまでにどれだけ完了したかを表示するプログレスバーがあります。リストは正しく表示されているように見えますが、上下にスクロールすると、進行状況バーが予期せず変更されました。これがコードです。

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;
}
}

コードの修正にご協力いただければ幸いです。私の悪い英語でごめんなさい。

4

1 に答える 1

0

変更してみてください:

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);

に:

memJob=cursor.getInt(cursor.getColumnIndex(DBAdapter.COL_MEMBER_JOB));
memDone=(int)cursor.getInt(cursor.getColumnIndex(DBAdapter.COL_MEMBER_JOB_DONE));
ProgressBar progressBar = (ProgressBar) view.findViewById(R.id.pBar);
progressBar.getLayoutParams().width=(int)(400*memJob/requiredJob);
progressBar.setMax(memJob);
progressBar.setProgress(memDone);

これにより、bindView の内部から実際の進行状況バーが直接取得され、うまくいけば問題が解決するはずです。削除できますholder.pBar=(MyProgressBar)v.findViewById(R.id.pBar); from newView.

于 2012-05-20T19:11:06.433 に答える