【问题标题】:Clickable View Pager in AndroidAndroid 中的可点击视图寻呼机
【发布时间】:2017-04-20 15:22:45
【问题描述】:

我想在我的 View Pager 中设置点击事件。我的ViewPagerAdapter 看起来像这样-

public class ViewPagerAdapder extends PagerAdapter {

    Activity activity;
    String image[];

    public ViewPagerAdapder(Activity act, String[] imgArra) {
        image = imgArra;
        activity = act;
    }

    public int getCount() {
        return image.length;
    }

    public Object instantiateItem(View collection, final int position) {
        ImageView view = new ImageView(activity);

        view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                                    ViewGroup.LayoutParams.MATCH_PARENT));
        new ImageDownloaderTask(view).execute(image[position]);
        view.setScaleType(ImageView.ScaleType.CENTER_CROP);
        view.setAdjustViewBounds(true);
        ((ViewPager) collection).addView(view, 0);

    //  view.setBackgroundResource(imageArray[position]);

        return view;
    }

    @Override
    public void destroyItem(View arg0, int arg1, Object arg2) {
        ((ViewPager) arg0).removeView((View) arg2);
    }

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        return arg0 == ((View) arg1);
    }

    @Override
    public Parcelable saveState() {
        return null;
    }
}

我在我的主要活动中像这样设置OnClickListener

 myPager = (ViewPager) view.findViewById(R.id.viewpager);

        myPager.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getActivity(), "Ckecking Success",
                        Toast.LENGTH_SHORT).show();
            }
}

我的 ViewPager 工作正常。我尝试在 Main Activity 和 ViewPagerAdapter 类中实现 OnClickListener。这两种方式都行不通。

【问题讨论】:

    标签: java android android-viewpager onclicklistener


    【解决方案1】:

    使用此类查看寻呼机点击。

    ClickableViewPager.java

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

    点击事件

    clickablePager.setOnItemClickListener(new ClickableViewPager.OnItemClickListener() {
                @Override
                public void onItemClick(int position) {
        }
     });
    

    【讨论】:

    • 这将获取onItemClick中currentItem的位置,而不是执行点击事件的Item的位置。
    【解决方案2】:

    您不能将 onClickListener 用于 viewPager。您需要按以下方式使用,

    将 MotionEvent 发送到 GestureDetector

    tapGestureDetector = new GestureDetector(this, new TapGestureListener());
    
    viewPager.setOnTouchListener(new OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                tapGestureDetector.onTouchEvent(event);
                return false;
            }
    });
    

    参考:https://stackoverflow.com/a/11666743/1084174

    【讨论】:

      【解决方案3】:
         viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
      
              @Override
              public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                  Log.d(TAG, "onPageScrolled")
              }
      
              @Override
              public void onPageSelected(int position) {
                  Log.d(TAG, "onPageScrollStateChanged")
              }
      
              @Override
              public void onPageScrollStateChanged(int state) {
                   Log.d(TAG, "onPageScrollStateChanged")
      
              }
          });
      

      在你的活动中使用上面的代码片段并在方法中执行你想做的事情

      【讨论】:

      • 我在这些方法中尝试了 OnClick 事件。它也不起作用
      • 你能把 View pager 放在合适的位置吗,滚动发生了吗?
      • 您想在整个页面上应用点击还是在该页面上应用特定控件?
      猜你喜欢
      • 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
      相关资源
      最近更新 更多