Android OnLongClickListener in按钮位于ListView内

Android OnLongClickListener in按钮位于ListView内,android,android-listview,onlongclicklistener,Android,Android Listview,Onlongclicklistener,我有一个问题,一个按钮的异常行为。实际上,它是数量字段的两个按钮加号(+)和减号(-) 这些按钮在ListView中,我可以毫无问题地处理OnClickListener,但是当我放置OnLongClickListener时。。。我在两个不同的列表视图中有两个问题: 1) 所有的信息和行为都是正常的,但是当我长按按钮时,我的自动增加/减少值处理程序启动,但是,我认为,因为焦点他失去了控制,甚至当我松开按钮时,处理程序也没有停止。我在对话框中出于同样的目的使用了相同的处理程序,并且工作得很好 2)

我有一个问题,一个按钮的异常行为。实际上,它是数量字段的两个按钮加号(+)和减号(-)

这些按钮在ListView中,我可以毫无问题地处理OnClickListener,但是当我放置OnLongClickListener时。。。我在两个不同的列表视图中有两个问题:

1) 所有的信息和行为都是正常的,但是当我长按按钮时,我的自动增加/减少值处理程序启动,但是,我认为,因为焦点他失去了控制,甚至当我松开按钮时,处理程序也没有停止。我在对话框中出于同样的目的使用了相同的处理程序,并且工作得很好

2) 在另一个ListView中,当我放置OnLongClickListener时,一些字段(TextView、微调器)停止工作

这是我的处理程序,它是一个类中继器,在OnTouchListener和OnLongClickListener中实现:

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){//做点什么}