兼容viewpager中嵌套的viewpager自定义控件
来源:互联网 发布:jq 判断数组是否包含 编辑:程序博客网 时间:2024/05/19 22:27
项目中viewpager市经常使用的控件。
一旦项目大起来之后经常使用viewpager中嵌套viewpager 。
那么使用时候有很多地方都会出现冲突。
这里模仿viewpager写了一个自定义viewpager 具有回收功能的viewpager 可以减轻内存消耗。
代码如下:
public class ViewPagerHorizontalScrollView extends HorizontalScrollView {Context context;PagerScrollAdapter pagerScrollAdapter;LinearLayout linearLayout;boolean isOnce = true;int mWitdh;private FrameLayout.LayoutParams layoutParams;int xDown;long startTime, endTime;int lastIndex;int cacheNums = 1;// save cacheFrameLayout.LayoutParams layoutParams2;public ViewPagerHorizontalScrollView(Context context,PagerScrollAdapter pagerScrollAdapter) {super(context);this.context = context;this.pagerScrollAdapter = pagerScrollAdapter;setHorizontalScrollBarEnabled(false);}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {super.onLayout(changed, l, t, r, b);if (changed && isOnce) {isOnce = false;mWitdh = getWidth();linearLayout= new LinearLayout(context);layoutParams=new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);layoutParams2=new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);linearLayout.setLayoutParams(layoutParams);linearLayout.setOrientation(LinearLayout.HORIZONTAL);linearLayout.setBackgroundColor(context.getResources().getColor(android.R.color.holo_red_light));removeAllViews();addView(linearLayout);if (pagerScrollAdapter.getCount()<=0) {return;}//add child linearLayout.removeAllViews();for (int i = 0; i < pagerScrollAdapter.getCount(); i++) {LinearLayout.LayoutParams layoutParams=new LinearLayout.LayoutParams(mWitdh, getHeight());FrameLayout frameLayout=new FrameLayout(context);frameLayout.setLayoutParams(layoutParams);linearLayout.addView(frameLayout);}RecylerAddView();}}void RecylerAddView(){//clear prevint preNum = lastIndex - cacheNums;if (preNum>0) {//need recylerfor (int i = 0; i < preNum; i++) {int childNum = ((FrameLayout)linearLayout.getChildAt(i)).getChildCount();if (childNum>0) {((FrameLayout)linearLayout.getChildAt(i)).removeAllViews();}}}//clear nextint nextNum = lastIndex + cacheNums;if (nextNum < pagerScrollAdapter.getCount() - 1) {for (int i = nextNum+1; i <= pagerScrollAdapter.getCount()-1; i++) {int childNum = ((FrameLayout)linearLayout.getChildAt(i)).getChildCount();if (childNum>0) {((FrameLayout)linearLayout.getChildAt(i)).removeAllViews();}}}//add viewViewfor (int i = preNum; i <= nextNum; i++) {if (i<0 || i > pagerScrollAdapter.getCount()-1) {continue;}int childNum = ((FrameLayout)linearLayout.getChildAt(i)).getChildCount();if (childNum==0) {//add viewView view=pagerScrollAdapter.getView(i);view.setLayoutParams(layoutParams2);((FrameLayout)linearLayout.getChildAt(i)).addView(view);}}}@Overridepublic boolean onTouchEvent(MotionEvent ev) {if (ev.getAction()==MotionEvent.ACTION_DOWN) {startTime = System.currentTimeMillis();xDown = (int)ev.getRawX();}if (ev.getAction()==MotionEvent.ACTION_UP || ev.getAction()==MotionEvent.ACTION_CANCEL) {StopScrollView(ev);return true;}return super.onTouchEvent(ev);}public void setCurrentView(int position){smoothScrollTo((position * mWitdh), 0);if (mListener!= null && lastIndex!=position) {setCurrentPage(position);}}void StopScrollView(MotionEvent ev){endTime = System.currentTimeMillis();int xUp = (int)ev.getRawX();int distance = Math.abs(xUp-xDown);int moveNums = xUp - xDown;int moveX = getScrollX();int leftorright = moveX%mWitdh;int nums = moveX/mWitdh;if ( (endTime-startTime)<470 && distance > 50 ) {if (moveNums<0) {// xiang leftsmoothScrollTo(((nums+1)*mWitdh), 0);if (mListener!= null && lastIndex!=(nums+1)) {setCurrentPage(nums+1);}}else {// xiang rightsmoothScrollTo((nums*mWitdh), 0);if (mListener!= null && lastIndex!=(nums)) {setCurrentPage(nums);}}return;}if (leftorright< mWitdh/2) {//leftsmoothScrollTo((nums*mWitdh), 0);if (mListener!= null && lastIndex!=(nums)) {setCurrentPage(nums);}}else {//rightsmoothScrollTo(((nums+1)*mWitdh), 0);if (mListener!= null && lastIndex!=(nums+1)) {setCurrentPage(nums+1);}}}void setCurrentPage(int index){mListener.currentPgae(index);lastIndex = index;RecylerAddView();}public interface PagerScrollAdapter {int getCount();View getView(int pos);}onPageChangeListener mListener;public void setPageListener(onPageChangeListener mChangeListener){this.mListener = mChangeListener;}public interface onPageChangeListener{void currentPgae(int index);}}
使用代码:
ViewPagerHorizontalScrollView view=new ViewPagerHorizontalScrollView(getApplicationContext(), new ViewPagerHorizontalScrollView.PagerScrollAdapter() {@Overridepublic View getView(int pos) {//获取每个项目试图TextView textView=new TextView(getApplicationContext());textView.setText("编号"+pos);return textView;}@Overridepublic int getCount() {// 获取数量return 10;}}); //添加进入布局中 只支持代码添加 //iblShopContentViewContent.addView(View); //view.setCurrentView(0);//选中每一个项目
0 0
- 兼容viewpager中嵌套的viewpager自定义控件
- Android 自定义ViewPager嵌套滚动兼容
- 自定义 viewpager 解决viewpager 嵌套到其他滚动父控件时候冲突的问题
- ViewPager 嵌套 ViewPager的解决方法
- ViewPager嵌套ViewPager的问题
- 在ScrollView中嵌套ViewPager,ViewPager不能显示的解决办法
- 关于viewpager+fragment中嵌套viewpager+fragment的问题处理:
- 解决ViewPager中嵌套ViewPager的滑动分发问题
- scrollview中嵌套ViewPager
- Viewpager中嵌套ListView
- 复杂自定义控件---自定义ViewPager的实现
- 自定义控件-ViewPager篇
- 自定义控件:Viewpager
- 自定义Tab + ViewPager控件
- listview中嵌套viewpager的实现总结
- android中viewpager,scrollview的嵌套问题
- android中viewpager,scrollview的嵌套问题
- android中viewpager,scrollview的嵌套问题
- Linux中的随机数文件 /dev/random /dev/urandom
- 抽象类(abstract)及接口(interface)试例
- JAXB 实现bean与xml之间的转换
- hibernate_sessionn核心方法
- 运行到手机的app版本号与代码中的版本不一致
- 兼容viewpager中嵌套的viewpager自定义控件
- Java百分比转换问题
- 利用ViewPager和CiecleIndicator实现App引导滑动页
- 一题多解(三)—— Python 字符串的拼接
- Java加密技术(十二)——*.PFX(*.p12)&个人信息交换文件
- java常用到的知识点总结之集合、泛型
- Ubuntu更换更新源
- 【剑指offer】第一个只出现一次的字符
- Xamarin部署时提示DeviceSdkVersion的错误