使用在ViewHolder中

时间:2016-03-13 00:21:10

标签: java android

我有一个RecyclerView,每个卡片中都有一个带有收藏夹按钮的CardViews。我希望只为每张特定的卡点击最喜欢的按钮。我目前正在使用ViewHolder维护每张卡中的每个组件,而收藏夹按钮就是其中一个组件。

如何使用ViewHolder中单独的类中定义的onClick()?

目前使用此代码仅激活favoriteButton

的onTouchEvent()
viewHolder.favoriteButton.setOnClickListener(new LikeButtonView(mContext));

AppAdapter.java

public class AppAdapter extends RecyclerView.Adapter<AppAdapter.ViewHolder> {

    PackageManager packageManager;
    private List<App> apps;
    private int rowLayout;
    private Context mContext;

    public AppAdapter(List<App> apps, int rowLayout, Context context) {
        this.apps = apps;
        this.rowLayout = rowLayout;
        this.mContext = context;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        packageManager = this.mContext.getPackageManager();
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int i) {

        App appObject = apps.get(i);
        viewHolder.appName.setText(appObject.getApplicationName());
        viewHolder.versionNumber.setText(String.valueOf(appObject.getVersionNumber()));
        viewHolder.updateDate.setText(String.valueOf(appObject.getLastUdpateTime()));
        viewHolder.appIcon.setImageDrawable(appObject.getAppIcon());
        viewHolder.appChangelog.setText(appObject.getChangelogText());
        viewHolder.favoriteButton.setOnClickListener(new LikeButtonView(mContext));
    }

LikeButtonView.java

public class LikeButtonView extends FrameLayout implements View.OnClickListener {
    private static final DecelerateInterpolator DECCELERATE_INTERPOLATOR = new DecelerateInterpolator();
    private static final AccelerateDecelerateInterpolator ACCELERATE_DECELERATE_INTERPOLATOR = new AccelerateDecelerateInterpolator();
    private static final OvershootInterpolator OVERSHOOT_INTERPOLATOR = new OvershootInterpolator(4);

    @Bind(R.id.ivStar)
    ImageView ivStar;

    private boolean isChecked;
    private AnimatorSet animatorSet;

    public LikeButtonView(Context context) {
        super(context);
        init();
    }

    public LikeButtonView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public LikeButtonView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public LikeButtonView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }

    private void init() {
        LayoutInflater.from(getContext()).inflate(R.layout.view_like_button, this, true);
        ButterKnife.bind(this);
        setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        isChecked = !isChecked;
        ivStar.setImageResource(isChecked ? R.drawable.ic_star_rate_on : R.drawable.ic_star_rate_off);

        if (animatorSet != null) {
            animatorSet.cancel();
        }

        if (isChecked) {
            ivStar.animate().cancel();
            ivStar.setScaleX(0);
            ivStar.setScaleY(0);

            animatorSet = new AnimatorSet();
            ObjectAnimator starScaleYAnimator = ObjectAnimator.ofFloat(ivStar, ImageView.SCALE_Y, 0.2f, 1f);
            starScaleYAnimator.setDuration(350);
            starScaleYAnimator.setStartDelay(0);
            starScaleYAnimator.setInterpolator(OVERSHOOT_INTERPOLATOR);

            ObjectAnimator starScaleXAnimator = ObjectAnimator.ofFloat(ivStar, ImageView.SCALE_X, 0.2f, 1f);
            starScaleXAnimator.setDuration(350);
            starScaleXAnimator.setStartDelay(0);
            starScaleXAnimator.setInterpolator(OVERSHOOT_INTERPOLATOR);

            animatorSet.playTogether(
                    starScaleYAnimator,
                    starScaleXAnimator
            );

            animatorSet.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationCancel(Animator animation) {
                    ivStar.setScaleX(1);
                    ivStar.setScaleY(1);
                }
            });

            animatorSet.start();
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                ivStar.animate().scaleX(0.7f).scaleY(0.7f).setDuration(150).setInterpolator(DECCELERATE_INTERPOLATOR);
                setPressed(true);
                break;

            case MotionEvent.ACTION_MOVE:
                float x = event.getX();
                float y = event.getY();
                boolean isInside = (x > 0 && x < getWidth() && y > 0 && y < getHeight());
                if (isPressed() != isInside) {
                    setPressed(isInside);
                }
                break;

            case MotionEvent.ACTION_UP:
                ivStar.animate().scaleX(1).scaleY(1).setInterpolator(DECCELERATE_INTERPOLATOR);
                if (isPressed()) {
                    performClick();
                    setPressed(false);
                }
                break;
        }
        return true;
    }
} 

0 个答案:

没有答案