【问题标题】:Android ListView running an event on Item Long Click ReleaseAndroid ListView 在 Item Long Click Release 上运行事件
【发布时间】:2013-08-09 20:08:33
【问题描述】:

我在 ListView 中使用 OnItemClickListener 和 OnItemLongClickListener,现在我正在寻找一种方法来检测 OnItemLongClick 之后的释放操作,最好的方法是什么?

【问题讨论】:

    标签: android events android-listview touch listener


    【解决方案1】:

    虽然我接受了@g00dy 的回答,但我发现这个解决方案更适合我的需求,并将我的代码保存在一个地方。

    在我设置 listView 的 Activity 中,我正在这样做:

    MyOnLongClickListener myListener = new MyOnLongClickListener(this);
    listView.setOnItemLongClickListener(myListener);
    listView.setOnTouchListener(myListener.getReleaseListener());
    

    所有的魔法都发生在“MyOnLongClickListener”中:

    public class MyOnLongClickListener implements AdapterView.OnItemLongClickListener {
    
        private View.OnTouchListener mReleaseListener = new OnReleaseListener();
        private boolean mEnabled = false;
        private Context mContext;
    
        public MyOnLongClickListener(Context context) {
            mContext = context;
        }
    
        @Override
        public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
            Toast.makeText(mContext, "OnLongClick", Toast.LENGTH_SHORT).show();
            mEnabled = true;
            return true;
        }
    
        /**
         * Returns a listener for the release event.
         * @return
         */
        public View.OnTouchListener getReleaseListener() {
            return mReleaseListener;
        }
    
        /**
         * Listener for the Release event.
         */
        private class OnReleaseListener implements View.OnTouchListener {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if(motionEvent.getAction() == android.view.MotionEvent.ACTION_UP) {
                    if(mEnabled) {
                        Toast.makeText(mContext, "Release", Toast.LENGTH_SHORT).show();
                        /* Execute... */
                        mEnabled = false;
                        return true;
                    }
                }
                return false;
            }
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      看看here()(主要是here,你应该找ACTION_UP):

      public static final int ACTION_UP

      在 API 级别 1 中添加 getAction() 值:密钥已被释放。

      常数值:1 (0x00000001)

      类似:

      @Override
      public boolean onKeyDown(int keyCode, KeyEvent event)  {
          if (keyCode == KeyEvent.ACTION_UP) {
              // do something on ACTION_UP.
              return true;
          }
      
          return super.onKeyDown(keyCode, event);
      }
      

      【讨论】:

      • 这是一个很好的观点,但我需要绝对确定此发布事件将被调用,终止以 LongClick 开头的操作。如果我选择 KeyEvent,我可能会在 ListView 本身上使用它, listView.setOnKeyListener();使用起来足够安全吗?
      • 你可以把方法名从onKeyDow改成onKeyLongPress,保留函数体,这样就够了
      猜你喜欢
      • 1970-01-01
      • 2013-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-14
      • 1970-01-01
      相关资源
      最近更新 更多