重新排序 ListView 项目的动画
Animation on reordering ListView Item
我有一个 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();
}
多亏了 CommonsWare 的响应,我使用了 RecyclerView
,它使插入和删除项目的动画更加简单。
我有一个 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();
}
多亏了 CommonsWare 的响应,我使用了 RecyclerView
,它使插入和删除项目的动画更加简单。