【发布时间】:2011-08-14 06:47:54
【问题描述】:
我尝试在我的 ListView 中为新项目设置动画。我有稳定的 id-s,所以我确切地知道要为哪个元素设置动画。问题来自ListView的回收机制。当我知道我有一个最近插入的元素时,我在视图上调用 startAnimation。但随后,视图被回收,填充了不同的数据。 它会导致 UI 动画错误的行。在某些时候,视图持有正确的数据,但随后被回收。我通过 logcat 确认了这一点。 有没有办法解决这个问题?
编辑:
public ExpensCursorAdapter(Context context, Cursor c, boolean autoRequery,
CopyOnWriteArraySet<String> fadeAnimateTags) {
super(context, c, autoRequery);
this.mFadeAnimTags = fadeAnimateTags;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
setup(view, context, cursor);
}
private void setup(View view, Context context, Cursor cursor) {
final String id = cursor.getString(4);
if (LOCAL_LOGV) Log.v(TAG, String.format("Create item for %s. Received view: %s", id, view.toString()));
view.setTag(id);
final TextView dateText = (TextView) view.findViewById(R.id.date);
final TextView timeText = (TextView) view.findViewById(R.id.time);
final TextView title = (TextView) view.findViewById(R.id.title);
final TextView amount = (TextView) view.findViewById(R.id.amount);
final Date date = new Date(cursor.getLong(0));
title.setText(cursor.getString(1));
dateText.setText(dFormat.format(date));
timeText.setText(tFormat.format(date));
amount.setText(String.format("%d Ft", cursor.getInt(2)));
if (cursor.getInt(3) == 1) {
timeText.setTextColor(Color.LTGRAY);
title.setTextColor(Color.LTGRAY);
dateText.setTextColor(Color.LTGRAY);
amount.setTextColor(Color.LTGRAY);
} else {
timeText.setTextColor(Color.BLACK);
title.setTextColor(Color.BLACK);
dateText.setTextColor(Color.BLACK);
amount.setTextColor(Color.BLACK);
}
if (mFadeAnimTags.contains(id)) {
view.setAnimation(AnimationUtils.loadAnimation(context, R.anim.fade));
mFadeAnimTags.remove(id);
}
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
final LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.expense_list_item, parent, false);
setup(view, context, cursor);
return view;
}
【问题讨论】:
-
你从哪里开始动画?我觉得应该在Adapter的getView()方法上。
-
我确实从那里开始。添加到问题中的代码。
-
您是否尝试在每次“设置”行时创建新的动画对象?可能是因为您使用的是静态方法,它总是引用相同的动画,并且从一行更改为另一行。
-
我每次都创建一个新动画。在第一个之后我不会看到任何东西,如果它一直是一样的。它不是。问题是由于视图回收,我设置动画的视图持有不同的数据。
-
问题解决了吗?我有与 bindView 和 newView 相同的代码,以及由视图回收引起的相同问题,每行都有一个倒计时 textView 而不是你的动画:(请帮助!