我遇到了问题,并且按钮的行为异常。实际上它是数量字段的两个按钮加(+)和减(-)。
这些按钮在 ListView 内,我可以毫无问题地处理 OnClickListener,但是当我放置 OnLongClickListener 时……我在两个不同的 ListView 中有两个问题:
1)所有信息和行为都正常,但是当我长按按钮时,我的处理程序自动增加/减少值启动,但是,我认为,因为焦点他失去了控制,即使我释放按钮,处理程序也不会'停下来。我在对话框中出于相同目的使用了相同的处理程序,并且工作正常。
2)在另一个 ListView 中,当我放置 OnLongClickListener 时,我有一些字段(TextView、Spinner)停止工作。
这是我的处理程序,它是一个在 OnTouchListener 和 OnLongClickListener 中实现的类Repeater:
public class Repeater implements OnTouchListener, OnLongClickListener{
private View view;
private Repeater other_repeater;
private int REP_DELAY = 50;
private Handler repeatHandler = new Handler();
private boolean mAutoRepeater = false;
public Repeater(){}
public Repeater(View view){
this.setView(view);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if(( event.getAction() == MotionEvent.ACTION_UP ||
event.getAction() == MotionEvent.ACTION_CANCEL ||
event.getAction() == MotionEvent.ACTION_HOVER_EXIT ||
event.getAction() == MotionEvent.ACTION_OUTSIDE)
&& mAutoRepeater ){
mAutoRepeater = false;
}
return false;
}
@Override
public boolean onLongClick(View v) {
if(getOther_repeater() != null){
getOther_repeater().stop();
}
mAutoRepeater = true;
repeatHandler.post( new RptUpdater() );
return false;
}
private class RptUpdater implements Runnable {
public void run() {
if( mAutoRepeater ){
getView().performClick();
repeatHandler.postDelayed( new RptUpdater(), REP_DELAY );
}
}
}
public void stop(){
mAutoRepeater = false;
}
public void setView(View view) {
this.view = view;
}
public View getView() {
return view;
}
public void setOther_repeater(Repeater other_repeater) {
this.other_repeater = other_repeater;
}
public Repeater getOther_repeater() {
return other_repeater;
}
}
我为每个 ListView 都有我的 CustomAdapter,几乎有一千行......下面的代码是我设置中继器的地方:
Repeater qt_produto_menos_repeater = new Repeater(viewHolder.qt_produto_menos);
viewHolder.qt_produto_menos.setOnTouchListener (qt_produto_menos_repeater);
viewHolder.qt_produto_menos.setOnLongClickListener(qt_produto_menos_repeater);
Repeater qt_produto_mais_repeater = new Repeater(viewHolder.qt_produto_mais);
viewHolder.qt_produto_mais.setOnTouchListener (qt_produto_mais_repeater);
viewHolder.qt_produto_mais.setOnLongClickListener(qt_produto_mais_repeater);
qt_produto_menos_repeater.setOther_repeater(qt_produto_mais_repeater);
qt_produto_mais_repeater.setOther_repeater(qt_produto_menos_repeater);
这是我在 xml 中的 ListView:
<ListView
android:id="@+id/lv_resultado_produtos"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:divider="@color/Black"
android:dividerHeight="1dip"
android:fastScrollEnabled="true"
android:scrollX="0dip"
android:scrollY="0dip"
android:scrollbarSize="22dip"
android:scrollbarStyle="outsideOverlay"
/>
我不知道为什么按钮的 OnClickListener 工作正常而 OnLongClick 没有。
请一些帮助,我坚持了几天。
[编辑]
LongClick 工作正常,但是当我释放按钮时,Repeater 无法获得“UP”/“CANCEL”动作。OnTouchListener 需要知道停止 Handler,即使所有逻辑都在 CustomAdapter 中。而且这个是针对一个ListView,另一个是让其他领域疯狂,但是如果我能解决“释放按钮”的问题,我会很高兴的!
[编辑2]
最后我隔离了这个问题。第二个 ListView 我解决了这个问题,我的 Repeater 在所有逻辑之后都被调用了,我不知道为什么,但这让列表变得疯狂!
第一个问题,我发现 notifyDataSetChanged() 搞砸了一切,当调用 notify...() 时按钮失去焦点,Repeater 从来没有得到停止增加/减少的“命令”,我部分解决了改变这个:
if( mAutoRepeater ){
getView().performClick();
repeatHandler.postDelayed( new RptUpdater(), REP_DELAY );
}
为此,在中继器中:
if( view.isPressed() ){
getView().performClick();
repeatHandler.postDelayed( new RptUpdater(), REP_DELAY );
}
所以,现在,当 notify...() 被调用时,他停止增加/减少,但这不是我们想要的行为。有人知道“延迟”通知吗?或者如果用户仍在按下按钮,则再次将焦点设置到按钮(并保持按下状态)?