ViewPager显示RecyclerView数据错误

时间:2015-11-18 12:39:12

标签: android android-viewpager android-recyclerview android-volley

我正在尝试每年显示假期(使用凌空从网络服务获取),并且我使用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. 当我们快速刷卡然后显示数据错误。它似乎将另一个请求的数据放在另一个片段中。
  3. 我已经尝试过使用pager.setOffscreenPageLimit(1);但是当它处于空闲状态时,它不起作用并重新创建片段。

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

1 个答案:

答案 0 :(得分:0)

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

这是,当你转到第三个时,第一个被破坏,而第四个被创建就像一个缓存,以获得更好的用户体验。

您可以使用ViewPager setOffscreenPageLimit

的方法更改限制

关于错误的数据:我建议您将不同实例中的逻辑与此类分开。问题是请求是异步进行的,因此您在回复之前更改了页面,并且调用同一段代码似乎很麻烦。

我希望这会对你有所帮助