ViewPager显示RecyclerView的数据错误



我试图显示每年的假期(使用截击从web服务获取),而对于显示假期,我使用了RecyclerView。以下是我的代码:它总体上是可行的,但在这个代码中存在一些问题。我不知道我在这里做错了什么?

public class ShowHolidaysPage extends AppCompatActivity implements ViewPager.OnPageChangeListener{ 
        private static final int PAGE_LEFT = 0;
        private static final int PAGE_MIDDLE = 1;
        private static final int PAGE_RIGHT = 2;
        HolidayFragment leftPage = null,middlePage = null,rightPage = null;
        List<HolidayFragment> fList = new ArrayList<HolidayFragment>();
        enter code here
        @Override
        protected void onCreate(Bundle savedInstanceState) {
           fList.add(HolidayFragment.newInstance("" + (year1 - 1), authToken,      deviceId,yearList));
            fList.add(HolidayFragment.newInstance("" + year1, authToken, deviceId,yearList));
            fList.add(HolidayFragment.newInstance("" + (year1 + 1), authToken, deviceId,yearList));
             leftPage = fList.get(PAGE_LEFT);
            middlePage = fList.get(PAGE_MIDDLE);
            rightPage = fList.get(PAGE_RIGHT);
            init();
            pageAdapter = new MyPageAdapter(getSupportFragmentManager(), fList);
            pager = (ViewPager)findViewById(R.id.holiday_pager);
            pager.setAdapter(pageAdapter);
            pager.setOnPageChangeListener(this);
            pager.setCurrentItem(1, false);
    }
    @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }
        @Override
        public void onPageSelected(int position) {
            mSelectedPageIndex = position;
        }
        @Override
        public void onPageScrollStateChanged(int state) {
            if (state == ViewPager.SCROLL_STATE_IDLE) {
     final int oldLeftIndex = leftPage.getIndex();
                final int oldMiddleIndex = middlePage.getIndex();
                final int oldRightIndex = rightPage.getIndex();
                if (mSelectedPageIndex == PAGE_LEFT) {
                    currentYear.add(Calendar.YEAR, -1);
                    Calendar prevYear = Calendar.getInstance();
                    prevYear.setTime(currentYear.getTime());
                    prevYear.add(Calendar.YEAR, -1);
                    Calendar nextYear = Calendar.getInstance();
                    nextYear.setTime(currentYear.getTime());
                    nextYear.add(Calendar.YEAR, 1);
                    leftPage.setIndex(oldLeftIndex - 1, prevYear);
                    middlePage.setIndex(oldLeftIndex, currentYear);
                    rightPage.setIndex(oldMiddleIndex, nextYear);
                } 
    else if (mSelectedPageIndex == PAGE_RIGHT) {
                    currentYear.add(Calendar.YEAR, 1);
                    Calendar prevYear = Calendar.getInstance();
                    prevYear.setTime(currentYear.getTime());
                    prevYear.add(Calendar.YEAR, -1);
                    Calendar nextYear = Calendar.getInstance();
                    nextYear.setTime(currentYear.getTime());
                    nextYear.add(Calendar.YEAR, 1);
                    leftPage.setIndex(oldMiddleIndex, prevYear);
                    middlePage.setIndex(oldRightIndex, currentYear);
                    rightPage.setIndex(oldRightIndex + 1, nextYear);
                }
     pager.setCurrentItem(1, false);
    }
    }
     class MyPageAdapter extends FragmentStatePagerAdapter  {
            private List<HolidayFragment> fragments;
            public MyPageAdapter(FragmentManager fm, List<HolidayFragment> fragments) {
                super(fm);
                this.fragments = fragments;
            }
            @Override
            public Fragment getItem(int position) {
                return this.fragments.get(position);
            }
            @Override
            public int getCount() {
                return this.fragments.size();
            }
        }
    }
    this method is in holiday fragment:
       public void setIndex(int index,Calendar year1) {
            this.index = index;
            if(year1 != null) {
                year = ""+year1.get(Calendar.YEAR);
                if(year.equals(""+year1.get(Calendar.YEAR))) {
                    String year = "" + year1.get(Calendar.YEAR);
                    yearView.setText(year);
                    if(networkCall.getRequestQueue()!= null) {
                        networkCall.getRequestQueue().cancelAll(getTag());
                    }
                    getHolidays(authtoken, deviceId, yearView.getText().toString());
                }
            }
        }
    public void getHolidays(String authToken, String deviceID, final String year) {
            if(recyclerView != null) {
                if (recyclerView.getVisibility() == View.VISIBLE) {
                    recyclerView.setVisibility(View.GONE);
                }
            }
            if(holidayNotAvailable != null) {
                if (holidayNotAvailable.getVisibility() == View.VISIBLE) {
                    holidayNotAvailable.setVisibility(View.GONE);
                }
            }
            if(yearList==null){
                yearList=new ArrayList<Integer>();
            }
            if(!yearList.contains(Integer.parseInt(year))) {
                progressbar.setVisibility(View.VISIBLE);
                networkCall = NetworkCall.getInstance(getActivity().getApplicationContext());
                String url = url;
                url += "&year=" + year;
                JsonObjectRequest jsonObject = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject jsonObject) {
                        yearList.add(Integer.parseInt(year));
                        try {
                            Map<String, String> holidaysMap = new Gson().fromJson(jsonObject + "", new TypeToken<SortedMap<String, String>>() {
                            }.getType());
                            progressbar.setVisibility(View.GONE);
                            if (holidaysMap.size() != 0) {
                                if (holidayNotAvailable.getVisibility() == View.VISIBLE) {
                                    holidayNotAvailable.setVisibility(View.GONE);
                                }
                                LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
                                recyclerView.setVisibility(View.VISIBLE);
                                recyclerView.setLayoutManager(layoutManager);
                                adapter = new HolidayAdapter(holidaysMap, year);
                                recyclerView.setAdapter(adapter);
                            } else {
                                progressbar.setVisibility(View.GONE);
                                recyclerView.setVisibility(View.GONE);
                                holidayNotAvailable.setVisibility(View.VISIBLE);
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        String msg = "";
                        if (volleyError instanceof TimeoutError || volleyError instanceof NoConnectionError) {
                            msg = "Time out Error! Please try again later";
                        } else if (volleyError instanceof AuthFailureError) {
                            startActivity(new Intent(getActivity().getApplicationContext(), IntroActivity.class));
                        } else if (volleyError instanceof ServerError) {
                            msg = "Server Error! Please try again later";
                        } else if (volleyError instanceof NetworkError) {
                            msg = "Network Error! Please try again later";
                        } else if (volleyError instanceof ParseError) {
                            msg = "Parser Error! Please try again later";
                        }
                        if (!EwUtils.isNullString(msg)) {
                            if (getActivity() != null) {
                                Toast.makeText(getActivity().getApplicationContext(), msg, Toast.LENGTH_SHORT);
                            }
                        }
                    }
                });
                networkCall.addToRequestQueue(jsonObject);
            }
}

它正确地显示向左或向右滑动的页面,但现在存在以下两个问题:

  1. 一次形成三个页面,所以当我们向左或向右滑动时,它再次调用get holiday方法,该方法在视图已经创建时创建视图,所以我不知道它为什么要重新创建页面
  2. 当我们快速滑动时,就会显示数据错误。它似乎将另一个请求的数据放在了另一个片段中

我已经用寻呼机试过了。setOffsetscreenPageLimit(1);但is不起作用,并在片段进入空闲状态时重新创建该片段。

我不知道我在这里做错了什么。所以请指导我。

默认情况下,ViewPager保留活动(当前)片段的左一页和右一页。

也就是说,当你进入第三个时,第一个会被销毁,第四个会像缓存一样创建,以获得更好的用户体验。

您可以通过调用ViewPager setOffsetscreenPageLimit 的方法来更改您的限额

关于你的错误数据:我建议你把不同实例中的逻辑从这个类中分离出来。问题是,请求是异步发出的,因此在返回响应之前更改页面,并且调用同一段代码似乎很麻烦。

我希望这能帮助你

最新更新