java.lang.IllegalStateException:应用程序的PagerAdapter在不调用PagerAdapter#notifyDataSetChanged的情况下更改了适配器的内容

时间:2016-01-02 16:26:17

标签: java android

我有一个扩展pageradapter的滑动图像。起初它正在运作。但是当我打开新活动然后按下后退按钮,应用程序崩溃了,我有这个错误:

 java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 10, found: 0 Pager id: malate.denise.chelsie.igphthesisbfinal:id/pager Pager class: class android.support.v4.view.ViewPager Problematic adapter: class malate.denise.chelsie.igphthesisbfinal.SlidingImage_Adapter

这是我的SlidingImage_Adapter.class

public class SlidingImage_Adapter extends PagerAdapter {


private ArrayList<Pictures> IMAGES;
private LayoutInflater inflater;
private Context context;


public SlidingImage_Adapter(Context context,ArrayList<Pictures> IMAGES) {
    this.context = context;
    this.IMAGES=IMAGES;
    inflater = LayoutInflater.from(context);



}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    container.removeView((View) object);

}

@Override
public int getCount() {
    return IMAGES.size();
}

@Override
public Object instantiateItem(ViewGroup view, int position) {
    View imageLayout = inflater.inflate(R.layout.slidingimage_layout, view, false);

    assert imageLayout != null;
    final ImageView imageView = (ImageView) imageLayout
            .findViewById(R.id.image);
    new DownloadImageTask(imageView).execute(IMAGES.get(position).getPhotopath());
  //  imageView.setImageResource(IMAGES.get(position));

    view.addView(imageLayout, 0);


    return imageLayout;
}

@Override
public boolean isViewFromObject(View view, Object object) {
    return view.equals(object);
}

@Override
public void restoreState(Parcelable state, ClassLoader loader) {
    notifyDataSetChanged();
}

@Override
public Parcelable saveState() {
    return null;
}

和我的AttractionInfo.class

public class AttractionInfo extends ActionBarActivity implements View.OnClickListener {
TextToSpeech tts;
TextView nameofplace,location,exact_address,operatinghours,info;
String nameofplace_s,location_s,exact_address_s,operatinghours_s,info_s,latlang_s,path_s,category_s;
ImageView play,rate,addtoplan,map;

ArrayList<Pictures> records;
private static ViewPager mPager;
private static int currentPage = 0;
String line=null;
private static int NUM_PAGES = 0;
Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_attraction_info);
    map = (ImageView)findViewById(R.id.map);
    map.setOnClickListener(this);
 records=new ArrayList<Pictures>();

    nameofplace = (TextView) findViewById(R.id.nameofplace);
    info = (TextView) findViewById(R.id.info);
    exact_address = (TextView) findViewById(R.id.exact_address);
    location = (TextView)findViewById(R.id.location);
    operatinghours=(TextView)findViewById(R.id.operatinghours);
    play = (ImageView) findViewById(R.id.play);
    rate = (ImageView) findViewById(R.id.rate);
    addtoplan = (ImageView)findViewById(R.id.addtoplan);
    addtoplan.setOnClickListener(this);
    Bundle extras = getIntent().getExtras();
    play.setOnClickListener(this);
    rate.setOnClickListener(this);

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setHomeAsUpIndicator(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
    toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed();
        }
    });
    getSupportActionBar().setDisplayShowTitleEnabled(false);


    tts = new TextToSpeech(AttractionInfo.this, new TextToSpeech.OnInitListener() {
        @Override
        public void onInit(int status) {
            if (status != TextToSpeech.ERROR){
                tts.setLanguage(Locale.ENGLISH);


            }

        }
    });
    if (extras != null) {
        nameofplace_s = extras.getString("name");
        nameofplace.setText(nameofplace_s);
        info_s = extras.getString("description");
        info.setText(info_s);
        exact_address_s = extras.getString("exactaddress");
        exact_address.setText(exact_address_s);
        location_s = extras.getString("location");
        location.setText(location_s);
        operatinghours_s=extras.getString("operatinghours");
        operatinghours.setText(operatinghours_s);
        latlang_s = extras.getString("latlang");
        path_s=extras.getString("path");
        category_s = extras.getString("category");
    }

    }

     public void onStart() {
    super.onStart();
    fetchphoto bt = new fetchphoto();
    bt.execute();
}
@Override
protected void onPause() {

    if (tts != null){
        tts.stop();
        tts.shutdown();
    }

    super.onPause();
}
@Override
public void onClick(View v) {
    if (v == play) {

        String speech1 = nameofplace.getText().toString();
        String speech2 = info.getText().toString();
        String speech = speech1 + "." + speech2;
        tts.speak(speech, TextToSpeech.QUEUE_FLUSH, null);
    } else if (v==rate){
        Intent myIntent = new Intent(this, ListOfReviews.class);
        myIntent.putExtra("placename", nameofplace_s);
        myIntent.putExtra("category",category_s);
        startActivity(myIntent);
    }else if(v==addtoplan){
        Intent myIntent = new Intent(this, AddPlan.class);
        myIntent.putExtra("placename", nameofplace_s);
        myIntent.putExtra("category",category_s);
        startActivity(myIntent);
    }else if (v == map){
        Intent myIntent = new Intent(this, Map.class);
        myIntent.putExtra("placename", nameofplace_s);
        myIntent.putExtra("category",category_s);
        myIntent.putExtra("latlang",latlang_s);
        myIntent.putExtra("address",exact_address_s);
        myIntent.putExtra("path",path_s);
        startActivity(myIntent);
    }
}
private void init() {
    SlidingImage_Adapter adapter = new SlidingImage_Adapter(this,records);
    for(int i=0;i<records.size();i++){
        Pictures pics = records.get(i);
        String pic = pics.getPhotopath();
        adapter.notifyDataSetChanged();
    }


    mPager = (ViewPager) findViewById(R.id.pager);


    mPager.setAdapter(adapter);


    CirclePageIndicator indicator = (CirclePageIndicator)
            findViewById(R.id.indicator);

    indicator.setViewPager(mPager);

    final float density = getResources().getDisplayMetrics().density;

    indicator.setRadius(5 * density);



    NUM_PAGES =records.size();



    // Auto start of viewpager
    final Handler handler = new Handler();
    final Runnable Update = new Runnable() {
        public void run() {
            if (currentPage == NUM_PAGES) {
                currentPage = 0;
            }
            mPager.setCurrentItem(currentPage++, true);
        }
    };
    Timer swipeTimer = new Timer();
    swipeTimer.schedule(new TimerTask() {
        @Override
        public void run() {
            handler.post(Update);
        }
    },5000, 5000);

    // Pager listener over indicator
    indicator.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            currentPage = position;

        }

        @Override
        public void onPageScrolled(int pos, float arg1, int arg2) {

        }

        @Override
        public void onPageScrollStateChanged(int pos) {

        }
    });

}
private class fetchphoto extends AsyncTask<Void, Void, Void> {

    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    protected void onPreExecute() {
        super.onPreExecute();
}

    protected Void doInBackground(Void... params) {
        InputStream is = null;
        String result = "";
        nameValuePairs.add(new BasicNameValuePair("cityname", nameofplace_s));
        try
        {
            records.clear();
            HttpParams httpParams = new BasicHttpParams();

            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://igph.esy.es/getphoto.php");
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();
            Log.e("pass 1", "connection success ");
        }
        catch(Exception e)
        {
            Log.e("Fail 1", e.toString());
        }

        try
        {
            BufferedReader reader = new BufferedReader
                    (new InputStreamReader(is,"utf-8"),8);
            StringBuilder sb = new StringBuilder();
            while ((line = reader.readLine()) != null)
            {
                sb.append(line + "\n");
            }
            is.close();
            result = sb.toString();
            Log.e("pass 2", "connection success ");
        }
        catch(Exception e)
        {
            Log.e("Fail 2", e.toString());
        }


        //parse json data
        try {
            Log.i("tagconvertstr", "["+result+"]");
            // Remove unexpected characters that might be added to beginning of the string
            result = result.substring(result.indexOf(""));
            JSONArray jArray = new JSONArray(result);
            for (int i = 0; i < jArray.length(); i++) {
                JSONObject json_data = jArray.getJSONObject(i);
                Pictures p = new Pictures();
                p.setPhotoname(json_data.getString("photo_name"));
                p.setPlacename(json_data.getString("place_name"));
                p.setCategory(json_data.getString("category"));
                p.setPhotopath(json_data.getString("path"));

                records.add(p);
            }
        } catch (Exception e) {
            Log.e("ERROR", "Error pasting data " + e.toString());

        }

        return null;
    }


    protected void onPostExecute(Void result) {
        //  if (pd != null) pd.dismiss(); //close dialog
        Log.e("size", records.size() + "");
        init();

    }
}
}

我已经解决了一些类似的问题,并了解到添加notifychanged可能会解决问题,但我不知道放在哪里。希望你能帮助我。谢谢

0 个答案:

没有答案