Android 动画在 BaseAdapter 中不起作用

Android animation not working in BaseAdapter

我正在尝试使用 Pulsator4Droid。
https://github.com/booncol/Pulsator4Droid

它在 BaseAdapter 外部工作,但在适配器内部不起作用。
我已经在多个基本的 BaseAdapter 中尝试过它,并且 none 它们可以工作,尽管 XML 动画可以...知道为什么会发生这种情况吗?

home_menu_grid_pulse_item.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:gravity="center"
    android:paddingTop="10dp"
    android:paddingBottom="10dp"
    android:paddingLeft="10dp"
    android:paddingRight="10dp">

    <pl.bclogic.pulsator4droid.library.PulsatorLayout
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/pulsator"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:pulse_count="4"
        app:pulse_duration="7000"
        app:pulse_repeat="0"
        app:pulse_color="#FF0000"
        app:pulse_interpolator="Linear"
        app:pulse_startFromScratch="true"
        android:layout_gravity="center_horizontal"
        android:foregroundGravity="center_horizontal"
        android:gravity="center_horizontal"> 

    </pl.bclogic.pulsator4droid.library.PulsatorLayout>
</LinearLayout>

HomeMenuGridAdapter.java :

package com.au.test.helpers.common;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.au.test.R;
import java.util.List;
import pl.bclogic.pulsator4droid.library.PulsatorLayout;

@SuppressLint("InflateParams")
public class HomeMenuGridAdapter extends BaseAdapter {

    private final Activity context;
    private List<HomeMenuItem> array = null;

    public HomeMenuGridAdapter(Context mContext, List<HomeMenuItem> _list) {
        context = (Activity) mContext;
        array = _list;
    }

    public int getCount() {
        return array.size();
    }

    public Object getItem(int position) {
        return array.get(position);
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(final int position, View convertView, ViewGroup arg2) {
        if (convertView == null) {
            LayoutInflater inflater = context.getLayoutInflater();
            convertView = inflater.inflate(R.layout.home_menu_grid_pulse_item, null);
        }

        // Get Controls 
        PulsatorLayout pulsator = (PulsatorLayout) convertView.findViewById(R.id.pulsator);  
        pulsator.start();

        return convertView;
    }
}

修改您的 getView 方法,如下所示。您应该使用 setTaggetTag 方法来实现此目的。

public View getView(final int position, View convertView, ViewGroup arg2) {
    if (null == convertView) {
        LayoutInflater inflater = context.getLayoutInflater();
        convertView = inflater.inflate(R.layout.home_menu_grid_pulse_item, null);
    }

    // Get Controls 
    PulsatorLayout pulsator = (PulsatorLayout) convertView.findViewById(R.id.pulsator);  
    pulsator.start();

   //set tag on converview with your key
    convertView.setTag("yourKEY");
    return convertView;
}

要在适配器外部获得此控件的访问权限,您需要使用 getTag,就像在您的 activity.

中一样
View v = yourcontrolobject.findViewWithTag("yourKEY");
                if (v != null) {
                    PulsatorLayout obj= (PulsatorLayout) v.findViewById(R.id.pulsator);

// do whatever you wnat to do now with this obj.

                }

将此代码放入您的适配器 class,它工作正常... Have a look at this

public class MyAdapter extends BaseAdapter {

private Context mContext;

public MyAdapter(Context context) {
    mContext = context;
}

@Override
public int getCount() {
    return 10;
}

@Override
public Object getItem(int i) {
    return i;
}

@Override
public long getItemId(int i) {
    return i;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    final ViewHolder viewHolder;
    if(view == null) {
        viewHolder = new ViewHolder();
        view = LayoutInflater.from(mContext).inflate(R.layout.row_file, viewGroup, false);

        viewHolder.pulsator = (PulsatorLayout) view.findViewById(R.id.pulsator);
        viewHolder.tvCount = (TextView) view.findViewById(R.id.tv_count);
        view.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) view.getTag();
    }

    viewHolder.pulsator.start();
    viewHolder.tvCount.setText("My listview row No-> " + i);
    return view;
}

public static class ViewHolder {
    PulsatorLayout pulsator;
    TextView tvCount;
    }
}

原来是 XML 视图的宽度和高度。

以编程方式设置宽度和高度不适用于 pulseView.setIconHeight(200) 和 pulseView.setIconWidth(200),视图上的 wrap_content 或 match_parent 也不起作用(即使父级是全屏的:/),我不得不硬编码一个实际大小..

我将 View 的高度和宽度设置为 200px,它可以正常工作...不是很优雅,但已经足够了:)