開發(fā)場景:
1.在activity執(zhí)行oncreate()生命周期時,初始化viewpager控件、viewpager的適配器adapter,adapter的填充數(shù)組list;
- 當用戶刷新數(shù)據(jù)的時候,先清空listview,并將新數(shù)據(jù)填充到list中,調(diào)用adapter的notifyDataSetChanged()方法,此時產(chǎn)生運行錯誤。
錯誤類型: Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
代碼如下:
package com.example.androidtest;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
public class MainActivity extends Activity {
private ViewPager vp ;
private VPAdapter vpAdapter;
private List<View> views;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
vp = (ViewPager)findViewById(R.id.vp);
views = new ArrayList<View>();
vpAdapter = new VPAdapter(views);
vp.setAdapter(vpAdapter);
}
public void doClick(View v){
switch (v.getId()) {
case R.id.add:
views.clear();
for (int i = 0; i < 3; i++) {
ImageView iv = (ImageView)((View)LayoutInflater.from(this).inflate(R.layout.imageview, null)).findViewById(R.id.iv);
iv.setImageResource(R.drawable.ic_launcher);
views.add(iv);
}
vpAdapter.notifyDataSetChanged();
break;
case R.id.del:
break;
}
}
}
package com.example.androidtest;
import java.util.ArrayList;
import java.util.List;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
public class VPAdapter extends PagerAdapter {
private List<View> viewList;
public VPAdapter(List<View> viewList){
if(viewList!=null){
this.viewList = viewList;
}else{
this.viewList = new ArrayList<View>();
}
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return viewList.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0==arg1;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(viewList.get(position));
}
@Override
public Object instantiateItem(ViewGroup container, int position){
//這里的判斷是關鍵代碼,首先我們要判斷這個view的父容器是否為null;
//如果為null,證明是第一次加入,直接添加即可,
//如果不為null。此時需要先remove掉父容器,再將這個view添加到container中,否則就會產(chǎn)生IllegalStateException異常
if(viewList.get(position).getParent()==null){
container.addView(viewList.get(position), 0);
}else{
((ViewGroup)viewList.get(position).getParent()).removeView(viewList.get(position));
container.addView(viewList.get(position));
}
return viewList.get(position);
}
}