我试图显示每年的假期(使用截击从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);
}
}
它正确地显示向左或向右滑动的页面,但现在存在以下两个问题:
- 一次形成三个页面,所以当我们向左或向右滑动时,它再次调用get holiday方法,该方法在视图已经创建时创建视图,所以我不知道它为什么要重新创建页面
- 当我们快速滑动时,就会显示数据错误。它似乎将另一个请求的数据放在了另一个片段中
我已经用寻呼机试过了。setOffsetscreenPageLimit(1);但is不起作用,并在片段进入空闲状态时重新创建该片段。
我不知道我在这里做错了什么。所以请指导我。
默认情况下,ViewPager保留活动(当前)片段的左一页和右一页。
也就是说,当你进入第三个时,第一个会被销毁,第四个会像缓存一样创建,以获得更好的用户体验。
您可以通过调用ViewPager setOffsetscreenPageLimit 的方法来更改您的限额
关于你的错误数据:我建议你把不同实例中的逻辑从这个类中分离出来。问题是,请求是异步发出的,因此在返回响应之前更改页面,并且调用同一段代码似乎很麻烦。
我希望这能帮助你