如何更改行onTouch但不是onScroll的背景颜色?

时间:2012-07-19 12:32:17

标签: android listview android-listview android-arrayadapter

我有一个listview,我只想在触摸它时(行动项目)更改行(项目)的背景颜色,但在滚动列表视图时阻止它。我怎么能这样做?

这是我的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;
 }

它有效但在触摸滚动时也有效。怎么能阻止这个?我的意思是,只适用于触摸事件而不适用于滚动?

提前致谢

1 个答案:

答案 0 :(得分: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