您的位置:首页 > 移动开发 > Android开发

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.

<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);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: