android - 如何在自定义 ListView 中启动动画

标签 android listview android-animation android-arrayadapter

我有一个自定义的 listview,包括一个 imageview 和一个 textview。 我想,当我点击 imageview 时,开始 animation(rotate)。 我的问题是:滚动时,动画停止了。

public class AdapterFoodGroups extends BaseAdapter {

   private static LayoutInflater mInflater = null;

   Context context;
   int[] foodImagesId;
   String[] foodNameList;
   String[] foodDescriptions;
   int[] foodTimes;

   boolean[] loadAnimation;

   public AdapterFoodGroups(Context context, String[] foodNameList, String[] foodDescriptions, int[] foodTimes, int[] foodImagesId) {
      // TODO Auto-generated constructor stub
      this.foodNameList = foodNameList;
      this.foodDescriptions = foodDescriptions;
      this.foodTimes = foodTimes;
      this.foodImagesId = foodImagesId;
      this.context = context;

      loadAnimation = new boolean[foodNameList.length];
      for (boolean b: loadAnimation) {
         b = false;
      }
   }

   @Override
   public View getView(final int position, View convertView, ViewGroup parent) {
      // TODO Auto-generated method stub

      final ViewHolder viewHolder;

      final RotateAnimation anim = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5 f, Animation.RELATIVE_TO_SELF, 0.5 f);
      anim.setInterpolator(new LinearInterpolator());
      anim.setRepeatCount(Animation.INFINITE);
      anim.setDuration(800);

      if (convertView == null) {

         mInflater = (LayoutInflater) context.
         getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         convertView = mInflater.inflate(R.layout.adapter_foodgroup, null);

         viewHolder = new ViewHolder();

         viewHolder.txtFoodName = (TextView) convertView.findViewById(R.id.txtFoodNameGrid);
         viewHolder.txtFoodDescription = (TextView) convertView.findViewById(R.id.txtFoodDescriptionGrid);
         viewHolder.txtFoodTime = (TextView) convertView.findViewById(R.id.txtFoodTimeGrid);
         viewHolder.ivFoodImage = (CircularImageView) convertView.findViewById(R.id.ivFoodImageGrid);
         viewHolder.ivLoad = (ImageView) convertView.findViewById(R.id.ivLoad);

         convertView.setTag(viewHolder);
      } else {
         viewHolder = (ViewHolder) convertView.getTag();
      }

      if (this.foodImagesId[position] != 0) {
         viewHolder.ivFoodImage.setImageResource(this.foodImagesId[position]);
         viewHolder.ivFoodImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               Toast.makeText(context, String.valueOf(position) + " = " + foodNameList[position], Toast.LENGTH_LONG).show();
            }
         });
      }
      if (this.foodNameList[position] != null) {
         viewHolder.txtFoodName.setText(this.foodNameList[position]);
      }
      if (this.foodDescriptions[position] != null) {
         viewHolder.txtFoodDescription.setText(this.foodDescriptions[position]);
      }
      if (this.foodTimes[position] != 0) {
         viewHolder.txtFoodTime.setText(String.valueOf(this.foodTimes[position]) + " دقیقه");
      }

      viewHolder.ivLoad.setImageResource(R.drawable.load);
      viewHolder.ivLoad.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            viewHolder.ivLoad.setAnimation(anim);
            viewHolder.ivLoad.startAnimation(anim);
         }
      });

      return convertView;
   }

   @Override
   public int getCount() {
      // TODO Auto-generated method stub
      return foodNameList.length;
   }

   @Override
   public Object getItem(int position) {
      // TODO Auto-generated method stub
      return position;
   }

   @Override
   public long getItemId(int position) {
      // TODO Auto-generated method stub
      return position;
   }

   public static class ViewHolder {
      public CircularImageView ivFoodImage;
      public ImageView ivLoad;
      public TextView txtFoodName;
      public TextView txtFoodDescription;
      public TextView txtFoodTime;
   }
}

最佳答案

试试这个:

在您的适配器构造函数中更改这些行:

....
loadAnimation = new boolean[foodNameList.length];
        for (int i=0; i < loadAnimation.length; i++) {
            loadAnimation[i] = false;
        }
....

getView() 方法中添加:

...

            viewHolder.ivLoad.setImageResource(R.drawable.load);

            if(loadAnimation[position]){
                viewHolder.ivLoad.setAnimation(anim);
                viewHolder.ivLoad.startAnimation(anim);
            } else {
                viewHolder.ivLoad.setAnimation(null);
            }

            viewHolder.ivLoad.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    viewHolder.ivLoad.setAnimation(anim);
                    viewHolder.ivLoad.startAnimation(anim);
                    loadAnimation[position] = true;

                }
            });

...

希望对您有所帮助!

关于android - 如何在自定义 ListView 中启动动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36195084/

相关文章:

android - Android ListView 的点击处理程序

android - makeSceneTransitionAnimation 不工作

android - 如何为 MediaStyle 通知操作的图标着色?

Android 模拟器 - 模拟特定设备

java - 哪些最重要的功能我会错过针对 Android API 3 (OS 1.5) 而不是最新的 API?

android - 适用于 Android 的 Windows Azure 工具包

android - 如何从 Android 应用程序通过 PHP 连接 MySQL 服务器?

java - 如何从另一个 Activity 中的用户输入中获取要显示在 ListView 上的项目?

android - 为什么 Fragment 在 .hide() 和 .setCustomAnimations() 上崩溃?

android - 嵌套集的顺序动画