Android ListView中视图上的动画
我有一个包含项目列表的列表视图。每件物品都有一个带有星星的小图片按钮,以将其标记为收藏。单击星形图像按钮时,我希望它进行一点旋转。在Android 4.3中运行良好,但在2.3中,不仅单击的星星会旋转,而且上面项目中的星星也会旋转 我已经试着不给星星使用视窗支架,因为我认为这可能会导致它,但那没有帮助 顺便说一句,我在onClickListener中做了其他事情,这很好,只适用于单击的项目 我有什么问题 这是列表适配器中我的getView方法的一部分:Android ListView中视图上的动画,android,animation,Android,Animation,我有一个包含项目列表的列表视图。每件物品都有一个带有星星的小图片按钮,以将其标记为收藏。单击星形图像按钮时,我希望它进行一点旋转。在Android 4.3中运行良好,但在2.3中,不仅单击的星星会旋转,而且上面项目中的星星也会旋转 我已经试着不给星星使用视窗支架,因为我认为这可能会导致它,但那没有帮助 顺便说一句,我在onClickListener中做了其他事情,这很好,只适用于单击的项目 我有什么问题 这是列表适配器中我的getView方法的一部分: CheckableImageBut
CheckableImageButton favBtn = (CheckableImageButton) convertView
.findViewById(R.id.favbtn);
favBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
v.startAnimation(AnimationUtils.loadAnimation(ctx,
R.anim.spinanim));
}
});
这是我的整个getView方法:
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
checkLoadMore(position);
final Item item = combinedResult.getItems().get(position);
if (convertView == null) {
convertView = myInflater.inflate(R.layout.item_fewo_v7, null);
holder = new ViewHolder();
holder.Iv = (RecyclingImageView) convertView
.findViewById(R.id.imageView1);
holder.Tv1 = (TextView) convertView.findViewById(R.id.textView1);
holder.Tv2 = (TextView) convertView.findViewById(R.id.textView2);
holder.Tv3 = (TextView) convertView.findViewById(R.id.textView3);
holder.Tv4 = (TextView) convertView.findViewById(R.id.textView4);
holder.Root = (RelativeLayout) convertView.findViewById(R.id.root);
holder.Starbg = (RelativeLayout) convertView
.findViewById(R.id.starbg);
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
CheckableImageButton favBtn = (CheckableImageButton) convertView
.findViewById(R.id.favbtn);
favBtn.setChecked(FavItems.contains(item.getGuid()));
favBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (FavItems.contains(item.getGuid())) {
FavItems.removeFav(item.getGuid());
}
else {
FavItems.addFav(item);
}
v.startAnimation(AnimationUtils.loadAnimation(ctx,
R.anim.spinanim));
}
});
holder.Tv1.setText(item.getTitle());
holder.Tv2.setText(item.getLocation().getDescription());
holder.Tv3.setText(item.getPrice().getPriceText() + " "
+ item.getPrice().getPaymentIntervalShort());
holder.Tv4.setText("bis " + item.getPersonsMax() + " Personen");
displayImage(Tools.convertImageUrl(item.getThumbnailUrl()), holder.Iv,
holder.Root);
return convertView;
}
试试这个
public View getView(final int position, View convertView, ViewGroup parent) {
checkLoadMore(position);
final Item item = combinedResult.getItems().get(position);
convertView = myInflater.inflate(R.layout.item_fewo_v7, null);
RecyclingImageView Iv = (RecyclingImageView) convertView
.findViewById(R.id.imageView1);
TextView Tv1 = (TextView) convertView.findViewById(R.id.textView1);
TextView Tv2 = (TextView) convertView.findViewById(R.id.textView2);
TextView Tv3 = (TextView) convertView.findViewById(R.id.textView3);
TextView Tv4 = (TextView) convertView.findViewById(R.id.textView4);
RelativeLayout Root = (RelativeLayout) convertView.findViewById(R.id.root);
RelativeLayout Starbg = (RelativeLayout) convertView
.findViewById(R.id.starbg);
CheckableImageButton favBtn = (CheckableImageButton) convertView
.findViewById(R.id.favbtn);
favBtn.setChecked(FavItems.contains(item.getGuid()));
favBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (FavItems.contains(item.getGuid())) {
FavItems.removeFav(item.getGuid());
}
else {
FavItems.addFav(item);
}
v.startAnimation(AnimationUtils.loadAnimation(ctx,
R.anim.spinanim));
}
});
Tv1.setText(item.getTitle());
Tv2.setText(item.getLocation().getDescription());
Tv3.setText(item.getPrice().getPriceText() + " "
+ item.getPrice().getPaymentIntervalShort());
Tv4.setText("bis " + item.getPersonsMax() + " Personen");
displayImage(Tools.convertImageUrl(item.getThumbnailUrl()), Iv,
Root);
return convertView;
}
停止convertview的空检查,因为当convertview不为空时,您将返回相同的视图实例。因此,具有相同实例的视图将具有相同的动画与上面所说的相反,您应该使用convertView和ViewHolder模式。此外,还可以将FavBtn移动到ViewHolder中。但是,在重用视图时,确实需要清除动画,这在else子句中完成。以下方面应起作用:
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
checkLoadMore(position);
final Item item = combinedResult.getItems().get(position);
if (convertView == null) {
convertView = myInflater.inflate(R.layout.item_fewo_v7, null);
holder = new ViewHolder();
holder.Iv = (RecyclingImageView) convertView.findViewById(R.id.imageView1);
holder.Tv1 = (TextView) convertView.findViewById(R.id.textView1);
holder.Tv2 = (TextView) convertView.findViewById(R.id.textView2);
holder.Tv3 = (TextView) convertView.findViewById(R.id.textView3);
holder.Tv4 = (TextView) convertView.findViewById(R.id.textView4);
holder.Root = (RelativeLayout) convertView.findViewById(R.id.root);
holder.Starbg = (RelativeLayout) convertView.findViewById(R.id.starbg);
holder.FavBtn = (CheckableImageButton) convertView.findViewById(R.id.favbtn);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
holder.FavBtn.setAnimation(AnimationUtils.loadAnimation(ctx, R.anim.spinanim));
}
holder.FavBtn.setChecked(FavItems.contains(item.getGuid()));
holder.FavBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (FavItems.contains(item.getGuid())) {
FavItems.removeFav(item.getGuid());
} else {
FavItems.addFav(item);
}
holder.FavBtn.getAnimation().startNow();
}
});
holder.Tv1.setText(item.getTitle());
holder.Tv2.setText(item.getLocation().getDescription());
holder.Tv3.setText(item.getPrice().getPriceText() + " " + item.getPrice().getPaymentIntervalShort());
holder.Tv4.setText("bis " + item.getPersonsMax() + " Personen");
displayImage(Tools.convertImageUrl(item.getThumbnailUrl()), holder.Iv, holder.Root);
return convertView;
}
你需要使用标签。使用setTag()和getTag()方法向图像按钮添加标记,这将帮助您确定单击了哪个按钮。发布getView()方法实现尝试使用AnimationListner,这可能会有所帮助。我已经发布了整个方法。@Abhilash我看不出这有什么帮助?谢谢,但这样做的效果是根本不显示动画。我猜动画被清除为fast。我更新了答案。我没有清除动画,而是在else子句中设置它。稍后单击时,动画将启动。如果可行,请尝试。我发现了动画清除如此之快的原因:当我最喜欢的项目更改时,适配器将使用notifyDataSetChanged()刷新。我会以某种方式推迟的。但除此之外,你的答案很有效,非常感谢:)我试过了,没有效果。而且,这意味着我根本不使用Viewholder,列表变得非常混乱。