简体   繁体   English

ViewPager中的ListView-如何获取项目位置?

[英]ListView in ViewPager - how to get item position?

I want to implement swiping between two pages. 我想在两页之间滑动。 The first page is a ListFragment, with a couple of items. 第一页是ListFragment,其中包含几个项目。 I want to be able to swipe a single item and switch to another Activity to do some processing of that ListItem. 我希望能够滑动单个项目并切换到另一个Activity来对该ListItem进行一些处理。

I've implemented Activity switching using ViewPager - which seems the most reasonable way to handle this. 我已经使用ViewPager实现了Activity切换-这似乎是解决此问题的最合理方法。 However I don't know how to get the swiped item from the ListFragment when switched to the other screen. 但是我不知道当切换到另一个屏幕时如何从ListFragment中获取刷卡项目。

I know there is onListItemClick(), but don't know if it allows to fetch item index after swipe. 我知道有onListItemClick(),但不知道它是否允许在滑动后获取项目索引。 According to what I've found - it doesn't. 根据我的发现-没有。

Any ideas? 有任何想法吗?

I've managed to do this using the following overloaded ViewPager class: 我设法使用下面的重载ViewPager类来做到这一点:

import android.R;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ListView;
import org.ftang.model.Program;

public class TouchingViewPager extends ViewPager {

    private GestureDetector gestureScanner;

    public TouchingViewPager(Context context) {
        super(context);
        gestureScanner = new GestureDetector(simpleOnGestureListener);
    }

    public TouchingViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        gestureScanner = new GestureDetector(simpleOnGestureListener);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        int currentItem = getCurrentItem();
        gestureScanner.onTouchEvent(ev);
        return super.onTouchEvent(ev);
    }

    GestureDetector.SimpleOnGestureListener simpleOnGestureListener = new GestureDetector.SimpleOnGestureListener() {

        public boolean onDown(Math event) {
            return true;
        }

        public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) {
            Log.d(null,"Fling");
            int MAJOR_MOVE = 120;
            if (event1 == null) event1 = MotionEvent.obtain(0, 0, 0, 0, 0, 0);
            int dx = (int) (event2.getX() - event1.getX());
            // don't accept the fling if it's too short
            // as it may conflict with a button push
            if (Math.abs(dx) > MAJOR_MOVE && Math.abs(velocityX) > Math.abs(velocityY)) {
                if (velocityX > 0) {
                    // nothing
                } else {
                    ListView liveView = (ListView) findViewById(R.id.list);
                    Program program = (Program) liveView.getAdapter()
                            .getItem(liveView.pointToPosition((int)event1.getX(), (int)event1.getY()));
                    program.getName();
                } 
                return true;
            } else {
                return false;
            }
        }

    };
}

Note that I'm calling gestureScanner once again in onTouchEvent. 请注意,我在onTouchEvent中再次调用了手势扫描器。 I suppose I could wire somehow the custom getsutureScanner so that it would be handling all the touch events. 我想我可以以某种方式连接自定义getsutureScanner,以便它可以处理所有触摸事件。 However since I'm not familiar with how ViewPager events are handled, I've decided to call my own handler side by side. 但是,由于我不熟悉ViewPager事件的处理方式,因此我决定并排调用自己的处理程序。

If there is a better way to do this - please let me know. 如果有更好的方法可以进行此操作,请告诉我。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM