Android菜鸟的成长笔记——ViewPager图片循环
2015-10-29 09:54
477 查看
作为一个渣渣级别的新手,调了一天才弄好,既然调出来了,记录一下吧。
遇到的几个问题:
1、需要跳转时,调用viewPager.setCurrentItem()报错:java.lang.IllegalStateException: Thespecified child already has a parent.You must call removeView() on the child'sparent first.
解决方法:在MyPagerAdapter里public Object instantiateItem(ViewGroupcontainer, int position)方法中加个判断,parent为空的时候添加。
2、跳转时,出现黑屏:实例化的时候,没弄好,重写一下public void setPrimaryItem(ViewGroupcontainer, int position, Object object)手动实例化一下。
ViewPagerActivity:
MyPagerAdapter:
遇到的几个问题:
1、需要跳转时,调用viewPager.setCurrentItem()报错:java.lang.IllegalStateException: Thespecified child already has a parent.You must call removeView() on the child'sparent first.
<span style="white-space:pre"> </span>if (view.getParent() == null) { viewPager.addView(view); }
解决方法:在MyPagerAdapter里public Object instantiateItem(ViewGroupcontainer, int position)方法中加个判断,parent为空的时候添加。
2、跳转时,出现黑屏:实例化的时候,没弄好,重写一下public void setPrimaryItem(ViewGroupcontainer, int position, Object object)手动实例化一下。
<span style="white-space:pre"> </span>if(position == 1) { instantiateItem(container, position); } if(position == 8) { instantiateItem(container, position); }下面贴上代码。
ViewPagerActivity:
import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.support.v4.view.ViewPager; import android.view.View; import android.widget.ImageView; import android.widget.RadioGroup; import com.lcy.demo.studydemo.R; import java.util.ArrayList; public class ViewPagerActivity extends Activity { //图片的资源数组 final static int[] PICTURE_ID = { R.drawable.background_1, R.drawable.background_2, R.drawable.background_3, R.drawable.background_4, R.drawable.background_5, R.drawable.background_6, R.drawable.background_7, R.drawable.background_8 }; final static int END_POSITION = 8; final static int START_POSITION = 1; final static int DELAY_TIME = 2000; //RadioButton的ID数组 final static int[] POINT_ID = { R.id.rbPoint1,R.id.rbPoint2,R.id.rbPoint3,R.id.rbPoint4, R.id.rbPoint5,R.id.rbPoint6,R.id.rbPoint7,R.id.rbPoint8, }; ArrayList<View> views = new ArrayList<>(); ViewPager viewPager; Handler handler = new Handler(); RadioGroup rgPoint; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_view_pager); //初始化一个ImageView ArrayList for (int i = 0; i < PICTURE_ID.length; i++) { ImageView view = new ImageView(this); view.setImageDrawable(getResources().getDrawable(PICTURE_ID[i])); views.add(view); } //初始化RadioGroup rgPoint = (RadioGroup)findViewById(R.id.rgPoint); rgPoint.check(POINT_ID[START_POSITION-1]); //为ViewPager绑定控件、adapter viewPager = (ViewPager) findViewById(R.id.vpPicture); final MyPagerAdapter adapter = new MyPagerAdapter(views); viewPager.setAdapter(adapter); viewPager.setCurrentItem(START_POSITION); //自动滑动图片 handler.postDelayed(new SlidingPicture(), DELAY_TIME); //为ViewPager设置监听 viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { //Log.i("ViewPager","onPageSelected"); //mIsChanged = true; if (position > END_POSITION) { viewPager.setCurrentItem(START_POSITION, false); rgPoint.check(POINT_ID[START_POSITION-1]); } else if (position < START_POSITION) { viewPager.setCurrentItem(END_POSITION, false); rgPoint.check(POINT_ID[END_POSITION-1]); }else { rgPoint.check(POINT_ID[position-1]); } } @Override public void onPageScrollStateChanged(int state) { } }); } class SlidingPicture implements Runnable { @Override public void run() { try { int position = viewPager.getCurrentItem(); position++; if (position > END_POSITION) { position = START_POSITION; viewPager.setCurrentItem(position,false); rgPoint.check(POINT_ID[START_POSITION - 1]); } else { viewPager.setCurrentItem(position); rgPoint.check(POINT_ID[position-1]); } handler.postDelayed(this, DELAY_TIME); } catch (Exception e) { e.printStackTrace(); } } } }
MyPagerAdapter:
import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.util.Log; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; public class MyPagerAdapter extends PagerAdapter { ArrayList<View> views = new ArrayList<>(); public MyPagerAdapter(ArrayList<View> viewList) { //在开头添加最后一张图 views.add(viewList.get(viewList.size() - 1)); for (int i = 0; i < viewList.size(); i++) { views.add(viewList.get(i)); } //在结尾添加第一张图 views.add(viewList.get(0)); } @Override public int getCount() { return views.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) { View view = views.get(position); ViewPager viewPager = (ViewPager) container; //不加判断,循环跳转时报错 //java.lang.IllegalStateException: The specified child already has a parent. // You must call removeView() on the child's parent first. if (view.getParent() == null) { viewPager.addView(view); } Log.i("ViewPager", "Item is instanced in Positon" + position); return view; } @Override public void destroyItem(ViewGroup container, int position, Object object) { Log.i("ViewPager", "Item is destroyed in position"+position); ((ViewPager) container).removeView((View) object); } @Override public void setPrimaryItem(ViewGroup container, int position, Object object) { //实例化一下当前的对象 if(position == 1) { instantiateItem(container, position); } if(position == 8) { instantiateItem(container, position); } } }
相关文章推荐
- Android 反编译
- 框架模式 MVC 在Android中的使用
- Android本地数据存储之SQLite
- android的消息机制——Handler机制
- Android Studio 快捷键整理分享
- Android实战简易教程-第六十七枪(android动画实现窗口抖动效果)
- Andriod界面设计适配和Android Studio中的资源
- Android M新控件之FloatingActionButton,TextInputLayout,Snackbar,TabLayout的使用
- Android Volley完全解析(四),带你从源码的角度理解Volley
- 需求,刚做android,这个布局想请加各位大神如何写
- Android RecyclerView 的瀑布流式布局
- Android学习系列(39)--Android主题和样式之系统篇(上)
- Android Service总结
- Android 生命周期 和 onWindowFocusChanged
- android学习之-Theme和Style
- Android传递数据
- Xamarin只言片语4——Xamarin.Android百度地图绑定
- 开源项目研究FastDev4Android
- Android 5.0源码分析---ContentProvider中的ContentObserver研究
- Android 编程下的代码混淆