【问题标题】:ViewPager OnItemClickListenerViewPager OnItemClickListener
【发布时间】:2013-05-03 03:11:49
【问题描述】:

我是 Viewpager 的新手,在阅读了来自 google 的 http://developer.android.com/reference/android/support/v4/view/ViewPager.html 之后,我似乎在 viewPager.setOnItemClickListener(new OnItemClickListener() { 上找不到任何相关内容我们是否还有其他选项可以充当 Item Clicked?

测试

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(new AdapterView.OnItemClickListener(){}) 未定义

【问题讨论】:

    标签: android android-viewpager


    【解决方案1】:

    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() 内还做了什么,您还没有发布,所以我无法给您更具体的答案。

    【讨论】:

    • 我们可以从 OnClick 中获取位置吗?
    • @DroidBeginner 如果位置是指 x/y,那么您将不得不使用 OnTouchListener() 而不是 onClick 并从传递给 onTouch() 方法的 MotionEvent 中获取 x/y。如果您的意思是用户在哪个页面上的位置,那么只需使用传递给实例化项目的int pos 参数即可。我将编辑我的答案以包括后者。
    • 你指引我朝着正确的方向前进。我将onClickListener 放在View 上,该View 在我的片段的onCreateView() 中返回。
    • instantiateItem 已弃用
    • @Arpit-patel 从什么时候开始?
    【解决方案2】:

    我实现了自定义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;
           }
        }
    }
    

    以及实现onItemClickListener的代码

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

    【讨论】:

    • @Aakanksha 没问题)
    • 触摸事件未在我的视图寻呼机上调用。
    • 嗯,对我来说 onTouch 仅在我开始滚动页面时才被调用,而不是在我在 ViewPager 上执行点击时调用。
    • 不错的答案,按照我的要求。
    • 这对我不起作用。当我点击 viewpager 的内容时,永远不会调用 OnClick。
    【解决方案3】:

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

    您可以使用setOnClickListener(View.OnClickListener l) 来检测对 viewPager 的触摸。

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

    @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);
            }
        }
    }
    

    【讨论】:

    • 你把onPageSelected放在哪里了?在 viewpager 适配器或主类中?
    • 您将在适配器中执行此操作(因此被覆盖——您正在用您想做的任何事情覆盖该方法的默认版本)
    • 这些监听器都不提供检测当前页面点击的能力
    • ViewPagers 没有可用的 OnClickListener()。
    【解决方案4】:

    在您的活动中;你可以覆盖:

     @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);
        }
    

    【讨论】:

      【解决方案5】:

      使用 EventBus。

      我只是通过一个简单的解决方案遇到了这个问题,只需在适配器上设置一个 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();
          }
      }
      

      如果您不知道,请检查: https://github.com/greenrobot/EventBus

      希望对你有帮助。

      【讨论】:

        【解决方案6】:
        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;
        }
        

        【讨论】:

        • 如果没有布局,这似乎不是很有用。
        【解决方案7】:

        这是我的解决方案:

         @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;
        
        
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多