2013-07-22 2 views
12

У меня есть ViewPager с 10 изображениями, поступающими через webservices (JSON). Сначала ViewPager работает плавно (отлично).ViewPager работает в первый раз, но при повторной загрузке снова появляется ошибка java.lang.IllegalStateException?

но Возвратившись от деятельности и открыть его сноваЯ получил эту ошибку:

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: com.akm.demo.activities:id/slideShowPager Pager class: class android.support.v4.view.ViewPager 

В основном классе активность

if (mSlideShowData != null) { // mSlideShowData is An ArrayList of the Images Which I pass to ImagePagerAdapter 
adapter = new ImagePagerAdapter(getContext(), mSlideShowData); 
slideShowPager.setAdapter(adapter); 

//slideShowPager.invalidate(); 
((PagerAdapter)slideShowPager.getAdapter()).notifyDataSetChanged(); 
} 

else{ 
Toast toast = Toast.makeText(getContext(), "No Record Found", Toast.LENGTH_LONG); 
toast.setGravity(Gravity.CENTER, 0, 0); 
    toast.show(); 

ImagePagerAdapter.java

public class ImagePagerAdapter extends PagerAdapter { 

private Context mContext; 
private ImageLoader mImageLoader; // It's use for downloading the image from server 
private ArrayList<SlideShowData> slideShowImages; // In this I have all the detail of the image from API 

public ImagePagerAdapter(Context context, ArrayList<SlideShowData> mSlideShowData) { 
    mContext = context; 
    slideShowImages = mSlideShowData; 
    mImageLoader = new ImageLoader(mContext); 

} 

@Override 
public int getItemPosition(Object object) { 
    return POSITION_NONE; 
} 

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

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



@Override 
public Object instantiateItem(ViewGroup container, int position) { 

    ImageView imageViewSlideShow = new ImageView(mContext); 
    int padding = mContext.getResources().getDimensionPixelSize(R.dimen.padding_medium); 
    imageViewSlideShow.setPadding(padding, padding, padding, padding); 
    imageViewSlideShow.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 
    mImageLoader.DisplayImage(ServiceURLs.URL+"/photos/"+slideShowImages.get(position).photo_name, R.drawable.loading, imageViewSlideShow); 
    ((ViewPager) container).addView(imageViewSlideShow, 0); 
    return imageViewSlideShow; 
} 

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

} 

@Override 
public void notifyDataSetChanged() { 
     super.notifyDataSetChanged(); 
} 

} 

Для решения, я попробовал:

@Override 
public int getItemPosition(Object object) { 
    return POSITION_NONE; 
} 

//And 

slideShowPager.getAdapter().notifyDataSetChanged(); 

решение, которое я получил от StackOverflow, но не мог работать.

что мне нужно для изменения для работы?

Решение

earlier I am Passing the ArrayList But this time String Array **(working)** Really I don't know whats the problem with the ArrayList

+1

Вы должны показать больше кода. Возможно, вы измените адаптер и в другом месте. Если вы используете «ArrayAdapter», возможно, вы измените «Список», который вы передали адаптеру, не заметив его. –

+0

. Я не использую Arrayadapter для него. «PagerAdapter» использует для установки всех изображений на ViewPager @MichaelButscher. –

+0

@MichaelButscher + 1 ЭТО была проблема в моем случае, большое спасибо за подсказку! – AgentKnopf

ответ

-1

Ответ они дали работали на аналогичную проблему моего .. Я просто в производстве, не имеет ни малейшего представления о том, как работают все эти коды, но то, что они сказали, что вид помог мне в твоей другой теме. Вы должны уведомить, как они сказали, в местах, где вы устанавливаете или удаляете свои изображения.

Итак, я думаю, здесь ваша проблема в том, что вам нужно сделать уведомление после вас onCreateView(), а также в вашем destroyItem(). Я бы добавил уже предлагаемое решение здесь. Думаю, это должно сделать это. надеемся, что я не ошибаюсь. Вам повезло.

 slideShowPager.getAdapter().notifyDataSetChanged(); 

td: lr; Эта строка в двух из ваших функций onCreateView() и destroyItem() в конце может сделать трюк

+1

не работает .. снова такая же ошибка –

+0

У меня была такая же проблема. Если вы действительно не можете двигаться вперед с этой проблемой, я могу по крайней мере показать то, что я точно сделал, и вы могли бы понять лучше, чем я, заглянуть в свой код? Все, что я вижу, оба кода были реализованы совершенно аналогично. Подсказка - проблема с вашим размером(); звоните, на который я положил его в блок try, catch, чтобы, даже я искал и делал глупое изменение, он все равно что-то с этим поделал. – vickzzzzz

+0

раньше я передаю ArrayList Но на этот раз String Array (работает) ... Действительно, я не знаю, что проблема с ArrayList @vickzzzzz –

13

Причина проблемы, которую Pager может обновить во время некоторых измерений, и в этом случае обновит счет вашего адаптера, если это счет не будет равен сохраненному счету, вы увидите ошибку. Таким образом, мое решение выглядит следующим образом:

public abstract class ViewPagerCursorAdapter extends PagerAdapter { 

    private int mCount; 

    public ViewPagerCursorAdapter(Context ctx, Cursor cursor, int resource) { 
     super(); 
     ... 
     mCount = cursor.getCount(); 
     ... 
    } 

    @Override 
    public int getCount() { 
     return mCount; 
    } 

    public Cursor swapCursor(Cursor newCursor) { 
     ... 
     mCount = newCursor.getCount(); 
     notifyDataSetChanged(); 
    } 
} 

Удачи.

Смежные вопросы