Android OnLongClickListener in按钮位于ListView内
我有一个问题,一个按钮的异常行为。实际上,它是数量字段的两个按钮加号(+)和减号(-) 这些按钮在ListView中,我可以毫无问题地处理OnClickListener,但是当我放置OnLongClickListener时。。。我在两个不同的列表视图中有两个问题: 1) 所有的信息和行为都是正常的,但是当我长按按钮时,我的自动增加/减少值处理程序启动,但是,我认为,因为焦点他失去了控制,甚至当我松开按钮时,处理程序也没有停止。我在对话框中出于同样的目的使用了相同的处理程序,并且工作得很好 2) 在另一个ListView中,当我放置OnLongClickListener时,一些字段(TextView、微调器)停止工作 这是我的处理程序,它是一个类中继器,在OnTouchListener和OnLongClickListener中实现:Android OnLongClickListener in按钮位于ListView内,android,android-listview,onlongclicklistener,Android,Android Listview,Onlongclicklistener,我有一个问题,一个按钮的异常行为。实际上,它是数量字段的两个按钮加号(+)和减号(-) 这些按钮在ListView中,我可以毫无问题地处理OnClickListener,但是当我放置OnLongClickListener时。。。我在两个不同的列表视图中有两个问题: 1) 所有的信息和行为都是正常的,但是当我长按按钮时,我的自动增加/减少值处理程序启动,但是,我认为,因为焦点他失去了控制,甚至当我松开按钮时,处理程序也没有停止。我在对话框中出于同样的目的使用了相同的处理程序,并且工作得很好 2)
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);
if( view.isPressed() ){
getView().performClick();
repeatHandler.postDelayed( new RptUpdater(), REP_DELAY );
}
这是我在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"
/>
为此,在中继器中:
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);
if( view.isPressed() ){
getView().performClick();
repeatHandler.postDelayed( new RptUpdater(), REP_DELAY );
}
所以,现在,当调用notify…()时,他停止增加/减少,但这不是我们想要的行为。有人知道“延迟”通知的原因吗?或者,如果用户仍在按按钮,则再次将焦点设置为按钮(并保持按下状态)?我在适配器的getView()中尝试了此操作,并且它工作正常,listview和按钮功能没有任何错误:
testButton.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Toast.makeText(context, "long click achieved", Toast.LENGTH_SHORT).show();
testButton.setVisibility(View.INVISIBLE);
return false;
}
});
您可以尝试在getView中编写onlongclick功能,看看它是否是这样工作的吗?顺便说一下,我的测试按钮和列表xml文件上没有焦点说明:
<Button
android:id="@+id/test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
名单如下:
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
谢谢您的回答,但是长点击操作很好,但是中继器无法执行“启动”/“取消”操作,当我松开按钮时,会出现这种情况。OnTouchListener需要知道如何停止处理程序,即使所有的逻辑都在CustomAdapter中:(然后我建议实现一个GestureDetector,这样您就可以正确地获取触摸事件,比如;@Override public void onLongPress(MotionEvent e){//Do something}public boolean onDown(MotionEvent e){//做点什么}