首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OnClickListener in PagerAdapter

OnClickListener in PagerAdapter
EN

Stack Overflow用户
提问于 2016-05-25 12:20:57
回答 1查看 1.2K关注 0票数 0

我有一个使用ViewPager的活动,在这个ViewPager中是一个TouchImageView (一个检测手势和相应缩放/移动的ImageView )。

现在,每当单击图像时,我都想更改UI中的一些内容,但是由于TouchImageView是在PagerAdapter中声明的,所以我无法到达它,而且如果我在PagerAdapter上设置了一些东西,我就无法到达我想要更改的UI组件(我还想在我的应用程序中的其他地方使用相同的适配器)。我尝试在onClickListener本身上设置一个ViewPager,但这并不触发。现在我真的不知道该怎么办了。

以下是适配器:

代码语言:javascript
复制
public class FullScreenImageAdapter extends PagerAdapter {

    private ArrayList<MediaFile> images;

    public FullScreenImageAdapter( ArrayList<MediaFile> images) {
        this.images = images;
    }

    @Override
    public int getCount() {
        return images.size();
    }

    @Override
    public View instantiateItem(ViewGroup container, int position) {
        TouchImageView img = new TouchImageView(container.getContext());
        Bitmap bitmap = BitmapFactory.decodeFile(images.get(position).getPath());
        img.setImageBitmap(bitmap);
        container.addView(img, ViewPager.LayoutParams.MATCH_PARENT, ViewPager.LayoutParams.MATCH_PARENT);
        return img;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }
}

下面是与它交互的方法(在ProjectOverviewActivity类中):

代码语言:javascript
复制
private void viewPicture(final int position) {
    View decorView = getWindow().getDecorView();
    statusBarVisibility = decorView.getSystemUiVisibility();
    // Hide the status bar.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);
    } else {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }

    FullScreenImageAdapter imageAdapter = new FullScreenImageAdapter(mediaFiles);
    final ViewPager viewPager = (ViewPager) findViewById(R.id.image_pager);
    viewPager.setAdapter(imageAdapter);
    viewPager.setCurrentItem(position);
    View fancyBox = findViewById(R.id.fancyBox);
    fancyBox.setVisibility(View.VISIBLE);
    viewPager.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            View btnClose = findViewById(R.id.fancyBoxBtnClose);
            View btnPrev = findViewById(R.id.fancyBoxBtnPrev);
            View btnNext = findViewById(R.id.fancyBoxBtnNext);
            if (overlayButtonsVisible) {
                btnClose.setVisibility(View.GONE);
                btnPrev.setVisibility(View.GONE);
                btnNext.setVisibility(View.GONE);
            } else {
                btnClose.setVisibility(View.VISIBLE);
                if (viewPager.getCurrentItem() > 0) {
                    btnPrev.setVisibility(View.VISIBLE);
                }
                if (viewPager.getCurrentItem() < (mediaFiles.size() - 1)) {
                    btnNext.setVisibility(View.VISIBLE);
                }
            }
            overlayButtonsVisible = !overlayButtonsVisible;

        }
    });

    View fancyBoxBtnClose = findViewById(R.id.fancyBoxBtnClose);
    final View fancyBoxBtnPrev = findViewById(R.id.fancyBoxBtnPrev);
    final View fancyBoxBtnNext = findViewById(R.id.fancyBoxBtnNext);
    fancyBoxBtnClose.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            View decorView = getWindow().getDecorView();
            // Show the status bar.
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                decorView.setSystemUiVisibility(statusBarVisibility);
            } else {
                getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, statusBarVisibility);
            }
            findViewById(R.id.fancyBox).setVisibility(View.GONE);
            setViewAndChildrenEnabled(findViewById(R.id.layoutProjectOverview), true);
            overlayButtonsVisible = false;
        }
    });
    fancyBoxBtnPrev.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            viewPager.setCurrentItem(viewPager.getCurrentItem() - 1);
            if (viewPager.getCurrentItem() == 0) {
                fancyBoxBtnPrev.setVisibility(View.GONE);
            }
        }
    });
    fancyBoxBtnNext.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
            if (viewPager.getCurrentItem() == (mediaFiles.size() - 1)) {
                fancyBoxBtnNext.setVisibility(View.GONE);
            }
        }
    });
}
EN

回答 1

Stack Overflow用户

发布于 2016-05-25 12:35:02

你可以试试这个

更新:

我认为您应该使用ViewPager创建自定义GestureDetector

示例:

代码语言:javascript
复制
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;
    }
    }
}

然后在你的活动中

代码语言:javascript
复制
ClickableViewPager viewPager = (ClickableViewPager) findViewById(R.id.viewPager);
viewPager.setOnItemClickListener(new ClickableViewPager.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                // HADNLE YOUR CLICKS
            }
        });

SOURCE

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37436977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档