Viewpager在Android中无休止地天之间进行切换 [英] Viewpager in Android to switch between days endlessly
问题描述
我目前做一个应用程序,学生可以查看有课网格。 这些课程是使用 JSON文件检索。 现在,日终通过在动作条按钮完成,但我希望把它也与流畅的滑动效果的工作。
这是需要改变的唯一的事情就是SlectedDate-1在左边的刷卡。 右边将selectedDate + 1 刷卡
我试图与 ViewPager
取值,但它没有工作没有任何人知道该怎么办呢?
或许真的有3 viewpagers?请详细code,因为我不是很familar与viewpagers code!
我已经试过了的Android ViewPager与日期 code工作,但它并没有为我工作。
私有类ScreenSlidePagerAdapter扩展FragmentStatePagerAdapter {
公共ScreenSlidePagerAdapter(FragmentManager FM){
超(FM);
}
@覆盖
公共片段的getItem(INT位置){
字符串myFormat =YYYY-MM-DD;
SimpleDateFormat的SDF =新的SimpleDateFormat(myFormat,Locale.US);
开关(位置){
情况下0:
//创建日期,最左边的片段
myCalendar.add(Calendar.DAY_OF_YEAR,-1);
最后弦乐dateje = sdf.format(myCalendar.getTime());
// mPager.setCurrentItem(1);
返回ScreenSlidePageFragment.create(dateje);
情况1:
//创建日期为中心的片段
myCalendar.add(Calendar.DAY_OF_YEAR,0);
最后弦乐dateje2 = sdf.format(myCalendar.getTime());
//mPager.setCurrentItem(1);
返回ScreenSlidePageFragment.create(dateje2);
案例2:
myCalendar.add(Calendar.DAY_OF_YEAR,1);
最后弦乐dateje3 = sdf.format(myCalendar.getTime());
//mPager.setCurrentItem(1);
返回ScreenSlidePageFragment.create(dateje3);
}
返回null;
}
@覆盖
公众诠释getCount将(){
返回3;
}
我的例子片段
公共类ScreenSlidePageFragment扩展片段{
/ **
*参数键页码该片段重新presents。
* /
公共静态最后弦乐ARG_PAGE =页面;
/ **
*片段的页号,它被设置为{@link #ARG_PAGE}的参数值。
* /
私人诠释mPageNumber;
/ **
*工厂方法该片段类。为给定的页面数的新的片段。
* /
公共静态ScreenSlidePageFragment创建(字符串dateNumber){
ScreenSlidePageFragment片段=新ScreenSlidePageFragment();
捆绑的args =新包();
args.putString(ARG_PAGE,dateNumber);
fragment.setArguments(参数);
返回片段;
}
公共ScreenSlidePageFragment(){
}
@覆盖
公共无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
mPageNumber = 1;
}
@覆盖
公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
捆绑savedInstanceState){
//充气含标题和正文布局。
ViewGroup中rootView =(的ViewGroup)充气
.inflate(R.layout.fragment_screen_slide_page,集装箱,假);
。字符串日期= this.getArguments()的getString(ARG_PAGE);
//设置标题视图,显示页码。
((TextView中)rootView.findViewById(android.R.id.text1))的setText(日期);
返回rootView;
}
/ **
*返回此片段对象psented页码重新$ P $。
* /
公众诠释getPageNumber(){
返回mPageNumber;
}
}
我已经解决了这个问题一点时间前,这code是一个有点基于ONT从Kuffs的答案,但我dont't得到的日期一个数组,因为它的很多性能要放很多天阵。
的code Summarry (1)code使得在它周围10.000页fragmentpager。在主要活动初始化应用程序在中间设置TE当前页面(5000)
pager.setAdapter(新BootstrapPagerAdapter(getResources(),getSupportFragmentManager()));
pager.setCurrentItem(5000,FALSE);
pager.post(新的Runnable(){
公共无效的run(){
pager.setCurrentItem(5000,FALSE);
}
});
pager.getAdapter()notifyDataSetChanged()。
pager.setOffscreenPageLimit(0);
的code摘要(2)在bootstrappageradapter
在code看起来什么位置,用户滚动,现在看起来的日期
日期时间pagerdate = DateTime.now(TimeZone.getDefault());
日期时间天= pagerdate.plusDays(位置 - 5000);
例如。用户刷卡5天下一步。位置是5003 所以总和为5003-5000 = 3天
天易数加3天, date4j库(我强烈推荐!)然后我让在其束之日起一个新的片段!
公共类BootstrapPagerAdapter扩展FragmentPagerAdapter {
/ **
*创建寻呼机适配器
*
* @参数资源
* @参数fragmentManager
* /
公共BootstrapPagerAdapter(资源资源,FragmentManager fragmentManager){
超(fragmentManager);
}
@覆盖
公众诠释getCount将(){
返回10000;
}
@覆盖
公众诠释getItemPosition(Object对象){
返回FragmentStatePagerAdapter.POSITION_NONE;
}
@覆盖
公共片段的getItem(INT位置){
日期时间pagerdate = DateTime.now(TimeZone.getDefault());
日期时间天= pagerdate.plusDays(位置 - 5000);
束束=新包();
bundle.putString(日期,days.format(YYYY-MM-DD)的toString());
RoosterFragment roosterFragment =新RoosterFragment();
roosterFragment.setArguments(包);
返回roosterFragment;
}
}
您可以假冒不休具有更高的数字像数 一年0001 3999年
围绕:1.500.000天相信我,没有人会走这么远的所有刷卡的方式! 我已经尝试了很多无限的例子,但是这是唯一的工作的例子,我认为!
Upvote,如果它为你工作,不要害羞,要求更多的例子,或与您的应用程序的帮助!
但它会很酷,如果有人有东西像一个真正infinte viewpager无假货计等;)
I am currently making a app where students can view there lesson grid. The lessons are retrieved using a json file. Now the date changing is done via buttons in the actionbar, but i want to make it also work with smooth swipe effects.
The only things that need to change is the SlectedDate-1 on left swipe. the SelectedDate+1 on right swipe.
I tried it with ViewPager
s but it didn't work does anybody know how to do it?
Maybe something with 3 viewpagers?, please a detailed code because I'm not very familar with viewpagers code!
I've tried out Android ViewPager working with date code but it doesn't work for me.
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
String myFormat = "yyyy-MM-dd";
SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
switch (position) {
case 0:
// create your dates for the leftmost fragment
myCalendar.add(Calendar.DAY_OF_YEAR, -1);
final String dateje = sdf.format(myCalendar.getTime());
// mPager.setCurrentItem(1);
return ScreenSlidePageFragment.create(dateje);
case 1:
// create your dates for the center fragment
myCalendar.add(Calendar.DAY_OF_YEAR, 0);
final String dateje2 = sdf.format(myCalendar.getTime());
//mPager.setCurrentItem(1);
return ScreenSlidePageFragment.create(dateje2);
case 2:
myCalendar.add(Calendar.DAY_OF_YEAR, 1);
final String dateje3 = sdf.format(myCalendar.getTime());
//mPager.setCurrentItem(1);
return ScreenSlidePageFragment.create(dateje3);
}
return null;
}
@Override
public int getCount() {
return 3;
}
my example fragment
public class ScreenSlidePageFragment extends Fragment {
/**
* The argument key for the page number this fragment represents.
*/
public static final String ARG_PAGE = "page";
/**
* The fragment's page number, which is set to the argument value for {@link #ARG_PAGE}.
*/
private int mPageNumber;
/**
* Factory method for this fragment class. Constructs a new fragment for the given page number.
*/
public static ScreenSlidePageFragment create(String dateNumber) {
ScreenSlidePageFragment fragment = new ScreenSlidePageFragment();
Bundle args = new Bundle();
args.putString(ARG_PAGE, dateNumber);
fragment.setArguments(args);
return fragment;
}
public ScreenSlidePageFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPageNumber = 1;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout containing a title and body text.
ViewGroup rootView = (ViewGroup) inflater
.inflate(R.layout.fragment_screen_slide_page, container, false);
String date = this.getArguments().getString(ARG_PAGE);
// Set the title view to show the page number.
((TextView) rootView.findViewById(android.R.id.text1)).setText(date);
return rootView;
}
/**
* Returns the page number represented by this fragment object.
*/
public int getPageNumber() {
return mPageNumber;
}
}
I have fixed this problems a little time ago, this code is a bit based ont the answer from Kuffs but I dont't get the date in an array because it's a lot of performance to put a lot of days in array.
Summarry of code (1) The code makes a fragmentpager with around 10.000 pages in it. On main activity init the app set te current page in the middle(5000)
pager.setAdapter(new BootstrapPagerAdapter(getResources(), getSupportFragmentManager()));
pager.setCurrentItem(5000, false);
pager.post(new Runnable() {
public void run() {
pager.setCurrentItem(5000, false);
}
});
pager.getAdapter().notifyDataSetChanged();
pager.setOffscreenPageLimit(0);
Summary of code (2) in the bootstrappageradapter
The code looks what position the user has scrolled and looks for the date now
DateTime pagerdate = DateTime.now(TimeZone.getDefault());
DateTime days = pagerdate.plusDays(position - 5000);
e.g. user swiped five days next. position is 5003 so the sum is 5003-5000=3 days
the days count easily plus 3 days with date4j library (I highly recommend it!) then I make a new fragment with the date in its bundle!
public class BootstrapPagerAdapter extends FragmentPagerAdapter {
/**
* Create pager adapter
*
* @param resources
* @param fragmentManager
*/
public BootstrapPagerAdapter(Resources resources, FragmentManager fragmentManager) {
super(fragmentManager);
}
@Override
public int getCount() {
return 10000;
}
@Override
public int getItemPosition(Object object){
return FragmentStatePagerAdapter.POSITION_NONE;
}
@Override
public Fragment getItem(int position) {
DateTime pagerdate = DateTime.now(TimeZone.getDefault());
DateTime days = pagerdate.plusDays(position - 5000);
Bundle bundle = new Bundle();
bundle.putString("date", days.format("YYYY-MM-DD").toString());
RoosterFragment roosterFragment = new RoosterFragment();
roosterFragment.setArguments(bundle);
return roosterFragment;
}
}
You could fake the endlessly count with more high numbers like year 0001 year 3999
Around the: 1.500.000 days believe me no one is gonna go this far all the way swiping! I've tried the a lot infinite examples but this is the only working example I think!
Upvote if it worked for you and don't be shy to ask for more examples or help with your app!
However it would be cool if someone got something like a really infinte viewpager without fake counts and so on ;)
这篇关于Viewpager在Android中无休止地天之间进行切换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!