【问题标题】:Notify data change to viewPagerAdapter将数据更改通知给 viewPagerAdapter
【发布时间】:2018-06-29 06:21:41
【问题描述】:

我在 recyvlerview 中无限滚动从服务器加载图像。我在 recyclerview Itee 上设置了 onClick,它在 viewpager 中打开。它工作正常,但是当我以无限负载从服务器加载时,它给出了错误-

 java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 9, found: 29 .

凌空回应

     @Override
                public void onResponse(JSONObject response) {
                    progressBarBottom.setVisibility(View.GONE);

                    imagelist = new ArrayList<>();
                    JSONArray heroArray = null;


                    try {
                        heroArray = response.getJSONArray("images");
                        for (int i = 0; i < heroArray.length(); i++) {
                            JSONObject jsonObject = 
                        heroArray.getJSONObject(i);

                            Photos photos = new Photos();
                            photos.setUrl(jsonObject.getString("image"));

                            imagelist.add(photos);

                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }


                    adapter.addImages(imagelist);
                    myViewPagerAdapter.addImages(imagelist);
                    adapter.notifyDataSetChanged();
                    myViewPagerAdapter.notifyDataSetChanged();
                }

我创建了一个模态类,从服务器获取数据并设置数据。 照片

@Parcel
public class Photos {
public String url;
public String title;

public Photos() {

}

 public Photos(String url, String weight, String title, String thumb, String 
 date, String hit) {
    this.url = url;
    this.thumb = thumb;
}

public String getUrl() {
    return url;
}

public void setUrl(String url) {
    this.url = url;
}



public String getThumb() {
    return thumb;
}

public void setThumb(String thumb) {
    this.thumb = thumb;
}

}

MyViewPagerAdapter

public class MyViewPagerAdapter extends PagerAdapter {
private Context context;

ProgressBar fullImagePB;
private ArrayList<Photos> imagesList;
private LayoutInflater layoutInflater;

public MyViewPagerAdapter(Context context, ArrayList<Photos> imagesList) {
    this.context = context;
    this.imagesList = imagesList;
    layoutInflater = (LayoutInflater) 
 context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}

@Override
public Object instantiateItem(final ViewGroup container, int position) {
    layoutInflater = (LayoutInflater) 
  context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    Photos image = imagesList.get(position);
    final View view = 
  layoutInflater.inflate(R.layout.image_fullscreen_preview, container, 
  false);
    fullImagePB = view.findViewById(R.id.fullImagePB);
    final ImageView imageViewPreview = (ImageView) 
  view.findViewById(R.id.image_preview);
    imageViewPreview.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
        }
    });
    imageViewPreview.setOnTouchListener(new 
   ImageMatrixTouchHandler(view.getContext()));


    Glide.with(imageViewPreview.getContext())
            .load(image.getUrl())
            .asBitmap()
            .listener(new RequestListener<String, Bitmap>() {
                @Override
                public boolean onException(Exception e, String model, 
  Target<Bitmap> target, boolean isFirstResource) {
                    return false;
                }

                @Override
                public boolean onResourceReady(Bitmap resource, String model, 
  Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) 
   {

                    fullImagePB.setVisibility(View.GONE);
                    return false;
                }
            })
            .fitCenter().into(new SimpleTarget<Bitmap>() {
        @Override
        public void onResourceReady(final Bitmap resource, GlideAnimation<? 
   super Bitmap> glideAnimation) {
            imageViewPreview.setImageBitmap(resource);

        }

    });
    imageViewPreview.setTag(position);

    container.addView(view);
    return view;

}

@Override
public int getCount() {
    return imagesList.size();
}
public int getItemPosition(Object object) {
    return POSITION_NONE;
}
@Override
public boolean isViewFromObject(View view, Object obj) {
    return view.equals(obj);
}


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

public void addImages(ArrayList<Photos> img){
    for(Photos im : img){
        imagesList.add(im);
        notifyDataSetChanged();
    }

}
}

错误

 06-29 12:12:27.225 19845-19845/satlaa.mysql_test E/AndroidRuntime: FATAL EXCEPTION: main
Process: satlaa.mysql_test, PID: 19845
java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 10, found: 30 Pager id: satlaa.mysql_test:id/viewpager Pager class: class satlaa.mysql_test.adapter.ClickableViewPager Problematic adapter: class satlaa.mysql_test.adapter.MyViewPagerAdapter
    at android.support.v4.view.ViewPager.populate(ViewPager.java:1137)
    at android.support.v4.view.ViewPager.populate(ViewPager.java:1086)
    at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1616)
    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.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)

我在 onBindViewHolder 的片段中打开图像。

((MyViewHolder) holder).itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Bundle bundle = new Bundle();
                bundle.putSerializable("url", imagesList);
                bundle.putInt("position", position);
                FragmentTransaction ft = ((Activity) mContext).getFragmentManager().beginTransaction();
                Full_Image newFragment = Full_Image.newInstance();
                newFragment.setArguments(bundle);
                newFragment.show(ft, "slideshow");

            }

完整图像片段

  images = (ArrayList<Photos>) getArguments().getSerializable("url");=
    selectedPosition = getArguments().getInt("position");

    final int number = viewPager.getCurrentItem();
    final Photos image = images.get(number);
    final String img_title = image.getTitle();
    final String img_weight = image.getWeight();
   myViewPagerAdapter = new MyViewPagerAdapter(getActivity(), images);
    viewPager.setAdapter(myViewPagerAdapter);
    viewPager.addOnPageChangeListener(viewPagerPageChangeListener);
    setCurrentItem(selectedPosition);

【问题讨论】:

    标签: android android-viewpager android-volley


    【解决方案1】:

    尝试从您的帐户中删除 notifyDataSetChanged();

    public void addImages(ArrayList<Photos> img){
        for(Photos im : img){
           imagesList.add(im);
           notifyDataSetChanged();
        }
    }
    

    正如您在凌空响应中添加项目后所做的那样。

    同时通知 recycleradapterviewPagerAdapter 所以不是

     adapter.addImages(imagelist);
     myViewPagerAdapter.addImages(imagelist);
     adapter.notifyDataSetChanged();
     myViewPagerAdapter.notifyDataSetChanged();
    

    试试

     myViewPagerAdapter.addImages(imagelist);
     myViewPagerAdapter.notifyDataSetChanged();
     adapter.addImages(imagelist);
     adapter.notifyDataSetChanged();
    

    【讨论】:

    • 您能否提供错误日志以获取更多详细信息,例如它的踪迹
    • 从您的 recyclerview 中您是否在 viewpager 中打开页面?
    • 是的,我想我遇到了问题。我正在编辑问题。
    • 找到解决方案了吗?
    • 同样的问题。我认为问题出在捆绑包上。
    【解决方案2】:

    1) 您不应该需要以下内容:

    public void addImages(ArrayList<Photos> img){
        for(Photos im : img){
           imagesList.add(im);
           notifyDataSetChanged();
        }
    }
    

    这是因为您已经在适配器的构造函数中传递了列表,如下所述。每当您调用 notifydatasetchanged() 时,构造函数都会更新。

    public MyViewPagerAdapter(Context context, ArrayList<Photos> imagesList){..}
    

    2) 只需在下面一行调用 notifydatasetchanged():

     imagelist.add(photos);
     adapter.notifyDatasetChanged();
     myViewPagerAdapter.notifyDatasetChanged();
    

    3) 确保从 viewpager 适配器和其他适配器中删除方法 addImages。

    【讨论】:

    • 我删除了方法,现在分页不起作用。
    • addImages() 对 recyclerview 有好处。当用户滚动时,在 recycleview 中添加图像需要时间。在所有图像都加载到回收站之后,然后我单击 viewpager 比它工作正常。但是,如果我在回收更新之前单击 viewpager。 Viewpager 被打开。回收已更新,没有任何问题,但没有 viewpager。
    猜你喜欢
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多