ViewPager的IllegalStateException運行異常處理

開發(fā)場景:
1.在activity執(zhí)行oncreate()生命周期時,初始化viewpager控件、viewpager的適配器adapter,adapter的填充數(shù)組list;

  1. 當用戶刷新數(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);
    }
    
    
}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容