0
  • public class VKLooperPager extends LinearLayout {
        
        private VKViewPager mViewPager;
        private LinearLayout mPointContainer;
        private TextView mTitleTv;
        private BindTitleListener mTitleSetListener = null;
        private InnerAdapter mInnerAdapter = null;
        private OnItemClickListener mOnItemClickListener = null;
        private boolean mIsTitleShow;
        private int mPagerShowCount;
        private int mSwitchTime;
    
    
        public VKLooperPager(Context context) {
            this(context,null);
        }
    
        public VKLooperPager(Context context, @Nullable AttributeSet attrs) {
            this(context,attrs,0);
        }
    
        public VKLooperPager(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context,attrs,defStyleAttr);
            LayoutInflater.from(context).inflate(R.layout.looper_pager_layout,this,true);
            TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.looper_style);
            //从TypedArray中读取属性值
            mIsTitleShow = ta.getBoolean(R.styleable.looper_style_is_title_show,true);
            mPagerShowCount = ta.getInteger(R.styleable.looper_style_show_pager_count,1);
            mSwitchTime = ta.getInteger(R.styleable.looper_style_switch_time,-1);
            ta.recycle();
            init();
        }
    
        private void init() {
            initView();
            initEvent();
        }
    
        private void initEvent() {
            mViewPager.setPagerItemClickListener(new VKViewPager.OnPagerItemClickListener() {
                @Override
                public void onItemClick(int position) {
                    if(mOnItemClickListener != null && mInnerAdapter != null) {
                        int realPosition = position % mInnerAdapter.getDataSize();
                        mOnItemClickListener.onItemClick(realPosition);
                    }
                }
            });
            mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override
                public void onPageScrolled(int position,float positionOffset,int positionOffsetPixels) {
                    //切换的一个回调方法
                }
    
                @Override
                public void onPageSelected(int position) {
                    //切换停下来的回调
                    if(mInnerAdapter != null) {
                        //停下来以后,设置标题
                        int realPosition = position % mInnerAdapter.getDataSize();
                        //
                        if(mTitleSetListener != null) {
                            mTitleTv.setText(mTitleSetListener.getTitle(realPosition));
                        }
                        // 切换指示器焦点
                        updateIndicator();
                    }
                }
    
                @Override
                public void onPageScrollStateChanged(int state) {
                    //切换状态改变的回调
    
                }
            });
        }
    
    
        public interface BindTitleListener {
            String getTitle(int position);
        }
    
        public void setData(InnerAdapter innerAdapter,BindTitleListener listener) {
            this.mTitleSetListener = listener;
            mViewPager.setAdapter(innerAdapter);
            mViewPager.setCurrentItem(Integer.MAX_VALUE / 2 + 1);
            this.mInnerAdapter = innerAdapter;
            if(listener != null) {
                mTitleTv.setText(listener.getTitle(mViewPager.getCurrentItem() % mInnerAdapter.getDataSize()));
            }
            //可以得到数据的个数,根据数据个数,来动态创建圆点,indicator
            updateIndicator();
        }
    
        public abstract static class InnerAdapter extends PagerAdapter {
    
            @Override
            public int getCount() {
                return Integer.MAX_VALUE;
            }
    
            @Override
            public boolean isViewFromObject(@NonNull View view,@NonNull Object object) {
                return view == object;
            }
    
            @Override
            public void destroyItem(@NonNull ViewGroup container,int position,@NonNull Object object) {
                container.removeView((View) object);
                container.removeAllViews();
            }
    
            @NonNull
            @Override
            public Object instantiateItem(@NonNull ViewGroup container,int position) {
                final int realPosition = position % getDataSize();
                View itemView = getSubView(container,realPosition);
                container.addView(itemView);
                return itemView;
            }
    
            protected abstract int getDataSize();
    
            protected abstract View getSubView(ViewGroup container,int position);
    
        }
    
        public void setOnItemClickListener(OnItemClickListener listener) {
            this.mOnItemClickListener = listener;
        }
    
    
        public interface OnItemClickListener {
            void onItemClick(int position);
        }
    
        private void updateIndicator() {
            if(mInnerAdapter != null && mTitleSetListener != null) {
                int count = mInnerAdapter.getDataSize();
                mPointContainer.removeAllViews();
                if (mPointContainer == null){
                    for(int i = 0; i < count; i++) {
                        View point = new View(getContext());
                        if(mViewPager.getCurrentItem() % mInnerAdapter.getDataSize() == i) {
    
                            point.setBackgroundResource(R.drawable.shape_circle_read);
                        } else {
                            point.setBackgroundResource(R.drawable.shape_circle_white);
    
                        }
                        LayoutParams layoutParams = new LayoutParams(SizeUtils.dip2px(getContext(),8),SizeUtils.dip2px(getContext(),8));
                        layoutParams.setMargins(SizeUtils.dip2px(getContext(),5),0,SizeUtils.dip2px(getContext(),5),0);
                        mPointContainer.addView(point);
                    }
                }
            }
        }
    
        private void initView() {
            mViewPager = this.findViewById(R.id.looper_pager_vp);
            if(mSwitchTime != -1) {
                mViewPager.setDelayTime(mSwitchTime);
            }
            mViewPager.setOffscreenPageLimit(3);
            mViewPager.setPageMargin(SizeUtils.dip2px(getContext(),0));
            mPointContainer = this.findViewById(R.id.looper_point_container_lv);
            mTitleTv = this.findViewById(R.id.looper_title_tv);
            if(!mIsTitleShow) {
                mTitleTv.setVisibility(GONE);
            }
        }
    }
    
    1277114808973422592  评论     打赏       Vinku
    • 拉大锯  回复 @Vinku
      if (mPointContainer == null),这个为什么会为null呢?按这个你连添加都没能添加进去。里面怎么会有内容呢?mPointContainer 你这个根本不可能为空,怎么能往里面添加点呢?你不信就打log,跟着视频都做不出来么?呜呜。而且你的代码连log都没有。太自信了。
      拉大锯 2020-06-28 23:22   回复 1153952789488054272
    • Vinku  回复 @拉大锯
      那个是刚加上的,这学期开始学的安卓,哈哈哈
      Vinku 2020-06-28 23:27   回复 1277114808973422592
    • 拉大锯  回复 @Vinku
      那你打log吧,有清空的话应该是你的count 错了,而且你的代码写得真不好,为什么适配器要传进来的呢?内部创建,独立管理不好吗?把数据给进来就行了,而且你的setData根本就不是设置数据,而是设置适配器和接口。这不对。
      拉大锯 2020-06-29 10:11   回复 1153952789488054272
  • 你应该是没清空容器吧?


    每次动态添加之前要清空哦。


    这种问题很简单,你知道在哪里添加的,逆回去追查原因即可。

    1153952789488054272  评论     打赏       拉大锯
    • Vinku  回复 @拉大锯
      在添加前用了mPointContainer.removeAllViews();清空的,但是不知道为什么清空不了,然后我写了个if语句让容器=空才添加,结果直接不添加了,所以是没清空成功吧,该怎样清空?
      Vinku 2020-06-28 22:41   回复 1277114808973422592
    • 拉大锯  回复 @Vinku
      那你上代码呗,留着代码过年么,哈哈。
      拉大锯 2020-06-28 22:55   回复 1153952789488054272
    • Vinku  回复 @拉大锯
      粘在上面答案区了
      Vinku 2020-06-28 23:10   回复 1277114808973422592
相关问题
幻影~ · 安卓
2024-04-26 19:25 2 4
deanhu · AOSP
2024-04-25 21:53 3 10
幻影~ · 提问
2024-04-13 20:13 10 2
幻影~ · 找工作
2024-04-07 10:44 16 2
幻影~ · 问题
2024-03-31 17:20 7 2
TONYGFX · AOSP
2024-03-28 17:11 4 2