是否可以将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
将其添加到其他类型,但这只能处理位置,而不能处理与listview行相关联的ID。
我希望在滚动时阻止创建时ts.getRunning() == id
的视图在其他位置重复使用。我该怎么办?
答案 0 :(得分:2)
覆盖getView方法。如果查看CursorAdapter(link)的源代码,您将看到一个检查视图是否为空的位置。您只需复制整个方法,并添加一个额外的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;
}
幸运的是,看起来该方法中使用的所有字段都受到保护,因此您不应遇到任何问题。
答案 1 :(得分: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
的更多信息,请here