有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我们何时在PagerAdapter上通知更改的数据

我已经看到了关于这个主题的几个问题,我尝试添加了建议的onNotifyDataChanged,但似乎没有任何效果。我将感谢任何帮助,下面是我的类和内部类MyViewPagerAdapter,我如何停止修复此问题

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

代码:

public class SlideShowFragment extends DialogFragment {
    private final String TAG = SlideShowFragment.class.getSimpleName();
    private ArrayList<Image> images;
    private ProgressBar pd;


    /**
     * a simple newInstance
     *
     * @return slideShowFragment
     */
    public static SlideShowFragment newInstance() {
        SlideShowFragment slideShowFragment = new SlideShowFragment();
        return slideShowFragment;
    }

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_slideshow_dialog_fragement, container, false);
        ViewPager viewPager = v.findViewById(R.id.viewpager);

        assert getArguments() != null;
        images = (ArrayList<Image>) getArguments().getSerializable("images");
        int selectedPosition = getArguments().getInt("position");

        pd = v.findViewById(R.id.img_progress);

        Log.e(TAG, "position: " + selectedPosition);
        Log.e(TAG, "images size: " + images.size());


            MyViewPagerAdapter myViewPagerAdapter = new MyViewPagerAdapter();
            //added this incase of crash #FIXME 5/25/2018
            myViewPagerAdapter.notifyDataSetChanged();
            viewPager.setAdapter(myViewPagerAdapter);






        return v;
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NORMAL, 安卓.R.style.Theme_Black_NoTitleBar_Fullscreen);
    }

    /**
     * myViewPager Adapter inner class
     * I am using the Glide Library to help me display
     * images from the json data on my server.
     */
    class MyViewPagerAdapter extends PagerAdapter {

        private LayoutInflater layoutInflater;

        MyViewPagerAdapter() {
        }

        @TargetApi(Build.VERSION_CODES.KITKAT)
        @NonNull
        @Override
        public Object instantiateItem(@NonNull ViewGroup container, int position) {

            layoutInflater = (LayoutInflater) Objects.requireNonNull(getActivity()).getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            assert layoutInflater != null;
            View view = layoutInflater.inflate(R.layout.image_fullscreen_preview, container, false);

            try {

                ImageView imageViewPreview = view.findViewById(R.id.image_preview);
                Image image = images.get(position);
                Glide.with(getActivity()).load(image.getLarge())
                        .thumbnail(0.5f)
                        .crossFade()

                        .diskCacheStrategy(DiskCacheStrategy.ALL)
                        .error(R.drawable.reload)
                        .listener(new RequestListener<String, GlideDrawable>() {
                            @Override
                            public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
                                pd.setVisibility(View.VISIBLE);
                                return false;
                            }

                            @Override
                            public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target,
                                                           boolean isFromMemoryCache, boolean isFirstResource) {
                                pd.setVisibility(View.INVISIBLE);
                                return false;
                            }
                        })
                        .into(imageViewPreview);

                // pd.setVisibility(View.INVISIBLE);
                container.addView(view);
            }catch (ExecutionError e){
                Toast.makeText(getContext(),"Please Check Connection", Toast.LENGTH_SHORT).show();
            }


            return view;
        }

        @Override
        public int getCount() {


            return images.size();
        }

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


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

}

共 (1) 个答案

  1. # 1 楼答案

    在我看来,如果您正在使用一个适配器,并在该适配器中分配了一个空的或一些基本的数据集,然后再次希望在相同的数据集中添加更多的数据,并希望在不将其加载回初始配置的情况下更新布局,那么您可以使用“notifyDataChanges”此方法将自动加载已加载的数据已在adpater中额外添加或用户刚刚更新

    例如:

    private RecyclerView recyclerView;
    List<Home_Data> ModelHomeData = new ArrayList<>();  //taking a empty object of list to show
    recyclerView = (RecyclerView) view.findViewById(R.id.layout_modelBikeLinear);
    recyclerView.setAdapter(new ModelAdapter(ModelDataForView, R.layout.template_models , getContext()));
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    

    在这种情况下,我们为视图分配了一个空适配器,但我想添加更多数据,然后在不反复加载的情况下更改视图,因此现在我可以在列表数据中添加数据,然后使用“notifyDataChanged”

    for(int i = 0; i < response.length(); i++){
                    //SliderUtils sliderUtils = new SliderUtils();
                    Model_Data DataModelFile = new Model_Data();
                    try {
                        JSONObject jsonObject = response.getJSONObject(i);
                        DataModelFile.setModelId(jsonObject.getString("id"));
                        DataModelFile.setModelName(jsonObject.getString("name"));
                        DataModelFile.setModelPrice(jsonObject.getString("price"));
                        DataModelFile.setBikeImageUrl(jsonObject.getString("image"));
                        if ((Integer.parseInt(jsonObject.getString("available")) > 0) && (Integer.parseInt(jsonObject.getString("show")) > 0)) {
                            DataModelFile.setBikeAvailable(true);
                        }
                        else
                        {
                            DataModelFile.setBikeAvailable(false);
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    ModelDataForView.add(DataModelFile);
                }
    adapter.notifyDataSetChanged();