Listview中的onTouchListener,不会破坏样式或触摸

时间:2014-02-23 15:59:38

标签: android listview

我一直在尝试设置ListView的一些元素。主要是在颜色和颜色之上选择器制作的背景,我想也改变按下项目的字体。这对选择器来说是不可行的,所以我必须通过代码来做到这一点 我尝试了很多方法,没有成功。

简化示例代码来说明问题:

列表视图的适配器中的

getView(..) {
if (convertView == null) {
   convertView = mInflater.inflate(R.layout.mylayout);
   viewHolder = new MyViewHolder();
   ...
   convertView.setOnTouchListener(new MyTouchListener());
   }
}

private class  MyTouchListener implements onTouchListener {

@Override
public boolean onTouchEvent(MotionEvent event) {
..
switch (maskedAction) {

    case MotionEvent.ACTION_DOWN:
    case MotionEvent.ACTION_POINTER_DOWN:
    textView.setTypeface(BOLD);
    break;

    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_POINTER_UP:
    case MotionEvent.ACTION_CANCEL:
    textView.setTypeface(NORMAL); 
    break;
    }
    return false; //// PROBLEM
}

现在,我的问题是,如果我的触摸侦听器为指针向下事件返回false,则表示我没有使用该事件,因此我没有收到后续事件(move,up,..)。所以textview卡在BOLD字体中 如果我为onDown事件返回true,框架会认为事件已经为视图处理过,所以它忽略了我的xml中的选择器。烦人,但我总是可以在代码中做所有的样式,即使这意味着失去了可以使用它的礼节的选择器的优势。这也意味着该项目没有收到点击事件,这是一个交易破坏者 所以,我在这里走到了尽头。我尝试了很多替代方法(自定义视图调用我的监听器和默认值,不同的返回值,......)但没有成功。
有没有人知道如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我已经弄清楚了:
按照设计,OnTouchListener无法做到这一点。但是,还有其他几种选择 一种是覆盖父dispatchTouchEvent中的onInterceptTouchEventViewGroup。 另一种方法是覆盖onCreateDrawableState 由于我已经重载了这个方法(为了创建新的状态),我选择了那个:

@Override
protected int[] onCreateDrawableState(int extraSpace) {
    {...}
    if (mListener != null) {
        if (isPressed() != isPressed) {
            isPressed = isPressed();
            mListener.onPressedStateChange(isPressed);
        }
    }
    return super.onCreateDrawableState(extraSpace);
}

public interface PressedStateListener {

    public void onPressedStateChange(boolean isPressed);
}

PressedStateListener mListener;

public void setOnPressedStateChangedListener(PressedStateListener listener) {
    mListener = listener;
}
在视图中

 private class DropDownOnPressedStateChangedListener implements PressedStateListener {

    @Override
    public void onPressedStateChange(boolean isPressed) {
        if (isPressed) {
            getText().setTypeface(MEDIUM_TYPEFACE, Typeface.NORMAL);
        } else {
            getText().setTypeface(REGULAR_TYPEFACE, Typeface.NORMAL);
        }
    }
适配器中的

  if (convertView == null) {
        view = mInflater.inflate(ENTRY_RESOURCE_ID, parent, false);
        viewHolder = new HeaderDropDownViewHolder(view);
        ((CustomLayout)view).setOnPressedStateChangedListener(viewHolder.getOnListener());

这样我就有了一个干净的实现,允许我在按下时编辑任何视图属性,而不会与现有的自定义或行为发生任何冲突。