【问题标题】:Find out which item in ListView was swiped找出 ListView 中的哪个项目被刷过
【发布时间】:2015-12-17 22:10:51
【问题描述】:

我正在尝试在我的 ListView 中滑动一行,识别其文本并执行某些操作。我能够检测到左/右滑动,但是如何识别该滑动行的文本?与使用 onItemClickListener 可以使用位置变量不同,我无法识别它的位置。

MainActivity 类

ListView orderListView;
ArrayList<String> orders;
ArrayAdapter<String> adapter;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_order_stock);

        orderListView = (ListView)findViewById(R.id.orderListView);
        orders = new ArrayList<>();
        orders.add("order 1");
        orders.add("order 2");
        orders.add("order 3");
        adapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_list_item_1, orders);
        orderListView.setAdapter(adapter);

        OnSwipeTouchListener onSwipeTouchListener = new OnSwipeTouchListener(this, orderListView);
        orderListView.setOnTouchListener(onSwipeTouchListener);
    }

OnSwipeTouchListener 类

public class OnSwipeTouchListener implements View.OnTouchListener {

    ListView list;
    private GestureDetector gestureDetector;
    private Context context;

    public OnSwipeTouchListener(Context ctx, ListView list) {
        gestureDetector = new GestureDetector(ctx, new GestureListener());
        context = ctx;
        this.list = list;
    }

    public OnSwipeTouchListener() {
        super();
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
    }

    public void onSwipeRight(int pos) {
        Log.i("zxR", "right");
    }

    public void onSwipeLeft() {
        Log.i("zxL", "left");
    }

    private final class GestureListener extends GestureDetector.SimpleOnGestureListener {

        private static final int SWIPE_THRESHOLD = 100;
        private static final int SWIPE_VELOCITY_THRESHOLD = 100;

        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }

        private int getPostion(MotionEvent e1) {
            return list.pointToPosition((int) e1.getX(), (int) e1.getY());
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            float distanceX = e2.getX() - e1.getX();
            float distanceY = e2.getY() - e1.getY();
            if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                if (distanceX > 0)
                    onSwipeRight(getPostion(e1));
                else
                    onSwipeLeft();
                return true;
            }
            return false;
        }

    }
}

【问题讨论】:

    标签: java android android-listview


    【解决方案1】:

    试试这个,我认为这可能会有所帮助: 在 OnSwipeTouchListener 的构造函数的参数中包含 ArrayAdapter 并从主活动中传递 ListView 的适配器

    然后将此代码添加到您的 onFling()

    float distanceX = e2.getX() - e1.getX();
            float distanceY = e2.getY() - e1.getY();
            int id = list.pointToPosition((int) e1.getX(), (int) e1.getY());
    
            String text=adapter.getItem(id);
            Toast.makeText(context,"Text:"+text,Toast.LENGTH_SHORT).show();
    

    【讨论】:

      【解决方案2】:

      使用新的 RecyclerView 代替 ListView,因为它有用于手势和动画的简单 api。

      对于 RecyclerView 的同样问题: https://stackoverflow.com/a/30601554/2627680

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-22
        • 2011-08-13
        • 2017-06-02
        • 2012-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多