我尝试在ListView中为新项目制作动画.我有稳定的id-s,所以我确切知道要动画的元素.问题来自ListView的循环机制.当我知道我有一个最近插入的元素时,我在视图上调用startAnimation.但随后,视图得到了回收,充满了不同的数据.
它会在UI上为错误的行设置动画.在某些时候,视图持有正确的数据,但随后被回收.我通过logcat证实了这一点.
有什么方法可以解决这个问题吗?
它会在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,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,cursor); return view; }
解决方法
在自定义适配器的getView方法中为每个添加的元素设置动画.
public View getView(int position,View convertView,ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater) getActivity() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.simple_list_item_1,null); } ListData o = list.get(position); TextView tt = (TextView) v.findViewById(R.id.toptext); tt.setText(o.content); Log.d("ListTest","Position : "+position); if(flag == false) { Animation animation = AnimationUtils.loadAnimation(getActivity(),R.anim.slide_top_to_bottom); v.startAnimation(animation); } return v; }
从而实现动画.