在RecyclerView中多个图像上的Android动画
我必须下载一张在RecyclerView中多个图像上的Android动画,android,animation,android-recyclerview,android-volley,Android,Animation,Android Recyclerview,Android Volley,我必须下载一张图像,将其分成9等份,并在图像视图中以动画形式显示它们。 当我在活动中下载单个图像并在活动中设置动画时,我实现了这一点,但当我在回收器视图(多个项目)中执行相同操作时,图像在滚动时重复,图像的位置会改变 注意:我正在使用Volley下载图像,并在async task中执行拆分 下面是RecyclerView适配器的代码 public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder>{ priv
图像
,将其分成9等份,并在图像视图
中以动画形式显示它们。
当我在<代码>活动<代码>中下载<代码>单个<代码>图像<代码>并在<代码>活动<代码>中设置动画<代码>时,我实现了这一点,但当我在<代码>回收器视图<代码>(多个项目)中执行相同操作时,<代码>图像<代码>在<代码>滚动<代码>时重复,图像的位置会改变
注意:我正在使用Volley
下载图像,并在async task
中执行拆分
下面是RecyclerView适配器的代码
public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder>{
private Context mContext;
private List<ObjectClass> arrayListData;
private final TypedValue mTypedValue = new TypedValue();
private int mBackground;
public Adapter(Context mContext, List<ObjectClass> arrayListData) {
mContext.getTheme().resolveAttribute(R.attr.selectableItemBackground, mTypedValue, true);
mBackground = mTypedValue.resourceId;
this.mContext = mContext;
this.arrayListData = arrayListData;
}
// View Holder class
public class ViewHolder extends RecyclerView.ViewHolder {
public final View convertView;
NetworkImageView ivFeedImage;
public ViewHolder(View view) {
super(view);
convertView = view;
ivFeedImage = (NetworkImageView) convertView.findViewById(R.id.ivFeedImage);
}
@Override
public String toString() {
return super.toString();
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.lvadapter, parent, false);
view.setBackgroundResource(mBackground);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
final ObjectClass data = arrayListData.get(position);
ImageRequest imageRequest = new ImageRequest(data.getUrl(), new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
SplitImage task = new SplitImage(); // to split image in 9 equal parts and animate it one imageView
task.execute(bitmap, holder.ivFeedImage);
}
}, 0, 0, ImageView.ScaleType.FIT_XY, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
volleyError.printStackTrace();
holder.ivFeedImage.setBackgroundResource(R.mipmap.ic_launcher);
}
});
AppController.getInstance().getRequestQueue().add(imageRequest);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemCount() {
return arrayListData == null ? 0 : arrayListData.size();
}
class SplitImage extends AsyncTask<Object, Void, Void> {
//doInBackground()
@Override
protected Void doInBackground(Object... params) {
try {
final Bitmap bitmap = (Bitmap) params[0];
final ImageView imageView = (ImageView) params[1];
if(bitmap != null){
final ArrayList<Bitmap> arrImages = splitImage(bitmap); // method for splitting the image into 9 parts
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
animateImage(imageView, arrImages, 0, true); // method for applying animation to arralist of images
}
});
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
}
公共类适配器扩展了RecyclerView.Adapter{
私有上下文;
私有列表arrayListData;
私有最终类型值mTypedValue=新类型值();
私人国际mBackground;
公共适配器(上下文mContext、列表arrayListData){
mContext.getTheme().resolveAttribute(R.attr.selectableItemBackground,mTypedValue,true);
mBackground=mTypedValue.resourceId;
this.mContext=mContext;
this.arrayListData=arrayListData;
}
//视图持有者类
公共类ViewHolder扩展了RecyclerView.ViewHolder{
公众最终意见;
网络图像视图;
公共视图持有者(视图){
超级(视图);
转换视图=视图;
ivFeedImage=(NetworkImageView)convertView.findViewById(R.id.ivFeedImage);
}
@凌驾
公共字符串toString(){
返回super.toString();
}
}
@凌驾
public ViewHolder onCreateViewHolder(视图组父级,int-viewType){
View=LayoutInflater.from(parent.getContext())
.充气(R.layout.lvadapter,父级,假);
视图.setBackgroundResource(mBackground);
返回新的ViewHolder(视图);
}
@凌驾
公共无效onBindViewHolder(最终视图持有人,最终整型位置){
最终ObjectClass数据=arrayListData.get(位置);
ImageRequest ImageRequest=新的ImageRequest(data.getUrl(),new Response.Listener()){
@凌驾
公共void onResponse(位图){
SplitImage task=new SplitImage();//将图像分成9个相等的部分,并在一个imageView中设置动画
执行(位图,holder.ivFeedImage);
}
},0,0,ImageView.ScaleType.FIT_XY,Bitmap.Config.ARGB_8888,新响应。ErrorListener(){
@凌驾
公共错误响应(截击错误截击错误){
截击错误。printStackTrace();
holder.ivFeedImage.setBackgroundResource(R.mipmap.ic_启动器);
}
});
AppController.getInstance().getRequestQueue().add(imageRequest);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
public int getItemCount(){
返回arrayListData==null?0:arrayListData.size();
}
类SplitImage扩展了异步任务{
//doInBackground()
@凌驾
受保护的Void doInBackground(对象…参数){
试一试{
最终位图位图=(位图)参数[0];
最终ImageView ImageView=(ImageView)参数[1];
if(位图!=null){
final ArrayList arrImages=splitImage(位图);//将图像拆分为9个部分的方法
新的处理程序(Looper.getMainLooper()).post(新的Runnable()){
@凌驾
公开募捐{
animateImage(imageView,arrImages,0,true);//将动画应用于图像列表的方法
}
});
}
}捕获(例外e){
e、 printStackTrace();
}
返回null;
}
}
}
您可以发布一些您正在使用的代码吗?您可能需要在模型内部设置一些标志,并在您的视窗夹中设置if条件,以指示图像是否已设置动画。@JakubSzczygieł请检查编辑。谢谢