简体   繁体   English

Android动画无法在BaseAdapter中工作

[英]Android animation not working in BaseAdapter

i am trying to use Pulsator4Droid. 我正在尝试使用Pulsator4Droid。
https://github.com/booncol/Pulsator4Droid https://github.com/booncol/Pulsator4Droid

It works outside of a BaseAdapter, although inside the adapter it does not work. 它在BaseAdapter外部工作,尽管在适配器内部不工作。
I have tried it in multiple basic BaseAdapters and none of them work, although XML animations do... Any ideas why this might be happening? 我已经在多个基本BaseAdapter中进行了尝试,尽管XML动画都可以使用它们,但是它们都不起作用...为何会发生这种情况的任何想法?

home_menu_grid_pulse_item.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 : 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;
    }
}

modify your getView method like following. 如下修改您的getView方法。 you should use setTag and getTag approach to achieve this. 您应该使用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;
}

to get that access of this control outside of adapter you need to use getTag like following in your activity. 为了在适配器之外获得对该控件的访问,您需要在活动中使用如下所示的getTag

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.

                }

put this code in your Adapter class, it's working properly... Have a look at this 将此代码放入您的Adapter类中,它可以正常工作... 看一下

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;
    }
}

Turns out it was the width and height of the XML view. 原来是XML视图的宽度和高度。

Programatically setting the width and heigh doesn't work with pulseView.setIconHeight(200) and pulseView.setIconWidth(200), neither does wrap_content or match_parent on the View (even when the parent is full screen :/), i had to hard-code an actual size.. 以编程方式设置宽度和高度不能与pulseView.setIconHeight(200)和pulseView.setIconWidth(200)一起使用,View上的wrap_content或match_parent也不起作用(即使当父屏幕全屏时:/),我也必须硬编码实际尺寸。

I made my View's height and width 200px and it works... Not very elegant but it's good enough :) 我将View的高度和宽度设置为200px,它可以正常工作...虽然不是很优雅,但是足够好了:)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM