Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何更改onTouch而不是onScroll上的行的背景色?_Android_Listview_Android Listview_Android Arrayadapter - Fatal编程技术网

Android 如何更改onTouch而不是onScroll上的行的背景色?

Android 如何更改onTouch而不是onScroll上的行的背景色?,android,listview,android-listview,android-arrayadapter,Android,Listview,Android Listview,Android Arrayadapter,我有一个listview,我只想在触摸它(MotionEvent.ACTION_向下)时更改行(项目)的背景色,但在滚动listview时防止这种情况发生。我该怎么做 这是我的ListView的BaseAdapter @Override public View getView(final int position, View convertView, ViewGroup parent) { View row = convertView; DataHolder holder =

我有一个listview,我只想在触摸它(MotionEvent.ACTION_向下)时更改行(项目)的背景色,但在滚动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;
 }
它可以工作,但在触摸滚动时也可以工作。如何预防这种情况?我的意思是,只适用于触摸事件,但不适用于滚动


提前感谢

只要您触摸屏幕,就会看到MotionEvent.ACTION\u向下。防止滚动事件的颜色更改的一种方法是实现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更改为手势检测器,但您仍然可以从MotionEvent中提取所需的有关触摸事件的任何信息。此外,手势检测器可以让您轻松地检测到投掷或双击,并以任何您认为合适的方式进行响应


你是这个意思吗?row.setOnTouchListener(new View.OnTouchListener(){@Override public boolean onTouch(View视图,MotionEvent MotionEvent){返回mGestureDetector.onTouchEvent(MotionEvent);}});但它不起作用。你能给出一个简单的代码吗?据我所知,SimpleGetStereDetector和GestureDetector适用于整个屏幕,因此它们应该在你的方法之外初始化,并且在你的活动运行的整个过程中都会听到手势。如果在构造函数中设置了gesturedetector,则可以在onTouch方法中设置特定于视图的标志(viewColorChange=true),然后在onScroll()方法中检查该标志,如果为true,则重置颜色。您可能仍然能够在onTouch方法的末尾返回mGestureDetector.onTouchEvent(motionEvent),但我对此不确定。