我想根据用户的操作在列表视图中的某个位置刷新项目,但无法获得正确的视图。
我使用扩展的CursorAdapter作为我的列表,所以getView函数如下所示。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LogUtils.LOGD("GETVIEW CALLED", mGetView+"");
LogUtils.LOGD("position ", position+"");
mGetView++;
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);
}
Model model = QueryHelper.getModelFromCursor(mCursor);
View v;
if (convertView == null) {
v = newView(mContext, model, parent);
} else {
v = convertView;
}
bindView(v, mContext, model);
long id = model.getId();
idToViewMap.put(id,v);
idToPositionMap.put(id,mCursor.getPosition());
return v;
}
在以下功能中,返回的视图错误,它位于正确位置下方的3个项目。我想它与转换视图有关,但我不确定。任何的想法?感谢。
public void flashItemDelay(Context context, String sId){
Toast.makeText(context, sId, Toast.LENGTH_LONG).show();
final Long id = Long.parseLong(sId);
int pos = mAdapter.getPositionByItemId(id);//correct position
mListView.smoothScrollToPosition(pos); //works well
Handler transitionHandler = new Handler();
transitionHandler.postDelayed(new Runnable() {
@Override
public void run() {
View view = mAdapter.getViewByItemId(id);//WRONG view
TransitionDrawable transition = (TransitionDrawable) view.getBackground();
transition.startTransition(500);
transition.reverseTransition(500);
}
}, 200);
}
答案 0 :(得分:0)
在ListViews
中,我们的想法是对基础数据进行更改,并让适配器反映视图上的更改。您不应该尝试查找视图,而应该对数据模型进行更改并在适配器上处理它以反映视图上的结果。
例如,您可以在Model类中添加布尔标志shouldFlash
,并在适配器数据中将其设置在要闪存的项目上。在getView()
方法中,您可以检查它并刷新视图(在您的情况下,您还应该立即重置shouldFlash
标记。)。
这里的关键是通知视图已刷新基础数据。在ArrayAdapter
中,这是notifyDataSetChanged()
方法,而CursorAdapter
的对应方式是changeCursor()
或swapCursor()
。