【问题标题】:How to handle ListView Item LongPress gesture如何处理 ListView 项目 LongPress 手势
【发布时间】:2013-12-01 07:05:25
【问题描述】:

我在事件处理方面有一些小问题,我有列表视图自定义适配器数据,每一行都有日期、标题、价格。当我单击行时,我需要显示详细信息页面,但是当我长按价格、日期或标题时,我需要对列表视图进行排序。我需要在长按上使用手势。请参考下面我尝试过的代码。

自定义适配器视图

public EventAdapterView(Context context, List<EventUtil> eventList) {

        this.mContext = context;
        this.mEventUtil = eventList;
        mLayoutInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        imageLoader = new DrawableManager();

    }

    @SuppressLint("DefaultLocale")
    @SuppressWarnings("deprecation")
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        mView = convertView;
        EventUtil eventUtil = mEventUtil.get(position);

        mView = mLayoutInflater.inflate(R.layout.row_event_adapter, null);

        TextView eventTitleView = (TextView) mView
                .findViewById(R.id.list_view_event_title);
        TextView eventDescView = (TextView) mView
                .findViewById(R.id.list_view_event_location);
        TextView eventDateView = (TextView) mView
                .findViewById(R.id.list_view_event_price);

        // final MyGestureDetector myGestureDetector= new MyGestureDetector();

        // new ImageFeach().execute(mEventUtil.getEvent_Image_Url());

        eventTitleView.setText(eventUtil.getEvent_Title());

        // event title sorting

        eventTitleView.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                new MyGestureDetector() {

                    public void onLongPress(MotionEvent event1) {

                        //if (event1.getAction() == MotionEvent.ACTION_DOWN) {
                            Collections.sort(mEventUtil,
                                    new Comparator<EventUtil>() {

                                        @Override
                                        public int compare(EventUtil obje1,
                                                EventUtil obje2) {

                                            return obje1
                                                    .getEvent_Title()
                                                    .compareTo(
                                                            obje2.getEvent_Title());
                                        }

                                    });

                            notifyDataSetChanged();
                        //}

                    };

                }.onLongPress(event);

                return true;
            }
        });

        // event location sorting
        eventDescView.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                new MyGestureDetector() {

                    public void onLongPress(MotionEvent event1) {

                        //if (event1.getAction() == MotionEvent.ACTION_DOWN) {
                            Collections.sort(mEventUtil,
                                    new Comparator<EventUtil>() {

                                        @Override
                                        public int compare(EventUtil event1,
                                                EventUtil event2) {

                                            return event1
                                                    .getEvent_location()
                                                    .compareTo(
                                                            event2.getEvent_location());
                                        }

                                    });
                            notifyDataSetChanged();
                        //}

                    };

                }.onLongPress(event);

                return true;
            }
        });

        // event price sorting
        eventDateView.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                new MyGestureDetector() {

                    public void onLongPress(MotionEvent event1) {

                    //  if (event1.getAction() == MotionEvent.ACTION_DOWN) {
                            Collections.sort(mEventUtil,
                                    new Comparator<EventUtil>() {

                                        @Override
                                        public int compare(EventUtil event1,
                                                EventUtil event2) {

                                            return event1
                                                    .getEvent_Price()
                                                    .compareTo(
                                                            event2.getEvent_Price());
                                        }

                                    });
                            notifyDataSetChanged();
                        //}

                    };

                }.onLongPress(event);

                return true;
            }
        });

        // event date sorting
        ImageView dateImageView = (ImageView) mView
                .findViewById(R.id.list_view_event_date);

        dateImageView.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                new MyGestureDetector() {

                    public void onLongPress(MotionEvent event1) {

                        //if (event1.getAction() == MotionEvent.ACTION_DOWN) {
                            Collections.sort(mEventUtil,
                                    new Comparator<EventUtil>() {

                                        @Override
                                        public int compare(EventUtil event1,
                                                EventUtil event2) {

                                            return event2
                                                    .getEvent_Date()
                                                    .compareTo(
                                                            event1.getEvent_Date());
                                        }
                                    });
                            notifyDataSetChanged();
                        //}

                    };

                }.onLongPress(event);


                return true;
            }
        });

MyGestureDetector 类

public class MyGestureDetector extends SimpleOnGestureListener {

    @Override
    public void onLongPress(MotionEvent e) {

        super.onLongPress(e);
    }



}

帮帮我..谢谢

【问题讨论】:

  • 那么发生了什么?发生任何错误??
  • 有没有理由不使用ListView 方法进行长按? onItemLongClickListener
  • @Neil 我认为用户希望在ListView 的每个元素上实现onItemLongClickListener
  • 是的,但这就是 onItemLongClickListener 的用途。看看@Dhaval 的回答
  • 由于该问题仅询问 LongClick on Row,因此我的回答是正确的。但是,如果我们希望行的元素具有这样的侦听器,那么您的回答 @shree202 是正确的。干杯。

标签: android android-listview android-event android-gesture


【解决方案1】:
 ListView.setOnItemLongClickListener(new OnItemLongClickListener() {

            @Override
            public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                    int arg2, long arg3) {
                // YOUR SORTING CODE HERE

                return false;
            }
        });

【讨论】:

  • 但我需要处理 onItemClick 监听器,然后我需要从单个视图 OnLong Press 像价格 longPress ,日期 Long Press 然后我需要执行排序
  • 根据您的问题,您需要在LongClick上对列表进行排序。然后这是您放置排序代码的地方。如果您申请 onCLickListener,那么如果您正在启动另一个详细信息活动,您将如何留在 ListView Activity 上执行 LongClick?
【解决方案2】:

我认为,没有必要使用SimpleOnGestureListener

在您的自定义适配器视图中:

首先,

eventTitleView.setFocusable(false); 
eventTitleView.setFocusableInTouchMode(false);
eventTitleView.setLongClickable(true);

eventDescView.setFocusable(false); 
eventDescView.setFocusableInTouchMode(false);
eventDescView.setLongClickable(true);

eventDateView.setFocusable(false); 
eventDateView.setFocusableInTouchMode(false);
eventDateView.setLongClickable(true);

那么, 只需将setOnLongClickListener (View.OnLongClickListener l) 设置为eventTitleVieweventDescVieweventDateView 为,

eventTitleView.setOnItemLongClickListener(new OnItemLongClickListener() {
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            //do your sorting stuff here
        }
    });

eventDescView.setOnItemLongClickListener(new OnItemLongClickListener() {
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            //do your sorting stuff here
        }
    });

eventDateView.setOnItemLongClickListener(new OnItemLongClickListener() {
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            //do your sorting stuff here
        }
    });

希望对你有所帮助。

【讨论】:

    【解决方案3】:

    我已经通过 onLongClickListener 完成了这项工作。使用这个界面很容易。你需要做的

    Class YourClass implements onLongClickListener{
    
     public boolean onLongClick(View arg0){                                 
    
     // Event generated when user have long pressed the screen
    
      return false; // If you do not want the event to keep occuring again and again
    
    } 
    

    【讨论】:

      【解决方案4】:

      为什么需要覆盖 onlongpress?

      你知道这个功能默认是可用的吧?

      只需将价格、日期或标题放在同一个布局上,并为每个 OnLongPressListener 提供您想要的操作..:

      示例: http://www.mikeplate.com/2010/01/21/show-a-context-menu-for-long-clicks-in-an-android-listview/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-11
        • 2015-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-01
        • 2012-07-22
        • 2012-01-05
        相关资源
        最近更新 更多