【问题标题】:Android ListView Item animates after scrollingAndroid ListView Item 滚动后动画
【发布时间】:2015-02-03 10:49:36
【问题描述】:

我的问题: 我开始滚动后,我的 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;

}

【问题讨论】:

标签: android android-listview android-animation


【解决方案1】:

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;
}

【讨论】:

  • 这大大改善了这种情况。现在,当我滚动所有以前不在屏幕上的项目时,就会出现动画。它看起来比仅 1 个随机项目动画要好得多。有没有办法告诉屏幕上的项目在它们变得可见时不动画?
  • 我正在更新答案
  • 感谢您的更新和回答。我真的很喜欢捆绑解决方案并感谢您的帮助。不幸的是,添加时不在屏幕上的项目只有在它们滚动到屏幕上后才会显示动画,但我认为这与我所问的问题/问题不同,滚动动画对我的项目来说很好。
猜你喜欢
  • 1970-01-01
  • 2019-11-21
  • 2011-09-16
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多