重新排序 ListView 项的动画

Posted

技术标签:

【中文标题】重新排序 ListView 项的动画【英文标题】:Animation on reordering ListView Item 【发布时间】:2015-08-06 09:05:41 【问题描述】:

我有一个 ListView,其中的项目包含两个 TextView。当我单击其中一个 TextView 时,我重新排序列表(通过将单击的项目发送到列表底部)并且我想为此制作动画。

我在适配器的 TextView 上有一个 OnClickListener,所以我必须从适配器为 ListView 设置动画。这甚至可能吗?实现这一目标的最佳方法是什么?

目前,我制作的动画只是让点击的项目消失(与其他项目一起,我不知道为什么......),而列表的其余部分没有移动。

提前感谢您的帮助!这是我的适配器代码:

public class ListAdapter extends BaseAdapter 

private final Context mContext;
private List<Card> cards;

public ListAdapter(Context context, List<Card> objects) 
    super();
    mContext = context;
    cards = objects;


@Override
public int getCount() 
    return cards.size();


@Override
public Card getItem(int position) 
    return cards.get(position);


@Override
public long getItemId(int position) 
    return position;


@Override
public View getView(final int position, View convertView, ViewGroup parent) 
    ViewHolder viewHolder;

    if (convertView == null) 
        convertView = LayoutInflater.from(mContext)
                .inflate(R.layout.card, parent, false);
        viewHolder = new ViewHolder();
        viewHolder.setText((TextView) convertView.findViewById(R.id.text));
        viewHolder.setCompteur((TextView) convertView.findViewById(R.id.compteur));
        convertView.setTag(viewHolder);
     else 
        viewHolder = (ViewHolder) convertView.getTag();
    

    viewHolder.getText().setText(getItem(position).getText());
    viewHolder.getCompteur().setText(String.valueOf(getItem(position).getCompteur()));

    TextView text = viewHolder.getText();
    TextView compteur = viewHolder.getCompteur();

    final View view = convertView;

    compteur.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            changeItem(position, view);
        
    );

    return convertView;


public List<Card> getCards() 
    return cards;


public void changeItem(int position, final View v) 
    int compteur = getItem(position).getCompteur();
    if (compteur >= 1) 
         compteur--;
    
    getItem(position).setCompteur(compteur);
    // animating the row if it's zero
    if (compteur == 0) 
        Animation animation = AnimationUtils.loadAnimation((ListActivity)mContext, R.anim.abc_shrink_fade_out_from_bottom);
        long duration = animation.getDuration();
        v.startAnimation(animation);
        v.postDelayed(new Runnable() 
            @Override
            public void run() 
                v.setVisibility(View.GONE);
            
        , duration);
        Collections.rotate(cards.subList(position, cards.size()), -1);
    
    notifyDataSetChanged();

【问题讨论】:

如果你使用RecyclerView,这可能会简单得多。 嗨,我是 android 新手。你能解释一下吗? RecyclerView 具有用于移动项目的内置动画,AFAIK 您可以更轻松地自定义这些动画。 感谢 CommonsWare 我使用了RecyclerView,它解决了问题! 【参考方案1】:

感谢 CommonsWare 的回复,我使用了 RecyclerView,它使插入和移除项目的动画更加简单。

【讨论】:

以上是关于重新排序 ListView 项的动画的主要内容,如果未能解决你的问题,请参考以下文章

按特定值对 ListView 或 ListView.ItemTemplate 进行排序

从自定义列表 Xamarin 中设置所选列表视图项的背景颜色

Flutter Listview 排序动画

CheckBox 动画在 ReorderableListView 内时不起作用

UWP 动画列表项移动

使用拖放重新排序 ListView 中的项目