PagerAdapter приложения изменил содержимое адаптера без вызова notifyDataSetChanged()

Я разрабатываю простую игру на Android. У меня есть действие для извлечения данных с сервера и загрузки их в ViewPager. Это фрагмент кода активности:

    url = new ArrayList<>();
    name = new ArrayList<>();
    viewPager = (ViewPager) findViewById(R.id.viewPager);
    viewPagerAdapter = new ViewPagerAdapter(getApplicationContext(),url,name);
    viewPager.setAdapter(viewPagerAdapter);

    AppController.socket.emit("getDoodle","")
            .on("doodleList", new Emitter.Listener() {
                @Override
                public void call(Object... args) {
                    JSONArray data = (JSONArray)args[0];
                    Log.e("MYTAG",data.toString());
                    url.clear();
                    name.clear();
                    for(int i=0;i<AppController.playersId.size();i++){
                        try {
                            if(!data.getJSONObject(i).getString("doodle").equals("null")) {
                                url.add(data.getJSONObject(i).getString("doodle"));
                                name.add(data.getJSONObject(i).getString("id"));
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }


                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            viewPagerAdapter.notifyDataSetChanged;
                        }
                    });
                }
            });

Это мой пейджерадаптер:

    class ViewPagerAdapter extends PagerAdapter {

Context mContext;
ArrayList<String> mUri,mId;

public ViewPagerAdapter(Context context, ArrayList<String> imageUri, ArrayList<String> sid){
    mContext = context;
    mUri = imageUri;
    this.mId=sid;
    Log.e("MYTAG",mUri.toString());
}
@Override
public int getCount() {
    return mUri.size();
}

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

@Override
public Object instantiateItem(ViewGroup container, final int position) {
    LayoutInflater mLayoutInflater=(LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View itemView = mLayoutInflater.inflate(R.layout.pager_child, container, false);

    final ImageView imageView = (ImageView) itemView.findViewById(R.id.doodleView);
    TextView nameText = (TextView) itemView.findViewById(R.id.ownerText);
    String temp = mUri.get(position);
    if(!temp.equals("")){
        Log.e("replace","2");
        Glide.with(mContext)
                .load(temp)
                .diskCacheStrategy(DiskCacheStrategy.NONE)
                .into(imageView);
        nameText.setText(mId.get(position));
    }
    Log.d("pager",mUri.get(position));
    itemView.setTag(position);
    container.addView(itemView);
    return itemView;
}

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

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

Мой журнал ошибок:

FATAL EXCEPTION: main
                                                            Process: com.nirup.fuku, PID: 10421
                                                            java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 0, found: 1 Pager id: com.nirup.fuku:id/viewPager Pager class: class android.support.v4.view.ViewPager Problematic adapter: class com.nirup.fuku.ViewPagerAdapter
                                                                at android.support.v4.view.ViewPager.populate(ViewPager.java:1167)
                                                                at android.support.v4.view.ViewPager.populate(ViewPager.java:1116)
                                                                at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1642)
                                                                at android.view.View.measure(View.java:19857)
                                                                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                                                                at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
                                                                at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
                                                                at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
                                                                at android.view.View.measure(View.java:19857)
                                                                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                                                                at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                                                                at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)
                                                                at android.view.View.measure(View.java:19857)
                                                                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                                                                at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
                                                                at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
                                                                at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
                                                                at android.view.View.measure(View.java:19857)
                                                                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                                                                at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                                                                at android.view.View.measure(View.java:19857)
                                                                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                                                                at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
                                                                at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
                                                                at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
                                                                at android.view.View.measure(View.java:19857)
                                                                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                                                                at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                                                                at com.android.internal.policy.DecorView.onMeasure(DecorView.java:689)
                                                                at android.view.View.measure(View.java:19857)
                                                                at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2275)
                                                                at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1366)
                                                                at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1619)
                                                                at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254)
                                                                at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6337)
                                                                at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
                                                                at android.view.Choreographer.doCallbacks(Choreographer.java:686)
                                                                at android.view.Choreographer.doFrame(Choreographer.java:621)
                                                                at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860)
                                                                at android.os.Handler.handleCallback(Handler.java:751)
                                                                at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                at android.os.Looper.loop(Looper.java:154)
                                                                at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

Я не знаю, что я делаю неправильно. Любая помощь приветствуется.


person Nirup Iyer    schedule 15.04.2017    source источник


Ответы (1)


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

чтобы решить это:

вы должны вызвать viewPagerAdapter.notifyDataSetChanged; после того, как вы измените элементы адаптера..

Код:

 public ViewPagerAdapter(Context context, ArrayList<String> imageUri, ArrayList<String> sid){
    mContext = context;
    mUri = imageUri;
    this.mId=sid;
    notifyDataSetChanged();   //add here
    Log.e("MYTAG",mUri.toString());
}

ИЗМЕНИТЬ

call viewPagerAdapter.notifyDataSetChanged();//вам не хватает скобок

person rafsanahmad007    schedule 15.04.2017
comment
Я пробовал это. Я использовал свой точный код, как указано выше, с notifydatasetchanged() в конструкторе.. приложение все еще падает.. Я также пытался передавать новый объект ViewPagerAdapter каждый раз, когда список изменяется, но он все еще падает. - person Nirup Iyer; 15.04.2017
comment
попробуйте расширить FragmentStatePagerAdapter вместо PagerAdapter ... и убедитесь, что вы вызываете ..viewPagerAdapter.notifyDataSetChanged() ... после обновления адаптера ... не обязательно передавать новый объект ViewPagerAdapter каждый раз, когда список изменяется ... я просто показываю пример - person rafsanahmad007; 15.04.2017