我已经创建了基本适配器并将动画应用到图像视图,该图像视图是每3秒后自定义布局的一部分。每行都有图像数组,所以我试图淡出当前图像和时尚 - 在新的一个。我已创建处理程序与runnable计时器在活动中,每3秒后调用adapter.notifyDataSetChanged()。如果不应用动画,我的适配器将如下所示:Android BaseAdapter动画图像查看器
public class FerrariAdapter extends BaseAdapter {
/*
* Variable Declaration Part
*/
private Context mContext;
private ArrayList<String> mTitle, mOwner, mDate;
private HashMap<String, ArrayList<String>> mImages;
private HashMap<Integer, Integer> mLastImagePosition;
private ViewHolder mHolder;
private boolean is_animation = false;
private Animation mFadeIn, mFadeOut;
/* Constructor that initialize variables getting from activity */
public FerrariAdapter(Context mContext, ArrayList<String> mTitle,
ArrayList<String> mOwner, ArrayList<String> mDate,
HashMap<String, ArrayList<String>> mImages,
HashMap<Integer, Integer> mLastImagePosition) {
this.mContext = mContext;
this.mTitle = mTitle;
this.mOwner = mOwner;
this.mDate = mDate;
this.mImages = mImages;
this.mLastImagePosition = mLastImagePosition;
mFadeOut = AnimationUtils.loadAnimation(mContext, R.anim.anim_fadeout);
mFadeIn = AnimationUtils.loadAnimation(mContext, R.anim.anim_fadein);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mTitle.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return mTitle.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View mView = convertView;
if (mView == null) {
/*
* Inflating custom layout and getting components IDs to set each
* row of ListView
*/
mView = LayoutInflater.from(mContext).inflate(R.layout.car_tile,
null);
mHolder = new ViewHolder();
mHolder.mTitleHolder = (TextView) mView
.findViewById(R.id.titleHolder);
mHolder.mOwnerHolder = (TextView) mView
.findViewById(R.id.OwnerHolder);
mHolder.mDateHolder = (TextView) mView
.findViewById(R.id.dateHolder);
mHolder.mImageHolder = (ImageView) mView
.findViewById(R.id.imageHolder);
mView.setTag(mHolder);
} else {
mHolder = (ViewHolder) mView.getTag();
}
/* Set Value to each row */
mHolder.mTitleHolder.setText(mTitle.get(position));
mHolder.mOwnerHolder.setText(mOwner.get(position));
mHolder.mDateHolder.setText(Utils.millisToDate(
Long.parseLong(mDate.get(position)), "dd MMM yyyy HH:mm"));
mHolder.mImageHolder.setImageBitmap(getImagefromHashmap(position));
/*mFadeOut.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
}
});
mHolder.mImageHolder.setAnimation(mFadeOut);*/
return mView;
}
/*
* This class is used to hold position of each component so it shouln't be
* repeat again and again
*/
class ViewHolder {
ImageView mImageHolder;
TextView mTitleHolder, mOwnerHolder, mDateHolder;
}
private Bitmap getImagefromHashmap(int position) {
Bitmap mBitmap = null;
ArrayList<String> mImagesList = mImages.get(mTitle.get(position));
int mLastImagePostion = mLastImagePosition.get(position);
if (mImagesList.size() - 1 > mLastImagePostion) {
mLastImagePostion++;
mLastImagePosition.put(position, mLastImagePostion);
} else {
mLastImagePostion = 0;
mLastImagePosition.put(position, mLastImagePostion);
}
String mImageName = mImagesList.get(mLastImagePostion);
// Get the AssetManager
AssetManager manager = mContext.getAssets();
// Read a Bitmap from Assets
try {
InputStream mOpen = manager.open(mImageName);
mBitmap = BitmapFactory.decodeStream(mOpen);
} catch (Exception e) {
}
return Utils.resize(mBitmap,
(int) (Utils.getDeviceWidth(mContext)/2.5),
Utils.getDeviceHeight(mContext)/5);
}
}
而且它通过将图像更改为imageview与每行都工作良好。现在,当我要在getview()上应用动画时,只有最后一行受到影响。所以我认为getView()在每行的动画完成之前调用。在应用动画时:
public class FerrariAdapter extends BaseAdapter {
/*
* Variable Declaration Part
*/
private Context mContext;
private ArrayList<String> mTitle, mOwner, mDate;
private HashMap<String, ArrayList<String>> mImages;
private HashMap<Integer, Integer> mLastImagePosition;
private ViewHolder mHolder;
private boolean is_animation = false;
private Animation mFadeIn, mFadeOut;
/* Constructor that initialize variables getting from activity */
public FerrariAdapter(Context mContext, ArrayList<String> mTitle,
ArrayList<String> mOwner, ArrayList<String> mDate,
HashMap<String, ArrayList<String>> mImages,
HashMap<Integer, Integer> mLastImagePosition) {
this.mContext = mContext;
this.mTitle = mTitle;
this.mOwner = mOwner;
this.mDate = mDate;
this.mImages = mImages;
this.mLastImagePosition = mLastImagePosition;
mFadeOut = AnimationUtils.loadAnimation(mContext, R.anim.anim_fadeout);
mFadeIn = AnimationUtils.loadAnimation(mContext, R.anim.anim_fadein);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mTitle.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return mTitle.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View mView = convertView;
if (mView == null) {
/*
* Inflating custom layout and getting components IDs to set each
* row of ListView
*/
mView = LayoutInflater.from(mContext).inflate(R.layout.car_tile,
null);
mHolder = new ViewHolder();
mHolder.mTitleHolder = (TextView) mView
.findViewById(R.id.titleHolder);
mHolder.mOwnerHolder = (TextView) mView
.findViewById(R.id.OwnerHolder);
mHolder.mDateHolder = (TextView) mView
.findViewById(R.id.dateHolder);
mHolder.mImageHolder = (ImageView) mView
.findViewById(R.id.imageHolder);
mView.setTag(mHolder);
} else {
mHolder = (ViewHolder) mView.getTag();
}
/* Set Value to each row */
mHolder.mTitleHolder.setText(mTitle.get(position));
mHolder.mOwnerHolder.setText(mOwner.get(position));
mHolder.mDateHolder.setText(Utils.millisToDate(
Long.parseLong(mDate.get(position)), "dd MMM yyyy HH:mm"));
mFadeOut.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
mHolder.mImageHolder.setImageBitmap(getImagefromHashmap(position));
}
});
mHolder.mImageHolder.setAnimation(mFadeOut);
return mView;
}
/*
* This class is used to hold position of each component so it shouln't be
* repeat again and again
*/
class ViewHolder {
ImageView mImageHolder;
TextView mTitleHolder, mOwnerHolder, mDateHolder;
}
private Bitmap getImagefromHashmap(int position) {
Bitmap mBitmap = null;
ArrayList<String> mImagesList = mImages.get(mTitle.get(position));
int mLastImagePostion = mLastImagePosition.get(position);
if (mImagesList.size() - 1 > mLastImagePostion) {
mLastImagePostion++;
mLastImagePosition.put(position, mLastImagePostion);
} else {
mLastImagePostion = 0;
mLastImagePosition.put(position, mLastImagePostion);
}
String mImageName = mImagesList.get(mLastImagePostion);
// Get the AssetManager
AssetManager manager = mContext.getAssets();
// Read a Bitmap from Assets
try {
InputStream mOpen = manager.open(mImageName);
mBitmap = BitmapFactory.decodeStream(mOpen);
} catch (Exception e) {
}
return Utils.resize(mBitmap,
(int) (Utils.getDeviceWidth(mContext)/2.5),
Utils.getDeviceHeight(mContext)/5);
}
}
那么如何处理这种情况,或者如何在每行完成动画后调用getView()?
感谢,
是的,它可能有帮助。但仍然如果你可以为你的步骤编写代码,这对我会有帮助,因为做了太多的事情后,我卡住了:)。谢谢, – Jai 2014-12-07 08:18:20
好吧,这将需要几分钟... – Bruce 2014-12-07 08:21:36
非常感谢。等候!! – Jai 2014-12-07 08:22:12