我一直在尝试设置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中的选择器。烦人,但我总是可以在代码中做所有的样式,即使这意味着失去了可以使用它的礼节的选择器的优势。这也意味着该项目没有收到点击事件,这是一个交易破坏者
所以,我在这里走到了尽头。我尝试了很多替代方法(自定义视图调用我的监听器和默认值,不同的返回值,......)但没有成功。
有没有人知道如何解决这个问题?
答案 0 :(得分:0)
我已经弄清楚了:
按照设计,OnTouchListener
无法做到这一点。但是,还有其他几种选择
一种是覆盖父dispatchTouchEvent
中的onInterceptTouchEvent
或ViewGroup
。
另一种方法是覆盖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());
这样我就有了一个干净的实现,允许我在按下时编辑任何视图属性,而不会与现有的自定义或行为发生任何冲突。