0

我有一个listview习惯setOnTouchListener

view.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            switch(event.getAction()) {

            case MotionEvent.ACTION_DOWN:
                  view.setBackgroundColor(Color.parseColor("#f47920"));
                  break;

            case MotionEvent.ACTION_UP:
                  view.setBackgroundColor(Color.TRANSPARENT);
                  break; 

            }

            return false;
        }

    });

我遇到了一个奇怪的问题:当用户按住一个项目并将手指拖动到列表视图中的下一个项目时,前一个项目将保持颜色,因为应用程序认为我尝试从列表中选择几个项目。那么如果用户按住手指并在列表上上下拖动,我该如何去除颜色呢?

希望你们理解我试图完成的工作。

4

3 回答 3

3

你的情况是什么?它是单个列表项还是主列表视图?如果是listview,则尝试处理这种情况

case MotionEvent.ACTION_MOVE : 
//Check position here, if it is out of your view, then change the color back.
于 2012-08-02T12:35:12.807 回答
3

在您的情况下,您需要 ACTION_UP 或 ACTION_DOWN 事件而不是 ACTION_MOVE 因此为避免 ACTION_MOVE 您可以执行以下操作:

if(event.getAction() == MotionEvent.ACTION_DOWN)
    {
         isDown = false;            
    }
    if(event.getAction() == MotionEvent.ACTION_UP && !isDown)
    {
        // action you want to perform
    }
    if(event.getAction() == MotionEvent.ACTION_MOVE)
    {
        isDown = true;
    }

就更改颜色而言,您可以将上一个视图存储在全局变量中,并且在进行下一次触摸时,您可以将该全局视图颜色更改为正常。

于 2012-08-02T12:49:08.513 回答
1

如果您想在单击/触摸时突出显示 ListView 项目,最好使用选择器而不是覆盖 OnTouchListener()。

如果要设置颜色,则需要 StateListDrawable。您可以使用 android:listSelector 属性在您的列表中设置它,在 XML 中定义可绘制对象:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_enabled="false" android:state_focused="true"
        android:drawable="@drawable/item_disabled" />
  <item android:state_pressed="true"
        android:drawable="@drawable/item_pressed" />
  <item android:state_focused="true"
        android:drawable="@drawable/item_focused" />
</selector>

或者您可以对 ListView 的项目使用相同的选择器。

于 2012-08-02T12:49:21.163 回答