0

中に作成された1つのnewView(..)ビューを別のタイプとして追加して、そのビューだけが再利用されないようにすることはできbindView(...)ますか?

これは私のカスタムcursorAdapterがどのように見えるかです:

@Override
public void bindView(View vi, Context arg1, Cursor cursor) {
    priority.setText(cursor.getString(cursor.getColumnIndex(TodoTable.COLUMN_PRIORITY)));TextView timeElapsed =  (TextView)vi.findViewById(R.id.todayTime); //time
    long id = cursor.getLong(cursor.getColumnIndex(TodoTable.COLUMN_ID));

    if(ts.getRunning() == id){
        ts.startTimer(vi, ts.getCurrentTaskStart(), id);
    }else{
        long time = cursor.getLong((cursor.getColumnIndex(TodoTable.COLUMN_TIME)));
        timeElapsed.setText(ts.getTimeString(0, 0, time));
    }
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup arg2) {
    LayoutInflater inflater = LayoutInflater.from(context);
    View vi = inflater.inflate(R.layout.list_item, null);
    bindView(vi, context, cursor);
    return vi;
}

getItemViewTypeを使用して別のタイプに追加しようとしましたgetViewTypeCountが、これは位置のみを処理でき、リストビューの行に関連付けられたIDは処理できません。

ts.getRunning() == id作成時のビューがスクロール時に他の位置で再利用されないようにしたい。どうすればこのようなことができますか?

4

2 に答える 2

2

getViewメソッドをオーバーライドします。CursorAdapter(リンク)のソースコードを見ると、ビューがnullかどうかをチェックする場所がわかります。メソッド全体をコピーし、チェックする場合は追加する必要があります。ts.getRunning() == id

これが今のように見えるはずです-

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 || ts.getRunning() == id) {
        v = newView(mContext, mCursor, parent);
    } else {
        v = convertView;
    }
    bindView(v, mContext, mCursor);
    return v;
}

ありがたいことに、そのメソッドで使用されるすべてのフィールドが保護されているように見えるので、問題が発生することはありません。

于 2012-12-30T14:47:37.183 に答える
2

特定の位置でのビューの再利用を防ぎたい場合は、次のようにします

@Override
public int getItemViewType(int position) {
    mCursor.moveToPosition(position);
    if (mCursor.getLong(mCursor.getColumnIndex(TodoTable.COLUMN_ID)) == ts.getRunning()){
        return IGNORE_ITEM_VIEW_TYPE;
    }
    return super.getItemViewType(position);
}

戻っIGNORE_ITEM_VIEW_TYPEた場合getItemViewType(position)、その位置のビューはリサイクルされません。詳細IGNORE_ITEM_VIEW_TYPEこちら

于 2012-12-30T15:02:18.457 に答える