Android ViewPager侦听器

Android ViewPager侦听器,android,android-viewpager,Android,Android Viewpager,我是Viewpager的新手,从google上阅读之后,我似乎找不到与Viewpager.setOnItemClickListener(new OnItemClickListener(){我们是否有其他选项作为单击的项目 测试 viewPager.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?&

我是Viewpager的新手,从google上阅读之后,我似乎找不到与
Viewpager.setOnItemClickListener(new OnItemClickListener(){
我们是否有其他选项作为单击的项目

测试

viewPager.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                Intent i = new Intent(MainActivity.this, SingleItemView.class);
                i.putExtra("flag", flag);
                i.putExtra("position", position);
                startActivity(i);
            }

        });
viewPager.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
意图i=新意图(MainActivity.this,SingleItemView.class);
i、 putExtra(“旗帜”,旗帜);
i、 putExtra(“位置”,位置);
星触觉(i);
}
});
错误:
ViewPager类型的方法setOnItemClickListener(new AdapterView.OnItemClickListener(){})未定义。ViewPager没有OnItemClick回调方法。如果要在每个页面上单击事件,则必须将侦听器构建到适配器内的页面内容中

大概是这样的:

@Override
public Object instantiateItem(View collection, final int pos) { //have to make final so we can see it inside of onClick()
    LayoutInflater inflater = (LayoutInflater) collection.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);


    View page = inflater.inflate(R.layout.YOUR_PAGE, null);

    page.setOnClickListener(new OnClickListener(){
        public void onClick(View v){
            //this will log the page number that was click
            Log.i("TAG", "This page was clicked: " + pos);
        }
    });


    ((ViewPager) collection).addView(page, 0);
    return page;
}

确切地说,您需要什么将在一定程度上取决于您在
instantiateItem()
中所做的其他事情,您还没有发布这些内容,因此我无法给您更具体的答案。

我不确定您希望通过上述侦听器对您做出什么回应

有一个
setOnClickListener(View.OnClickListener l)
,可用于检测对viewPager的触摸

您还可以使用
onPageScrolled
获取用户输入,以及
onPageSelected
onTabSelected

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}

@Override
public void onPageSelected(int position) {
    mActionBar.setSelectedNavigationItem(position);
}

@Override
public void onPageScrollStateChanged(int state) {
}

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    Object tag = tab.getTag();
    for (int i=0; i<mTabs.size(); i++) {
        if (mTabs.get(i) == tag) {
            mViewPager.setCurrentItem(i);
        }
    }
}
@覆盖
已滚动页面上的公共无效(int-position、float-positionOffset、int-positionOffsetPixels){
}
@凌驾
已选择页面上的公共无效(内部位置){
mActionBar.setSelectedNavigationItem(位置);
}
@凌驾
公共无效onPageScrollStateChanged(int状态){
}
@凌驾
已选择的公共事务(选项卡,碎片事务ft){
Object tag=tab.getTag();

对于(int i=0;i我实现了自定义
ViewPager

public class ClickableViewPager extends ViewPager {

    private OnItemClickListener mOnItemClickListener;

    public ClickableViewPager(Context context) {
        super(context);
        setup();
    }

    public ClickableViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        setup();
    }

    private void setup() {
        final GestureDetector tapGestureDetector = new    GestureDetector(getContext(), new TapGestureListener());

        setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                tapGestureDetector.onTouchEvent(event);
                return false;
            }
        });
    }

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        mOnItemClickListener = onItemClickListener;
    }

    public interface OnItemClickListener {
        void onItemClick(int position);
    }

    private class TapGestureListener extends GestureDetector.SimpleOnGestureListener {

        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            if(mOnItemClickListener != null) {
                mOnItemClickListener.onItemClick(getCurrentItem());
            }
            return true;
       }
    }
}
和用于实现侦听器的代码

ClickableViewPager viewPager = (ClickableViewPager) findViewById(R.id.viewPager);
viewPager.setOnItemClickListener(new ClickableViewPager.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                // your code
            }
        });

在活动中,您可以覆盖:

 @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mDownX = ev.getX();
                mDownY = ev.getY();
                break;
            case MotionEvent.ACTION_UP:
                mDownX -= ev.getX();
                mDownY -= ev.getY();
                if(mDownX==0 && mDownY==0)
                   {
                      your action if click
                   }
                break;

        }
        return super.dispatchTouchEvent(ev);
    }
使用事件总线

我只是用一个简单的解决方案来解决这个问题,在适配器上设置OnClickListener,然后发送事件:

public Object instantiateItem(@NonNull ViewGroup container, int position) {
    LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = layoutInflater.inflate(R.layout.category_item_layout, container, false);
    ImageButton itemButton = view.findViewById(R.id.CategoryItem_ib_icon);
    itemButton.setOnClickListener(view1 -> EventBus.getDefault().postSticky(new Event(Constants.onViewPagerItem, position)));
    container.addView(view);
    return view;
}
建造商:

    public Event(int code, int viewPagerPosition) {
    this.code = code;
    this.viewPagerPosition = viewPagerPosition;
}
注册要接收事件的活动:

EventBus.getDefault().register(this);
稍后,只需使用以下内容接收事件:

@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(Event event) {
    if (event.getCode() == Constants.onViewPagerItem) {
        Toast.makeText(getContext(), "Item " + event.getViewPagerPosition(), Toast.LENGTH_SHORT).show();
    }
}
如果您不知道,请检查:

希望有帮助。

这是我的解决方案:

public Object instantiateItem(@NonNull final ViewGroup container, final int position)
{
    layoutInflater = LayoutInflater.from(context);
    View view = layoutInflater.inflate(R.layout.slide,container,false);
    ImageView image;
    TextView title,price;
    image = view.findViewById(R.id.image_id);
    title = view.findViewById(R.id.title_id);
    price = view.findViewById(R.id.price_id);
    image.setImageResource(slidePagers.get(position).getImage());
    title.setText((CharSequence) slidePagers.get(position).getTtile());
    price.setText((CharSequence) slidePagers.get(position).getPrice());
    view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v)
        {
            if(position==0)
            {
                Intent intent = new Intent(context,getdata.class);
                context.startActivity(intent);
            }
            if(position==1)
            {
                Toast.makeText(context, "second Position", Toast.LENGTH_SHORT).show();
            }
            if(position==2)
            {
                Toast.makeText(context, "Third position ", Toast.LENGTH_SHORT).show();
            }

        }
    });
    container.addView(view,0);

    return view;
}
 @Override
public Object instantiateItem(ViewGroup container, int position) {

    MainActivity.MainImageList list = imageLists.get(position);
    String image = list.getImage();

    ImageView imageView = new ImageView(context);
    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);

    String webImage = context.getResources().getString(R.string.websiteCapsuleImages);
    Picasso.get().load(webImage + image).into(imageView);

    View page = imageView;

    page.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v){
            //this will log the page number that was click
            Log.i("TAG", "This page was clicked: ");
        }
    });

    container.addView(imageView, 0);
    return imageView;



}

您将onPageSelected放在哪里?在viewpager适配器或main类中?您将在适配器中执行此操作(因此被高估了--您正在用您想要执行的任何操作覆盖该方法的默认版本)。这些侦听器都无法检测对当前页面的单击。没有OnClickListener()可用于ViewPagers。我们可以从OnClick中获取位置吗?@DroidBeginner如果位置指的是x/y,则必须使用OnTouchListener()而不是OnClick,并从传递给onTouch()的MotionEvent中获取x/y方法。如果您指的是用户所在页面的位置,那么只需使用传递给实例化项的
int pos
参数即可。我将编辑我的答案以包含后者。您指导了我正确的方向。我将
onClickListener
放在
视图上,该视图将在片段的
o中返回nCreateView()
。实例化项为DEPRICATED@Arpit-patel从什么时候开始?@Aakanksha没问题)触摸事件不会在我的浏览页面上调用。嗯,对我来说,只有在我开始滚动页面时才会调用触摸事件,但在我在浏览页面时不会调用触摸事件。根据我的要求,回答得很好。如果没有布局,这似乎不是很有用。