0

我有一个列表视图,我只想在触摸它时更改行(项目)的背景颜色(MotionEvent.ACTION_DOWN),但在滚动列表视图时防止这种情况发生。我怎样才能做到这一点 ?

这是我的 ListView 的 BaseAdapter

 @Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View row = convertView;
    DataHolder holder = null;

    if (row == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);

        holder = new DataHolder();
        holder.newAppsLayout = (LinearLayout) row.findViewById(R.id.new_apps_layout);             
        holder.imageView1 = (ImageView) row.findViewById(R.id.imageView1);             
        row.setTag(holder);
    } else {
        holder = (DataHolder) row.getTag();
    }

    Data data = data.get(position);
    ImageCacheManager.loadImage(holder.imageView1, item.getIconUrl());

    final DataHolder finalHolder = holder;
    row.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
                  if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                    finalHolder.newAppsLayout.setBackgroundColor(Color.GRAY);
                } else {   
                 finalHolder.newAppsLayout.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.content_bg));                    }

            return false;
        }
    });
    return row;


static class DataHolder {
    LinearLayout newAppsLayout;
    ImageView imageView1;
 }

它可以工作,但也可以在触摸滚动时工作。怎样才能防止这种情况?我的意思是,仅适用于触摸事件但不适用于滚动?

提前致谢

4

1 回答 1

1

每当您触摸屏幕时,您都会收到 MotionEvent.ACTION_DOWN。防止滚动事件颜色改变的一种方法是实现一个 SimpleOnGestureListener,如果检测到滚动手势,它将使颜色返回其原始状态。

simpleOnGestureListener = new SimpleOnGestureListener(){    
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY){
            //put color code here
            return super.onScroll(e1, e2, distanceX, distanceY);
        }
    };

您必须实例化一个 GestureDetector 以注意 simpleOnGestureListener。我通常有一个 TouchSetup() 方法来创建 simpleOnGestureListener 然后分配 mGestureDetector。

mGestureDetector = new GestureDetector(context, simpleOnGestureListener);

最后,在 OnTouchEvent(MotionEvent ev) 函数调用结束时

return mGestureDetector.onTouchEvent(event);

所有这些都需要您将 onTouchListener 更改为 GestureDetector,但您仍然可以从 MotionEvent 中提取有关触摸事件所需的任何信息。此外,GestureDetector 可让您轻松检测轻击或双击,并以您认为合适的任何方式做出响应。

http://developer.android.com/reference/android/view/GestureDetector.SimpleOnGestureListener.html

于 2012-07-19T12:51:54.820 回答