处理程序无法在Android的View Holder中工作

时间:2019-06-12 04:59:08

标签: android handler

我正在尝试在 ViewHolder 类中使用带有 ViewPager 的自动图像滑块制作RecyclerView。 问题是执行了处理程序,但是onPageChangeListener无法正常工作。 我们称其为 adView

public class BannerViewHolder extends BaseViewHolder<BannerResponse> {

@BindView(R.id.adViewPager)
ViewPager adViewPager;
@BindView(R.id.dotIndicator)
PageIndicatorView indicator;
private ImageViewPagerAdapter mImagePagerAdapter;
private Handler handler = new Handler();
private int bannerImageSize = 0;
private int currentPage = 0;

private final Runnable sliderPage = () -> {
    currentPage++;
    if (currentPage == bannerImageSize - 1) {
        currentPage = 0;
    }
};

public BannerViewHolder(View itemView) {
    super(itemView);
    ButterKnife.bind(this, itemView);
    mImagePagerAdapter = new ImageViewPagerAdapter(itemView.getContext());
}


@Override
public void setData(BannerResponse mData) {
    if (mData != null && mData.getBannerList() != null && !mData.getBannerList().isEmpty()) {
        mImagePagerAdapter.setData(mData.getBannerList());
        adViewPager.setAdapter(mImagePagerAdapter);
        bannerImageSize = mData.getBannerList().size();
        indicator.setViewPager(adViewPager);
        handler.postDelayed(sliderPage, 1000);
        adViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                indicator.setSelection(position);
                currentPage = position;
                handler.removeCallbacks(sliderPage);
                handler.postDelayed(sliderPage, 2000);

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }
}}    

此adView在RecyclerView之外而不是RecyclerView内cardItem的一部分中完成时,它正在工作。但是,当它在ViewHolder的{​​{1}}中实现时,此方法不起作用。 RecyclerView膨胀了,滑块不起作用。

已编辑 - 我还想知道在 ViewHolder 中声明 Handler Runnable 的效果。它会导致内存泄漏吗?如果是这样,我该如何避免呢?

1 个答案:

答案 0 :(得分:1)

private final Runnable sliderPage = () -> {
  currentPage++;
  if (currentPage == bannerImageSize - 1) {
    currentPage = 0;
  }
  viewPager.setCurrentItem(currentPage);
};