Android 滚动后 ListView 项目动画
Android ListView Item animates after scrolling
我的问题:
在我开始滚动后,我的 ListView 中的一个项目会进行动画处理。这不是最后一项,动画应该完成。一旦问题消失,我滚动后,它只发生一次,并且发生在列表中的一个项目上。
如何在我开始滚动 ListView 后停止单个项目的动画?
我希望 动画只在将项目添加到适配器时 运行 一次。
我有一个列表适配器,我在其中对添加到列表中的项目进行动画处理。我正在使用声明的动画师在适配器的 getView() 方法中从左侧滑入项目。这是应用动画的 getView() 方法。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
String listItemText = mList.get(position);
ViewHolder holder = null;
if (convertView == null) {
LayoutInflater li = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = li.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.mListItemText = (TextView) convertView.findViewById(R.id.progress_title);
Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.slide_in_left);
convertView.startAnimation(animation);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.mListItemText.setText(listItemText);
return convertView;
}
private static class ViewHolder {
public TextView mListItemText;
}
列表第一次尝试建立行时,convertView 为空。
所以你的动画只在第一次和第一项开始。
您想要的是为项目设置动画,例如,如果标志设置为 true。
一个例子:
要检查一个项目是否是新的,我会这样做:
public void initList() {
/* Change your mList to get Bundle instead of String */
mList = new ArrayList<Bundle>();
}
/* When you add an item you will put a bundle with your string and a flag that tell the item is new */
public void addItem(String item) {
Bundle bundle = new Bundle();
bundle.putString("string", item);
bundle.putBoolean("new", true);
mList.add(bundle);
}
现在检查对象是否是新的:
public View getView(int position, View convertView, ViewGroup parent) {
Bundle item = mList.get(position);
ViewHolder holder = null;
if (convertView == null) {
LayoutInflater li = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = li.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.mListItemText = (TextView) convertView.findViewById(R.id.progress_title);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.mListItemText.setText(item.getString("string"));
if(item.getBoolean("new") == true) {
Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.slide_in_left);
convertView.startAnimation(animation);
item.setBoolean("new", false);
}
return convertView;
}
我的问题: 在我开始滚动后,我的 ListView 中的一个项目会进行动画处理。这不是最后一项,动画应该完成。一旦问题消失,我滚动后,它只发生一次,并且发生在列表中的一个项目上。
如何在我开始滚动 ListView 后停止单个项目的动画?
我希望 动画只在将项目添加到适配器时 运行 一次。
我有一个列表适配器,我在其中对添加到列表中的项目进行动画处理。我正在使用声明的动画师在适配器的 getView() 方法中从左侧滑入项目。这是应用动画的 getView() 方法。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
String listItemText = mList.get(position);
ViewHolder holder = null;
if (convertView == null) {
LayoutInflater li = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = li.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.mListItemText = (TextView) convertView.findViewById(R.id.progress_title);
Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.slide_in_left);
convertView.startAnimation(animation);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.mListItemText.setText(listItemText);
return convertView;
}
private static class ViewHolder {
public TextView mListItemText;
}
列表第一次尝试建立行时,convertView 为空。 所以你的动画只在第一次和第一项开始。
您想要的是为项目设置动画,例如,如果标志设置为 true。
一个例子:
要检查一个项目是否是新的,我会这样做:
public void initList() {
/* Change your mList to get Bundle instead of String */
mList = new ArrayList<Bundle>();
}
/* When you add an item you will put a bundle with your string and a flag that tell the item is new */
public void addItem(String item) {
Bundle bundle = new Bundle();
bundle.putString("string", item);
bundle.putBoolean("new", true);
mList.add(bundle);
}
现在检查对象是否是新的:
public View getView(int position, View convertView, ViewGroup parent) {
Bundle item = mList.get(position);
ViewHolder holder = null;
if (convertView == null) {
LayoutInflater li = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = li.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.mListItemText = (TextView) convertView.findViewById(R.id.progress_title);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.mListItemText.setText(item.getString("string"));
if(item.getBoolean("new") == true) {
Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.slide_in_left);
convertView.startAnimation(animation);
item.setBoolean("new", false);
}
return convertView;
}