「已注销」 2016-07-23 03:14 采纳率: 0%
浏览 1054

自定义listview点击监听时好时坏,不灵敏,是怎么回事啊

开始以为是设置的监听无效,后来发现是可以点击的,点击很不好用,偶尔才能点击到,请问是什么原因啊

package net.bmvod.jukeboxv2;

import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;

/**

  • TODO: document your custom view class.
    /
    public class LvListView extends ListView implements AbsListView.OnItemClickListener {
    /
    *

    • 显示在屏幕上多少个item / private int showItemCount; /*
    • 每个item的高度 / private int itemHeight; /*
    • 记录第一个显示的item / /*
    • 从第几行执行动画 / private int scaleFlagIndex = 0; /*
    • 是否到了最后一行 */ private boolean lastFlag = false;

    /**

    • 步骤 */ private int step = 0;

    /**

    • 步骤个数 */ private int stepCount;

    public LvListView(Context context) {
    this(context, null);
    }

    public LvListView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
    }

    /**

    • 构造方法中拿到自定义属性showViewCount,并设置滚动监听 *
    • @param context
    • @param attrs
    • @param defStyleAttr
      */
      public LvListView(Context context, AttributeSet attrs, int defStyleAttr) {
      super(context, attrs, defStyleAttr);

      //获取showViewCount
      TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.LvListView);
      showItemCount = typedArray.getInt(R.styleable.LvListView_showViewCount, 0);
      typedArray.recycle();

      //设置一个滚动监听
      // setOnScrollListener(this);
      setOnItemClickListener(this);
      }

    /**

    • 重写onLayout方法得到LvListview尺寸信息,并根据要显示的item个数计算出item高度并设置 *
    • @param changed
    • @param l
    • @param t
    • @param r
    • @param b */ @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); if (changed) { itemHeight = this.getHeight() / showItemCount; for (int i = 0; i < getChildCount(); i++) { LinearLayout layout = (LinearLayout) getChildAt(i); LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, itemHeight); layout.setLayoutParams(layoutParams); } stepCount = getAdapter().getCount(); } }

    /**

    • 禁用手指滑动 *
    • @param ev
    • @return */

    /**

    • 设置滚动到指定item */ public void scrollToItem() { step++; if (step == stepCount) { step = 0; this.lastFlag = true; startScaleAnimator(getChildAt(scaleFlagIndex), 1.0f, 0.6f); this.smoothScrollToPositionFromTop(step, 0, 1000); } else { this.smoothScrollToPositionFromTop(step, 0, 500); } }

    /**

    • 缩放动画 *
    • @param view
    • @param start
    • @param end */ public void startScaleAnimator(final View view, float start, float end) { ValueAnimator animator = ValueAnimator.ofFloat(start, end); animator.setDuration(500); animator.start(); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float value = (float) animation.getAnimatedValue(); view.setScaleX(value); view.setScaleY(0.4f + (0.6f * value)); } }); }

/* @Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
Log.e("onScrollStateChanged", "scrollState--" + scrollState);
if (scrollState == OnScrollListener.SCROLL_STATE_FLING) {
if (!lastFlag) {
startScaleAnimator(view.getChildAt(scaleFlagIndex), 1.0f, 0.6f);
startScaleAnimator(view.getChildAt(scaleFlagIndex + 1), 0.6f, 1.0f);
scaleFlagIndex = 2;
}
} else if (scrollState == OnScrollListener.SCROLL_STATE_IDLE && lastFlag) {
this.lastFlag = false;
//this.scaleFlag = true;
scaleFlagIndex = 1;
}
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
    Log.e("onScroll", "firstVisibleItem--" + firstVisibleItem);
}*/

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    System.out.println(position);

    switch (position) {
        case 0:
            startScaleAnimator(view, 0.6f, 1.0f);
            break;
        case 1:
            startScaleAnimator(view, 0.6f, 1.0f);
            break;
        case 2:
            startScaleAnimator(view, 0.6f, 1.0f);
            break;
    }

}

}


这是我的代码,是根据网上的例子改的,自定义listview的监听很不好,原来是跟本不可以点击然后我在列表的配置文件里面加了android:clickable="true" 之后的效果见识点20次能监听到一次那种效果,求解决

  • 写回答

1条回答 默认 最新

  • 付博瀚 2016-07-23 03:19
    关注

    我是领经验的,不要搭理我。。

    评论

报告相同问题?

悬赏问题

  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题