如何使无限寻呼机在Android中使用ViewPager [英] How to make unlimited pager using ViewPager in Android

查看:359
本文介绍了如何使无限寻呼机在Android中使用ViewPager的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在我的日历中显示无限viewpager当我滑到月视图。我该怎么办呢?我想我需要3个片段做到这一点。但是,我不知道如何更新月份(片段),当我向左或向右滑动。我重视我下面的code。我给问号,我不知道到code。
这是我的项目: https://github.com/lolyoshi/CalendarWidget

任何帮助是AP preciated。

InfinitedPagerAdapter.java

 公共类InfinitePagerAdapter扩展FragmentPagerAdapter {    CalendarView [] fragList;
    INT fragNumber = 3;    公共InfinitePagerAdapter(FragmentManager FM,CalendarView [] fragList){
        超(FM);
        this.fragList = fragList;
    }    @覆盖
    公众诠释getItemPosition(Object对象){
        // TODO自动生成方法存根
        返回POSITION_NONE;
    }    @覆盖
    公共片段的getItem(INT位置){
        返回fragList [位置]
    }    @覆盖
    公众诠释的getCount(){
        返回fragNumber;
    }    公共无效setCalendar(????){
          //需要更新3个片段
           ??????????????????????
    }    @覆盖
    公共布尔isViewFromObject(查看为arg0,ARG1对象){
        // TODO自动生成方法存根
        返回false;
    }
}

CalendarWidget.java

 公共类CalendarWidget扩展FragmentActivity {
    ViewPager monthPage;
    私有静态最终诠释PAGE_MIDDLE = 1;
    私人INT mSelectedPageIndex = 1;
    公共日历curMonth;
    InfinitePagerAdapter monthPageAdapter;    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.calendar_layout);        CalendarView [] fragList =新CalendarView [3];
        curMonth = Calendar.getInstance();
        日历prevMonth,nextMonth;
        prevMonth =(日历)curMonth.clone();
        nextMonth =(日历)curMonth.clone();
        prevMonth.set(的Calendar.MONTH,prevMonth.get(的Calendar.MONTH) - 1);
        nextMonth.set(的Calendar.MONTH,nextMonth.get(的Calendar.MONTH)+1);
        fragList [0] = CalendarView.newInstance(prevMonth);
        fragList [1] = CalendarView.newInstance(curMonth);
        fragList [2] = CalendarView.newInstance(nextMonth);        monthPage =(ViewPager)findViewById(R.id.pager);
        monthPageAdapter =新InfinitePagerAdapter(getSupportFragmentManager(),fragList);
        monthPage.setOnPageChangeListener(新ViewPager.OnPageChangeListener(){            @覆盖
            公共无效onPageScrollStateChanged(INT为arg0){
                // TODO自动生成方法存根
                 如果(mSelectedPageIndex< PAGE_MIDDLE){
                     curMonth.add(的Calendar.MONTH,-1);
                    }否则如果(mSelectedPageIndex> PAGE_MIDDLE){
                        curMonth.add(的Calendar.MONTH,1);
                    }
                                        //需要更新3个片段
                    monthPageAdapter.setCalendar(????);
                        monthPage.setCurrentItem(1,FALSE);
            }            @覆盖
            公共无效onPageScrolled(INT为arg0,ARG1浮球,诠释ARG2){
                // TODO自动生成方法存根            }            @覆盖
            公共无效使用onPageSelected(INT为arg0){
                // TODO自动生成方法存根
                mSelectedPageIndex =为arg0;
            }});
        monthPage.setAdapter(monthPageAdapter);
        monthPage.setCurrentItem(1,FALSE);
    }
}

CalendarView.java

 公共类CalendarView扩展片段{
    受保护的静态日历日历;
    保护最后的日历itemMonth;
    私人CalendarAdapter calendarAdapter;
    私人的LinearLayout calendarLayout;
    公众的ArrayList<串GT;项目;
    ArrayList的<串GT;事件;
    ArrayList的<串GT;说明;
    公开处理程序处理程序;
    私人诠释mMonth,mYear;    私有静态最终诠释PAGE_LEFT = 0;
    私有静态最终诠释PAGE_MIDDLE = 1;
    私有静态最终诠释PAGE_RIGHT = 2;    静态的newInstance CalendarView(?????){
        //我可以把什么在这个功能呢?
        返回F;
    }    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
    }    @覆盖
    公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
            捆绑savedInstanceState){
        calendarLayout =(的LinearLayout)inflater.inflate(R.layout.calendar_layout,集装箱,FALSE);
        最终的GridView calendarDayGrid =(GridView控件)calendarLayout.findViewById(R.id.calendar_days_grid);
        calendarDayGrid.setAdapter(新ArrayAdapter&所述;字符串>(getActivity(),R.layout.day_cell,get​​Resources()getStringArray(R.array.days_array))。);
        最终的GridView calendarGrid =(GridView控件)calendarLayout.findViewById(R.id.calendar_grid);
        calendarGrid.setOnTouchListener(新OnTouchListener(){
            @覆盖
            公共布尔onTouch(视图V,MotionEvent事件){
                如果(event.getAction()== MotionEvent.ACTION_MOVE){
                    返回true;
                }
                返回false;
            }        });
        calendarGrid.setOnItemClickListener(新DayItemClickListener());
        DisplayMetrics displaymetrics =新DisplayMetrics();
        。getActivity()getWindowManager()getDefaultDisplay()getMetrics(displaymetrics)。
        INT高度= displaymetrics.heightPixels;
        INT宽度= displaymetrics.widthPixels;
        浮gridHeight =高度* 3/4​​ - 3 *(convertDpToPixels(50,getActivity())); //修复星期天桌子的高度= 25dp
        calendarAdapter =新CalendarAdapter(getActivity(),日历,gridHeight);
        updateCurrentMonth();
        calendarGrid.setAdapter(calendarAdapter);
        返回calendarLayout;
    }    公共CalendarView(){
        日历= Calendar.getInstance();
        itemMonth =(日历)calendar.clone();
    }
    保护无效updateCurrentMonth(){
        calendarAdapter.refreshDays();
        //handler.post(calendarUpdater);
        TextView的月=(TextView中)calendarLayout.findViewById(R.id.month_title);
        month.setTextColor(Color.BLACK);
        INT monthID = calendar.get(的Calendar.MONTH);
        INT [] = monthIds {R.string.january,R.string.february,R.string.march,R.string.april,R.string.may,R.string.june,
                R.string.july,R.string.august,R.string.september,R.string.october,R.string.november,R.string.december};
        month.setText(monthIds [monthID]);
        字符串TMP =(字符串)month.getText();
        month.setText(TMP ++ calendar.get(Calendar.YEAR));
    }    保护最终无效onNextMonth(){
        如果(calendar.get(的Calendar.MONTH)== Calendar.DECEMBER){
            calendar.set((calendar.get(Calendar.YEAR)+1),Calendar.JANUARY,1);
        }其他{
            calendar.set(的Calendar.MONTH,calendar.get(的Calendar.MONTH)+1);
        }
        updateCurrentMonth(日历);
    }    在previousMonth保护最终无效(){
        如果(calendar.get(的Calendar.MONTH)== Calendar.JANUARY){
            calendar.set((calendar.get(Calendar.YEAR) - 1),Calendar.DECEMBER,1);
        }其他{
            calendar.set(的Calendar.MONTH,calendar.get(的Calendar.MONTH)-1);
        }
        updateCurrentMonth(日历);
    }    公共静态浮动convertDpToPixels(浮DP,上下文的背景下){
        资源资源= context.getResources();
        DisplayMetrics度量= resources.getDisplayMetrics();
        浮动PX = DP *(metrics.densityDpi / 160F);
        返回像素;
    }    公共静态浮动convertPixelsToDp(浮点像素,上下文的背景下){
        资源资源= context.getResources();
        DisplayMetrics度量= resources.getDisplayMetrics();
        浮DP = PX /(metrics.densityDpi / 160F);
        返回DP;
    }    私人final类DayItemClickListener实现OnItemClickListener {
        @覆盖
        公共无效onItemClick(适配器视图<>母公司,观景,INT位置,长的id){
            最终的TextView dayView =(TextView中)view.findViewById(R.id.date_in_cell);
            最后CharSequence的文字= dayView.getText();
            如果(文= NULL&放大器;!&安培;!等于(文本)){
                calendarAdapter.setSelected(calendar.get(Calendar.YEAR),calendar.get(的Calendar.MONTH),Integer.valueOf(将String.valueOf(文本)));
            }
        }
    }
}


解决方案

为什么当你刷你一个月没有更新的原因是因为你已经声明的受保护的静态日历日历; 静态。一旦你消除静电,这三个页面显示不同的月份。

请只是因为它是在github,但这种改变你的日历视图:

 静态CalendarView的newInstance(日历中){
    CalendarView F =新CalendarView(一);
    返回F;
}公共CalendarView(日历CAL){
    日历= CAL;
}

您适配器将简单:

 公共类InfinitePagerAdapter扩展FragmentPagerAdapter {    CalendarView [] fragList;    公共InfinitePagerAdapter(FragmentManager FM,CalendarView [] fragList){
        超(FM);
        this.fragList = fragList;
    }    @覆盖
    公共片段的getItem(INT位置){
        返回fragList [位置]
    }    @覆盖
    公众诠释的getCount(){
        返回fragList.length;
    }
}

最后,在你的日历组件如下修改:

  @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_calendar_widget);        最终CalendarView [] fragList =新CalendarView [3];
        curMonth = Calendar.getInstance();
        日历prevMonth,nextMonth;
        prevMonth =(日历)curMonth.clone();
        nextMonth =(日历)curMonth.clone();
        prevMonth.set(的Calendar.MONTH,prevMonth.get(的Calendar.MONTH) - 1);
        nextMonth.set(的Calendar.MONTH,nextMonth.get(的Calendar.MONTH)+1);
        fragList [0] = CalendarView.newInstance(prevMonth);
        fragList [1] = CalendarView.newInstance(curMonth);
        fragList [2] = CalendarView.newInstance(nextMonth);        monthPage =(ViewPager)findViewById(R.id.pager);
        monthPageAdapter =新InfinitePagerAdapter(getSupportFragmentManager(),fragList);
        monthPage.setOnPageChangeListener(新ViewPager.OnPageChangeListener(){            @覆盖
            公共无效onPageScrollStateChanged(INT为arg0){
                // TODO自动生成方法存根
                如果(arg0中== ViewPager.SCROLL_STATE_IDLE){
                    如果(mSelectedPageIndex< PAGE_MIDDLE){
                        fragList [0]。对previousMonth();
                        fragList [1]。对previousMonth();
                        fragList [2]。对previousMonth();
                    }否则如果(mSelectedPageIndex> PAGE_MIDDLE){
                        fragList [0] .onNextMonth();
                        fragList [1] .onNextMonth();
                        fragList [2] .onNextMonth();
                    }
                    monthPage.setCurrentItem(1,FALSE);
                }
            }            @覆盖
            公共无效onPageScrolled(INT为arg0,ARG1浮球,诠释ARG2){
                // TODO自动生成方法存根            }            @覆盖
            公共无效使用onPageSelected(INT为arg0){
                // TODO自动生成方法存根
                mSelectedPageIndex =为arg0;
            }
        });
        monthPage.setAdapter(monthPageAdapter);
        monthPage.setCurrentItem(1,FALSE);
    }

这是所有你需要做的。一切都应该工作应有的作用。

请注意:尽管一切正常,克隆和身边掠过日历对象未必是最好的事情。 日历对象是昂贵的。你应该绕过时间如果可能的话。就拿一些动机<一个href=\"https://$c$c.google.com/p/electricsleep/source/browse/trunk/src/com/androsz/electricsleepbeta/app/HistoryMonthActivity.java\"相对=nofollow>这里

I want to display unlimited viewpager in my calendar when I slide the month view. How can I do that? I think I need 3 fragments to do that. However, I don't know how to update the month (fragment) when I swipe Left or right. I attached my code below. I give question marks where I have no idea to code. This is my project: https://github.com/lolyoshi/CalendarWidget

Any help is appreciated.

InfinitedPagerAdapter.java

public class InfinitePagerAdapter extends FragmentPagerAdapter{

    CalendarView[] fragList;  
    int fragNumber = 3;

    public InfinitePagerAdapter(FragmentManager fm, CalendarView[] fragList) {
        super(fm);
        this.fragList = fragList;
    }

    @Override
    public int getItemPosition(Object object) {
        // TODO Auto-generated method stub
        return POSITION_NONE;
    }

    @Override
    public Fragment getItem(int position) {
        return fragList[position];      
    }

    @Override
    public int getCount() {
        return fragNumber;
    }

    public void setCalendar(????) {
          //Need to update 3 fragments
           ??????????????????????
    }

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        // TODO Auto-generated method stub
        return false;
    }
}

CalendarWidget.java

public class CalendarWidget extends FragmentActivity {
    ViewPager monthPage;
    private static final int PAGE_MIDDLE = 1;
    private int mSelectedPageIndex = 1;
    public Calendar curMonth;
    InfinitePagerAdapter monthPageAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.calendar_layout);

        CalendarView[] fragList = new CalendarView[3];
        curMonth = Calendar.getInstance();
        Calendar prevMonth, nextMonth;
        prevMonth = (Calendar) curMonth.clone();
        nextMonth = (Calendar) curMonth.clone();
        prevMonth.set(Calendar.MONTH, prevMonth.get(Calendar.MONTH) - 1);
        nextMonth.set(Calendar.MONTH, nextMonth.get(Calendar.MONTH) + 1);
        fragList[0] = CalendarView.newInstance(prevMonth);
        fragList[1] = CalendarView.newInstance(curMonth);
        fragList[2] = CalendarView.newInstance(nextMonth);

        monthPage = (ViewPager)findViewById(R.id.pager);
        monthPageAdapter = new InfinitePagerAdapter(getSupportFragmentManager(), fragList);
        monthPage.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageScrollStateChanged(int arg0) {
                // TODO Auto-generated method stub
                 if (mSelectedPageIndex < PAGE_MIDDLE) {
                     curMonth.add(Calendar.MONTH, -1);
                    } else if (mSelectedPageIndex > PAGE_MIDDLE) {
                        curMonth.add(Calendar.MONTH, 1);    
                    }
                                        //Need to update 3 fragments
                    monthPageAdapter.setCalendar(????);
                        monthPage.setCurrentItem(1, false);
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onPageSelected(int arg0) {
                // TODO Auto-generated method stub
                mSelectedPageIndex = arg0;
            }});
        monthPage.setAdapter(monthPageAdapter);
        monthPage.setCurrentItem(1, false);
    }    
}

CalendarView.java

public class CalendarView extends Fragment{
    protected static Calendar calendar;
    protected final Calendar itemMonth;
    private CalendarAdapter calendarAdapter;
    private LinearLayout calendarLayout;
    public ArrayList<String> items;
    ArrayList<String> event;
    ArrayList<String> desc;
    public Handler handler;
    private int mMonth, mYear;

    private static final int PAGE_LEFT = 0;
    private static final int PAGE_MIDDLE = 1;
    private static final int PAGE_RIGHT = 2;

    static CalendarView newInstance(?????) {
        //What can I put in this function?
        return f;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        calendarLayout = (LinearLayout)inflater.inflate(R.layout.calendar_layout, container, false);
        final GridView calendarDayGrid = (GridView)calendarLayout.findViewById(R.id.calendar_days_grid);
        calendarDayGrid.setAdapter(new ArrayAdapter<String>(getActivity(), R.layout.day_cell, getResources().getStringArray(R.array.days_array)));
        final GridView calendarGrid = (GridView)calendarLayout.findViewById(R.id.calendar_grid);
        calendarGrid.setOnTouchListener(new OnTouchListener(){
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if(event.getAction() == MotionEvent.ACTION_MOVE){
                    return true;
                }
                return false;
            }

        });
        calendarGrid.setOnItemClickListener(new DayItemClickListener());
        DisplayMetrics displaymetrics = new DisplayMetrics();
        getActivity().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
        int height = displaymetrics.heightPixels;
        int width = displaymetrics.widthPixels;
        float gridHeight = height*3/4 - 3*(convertDpToPixels(50, getActivity())); //fix the height of table of days in week = 25dp
        calendarAdapter = new CalendarAdapter(getActivity(), calendar, gridHeight);
        updateCurrentMonth();         
        calendarGrid.setAdapter(calendarAdapter);
        return calendarLayout;
    }

    public CalendarView() {
        calendar = Calendar.getInstance();
        itemMonth = (Calendar) calendar.clone();
    }


    protected void updateCurrentMonth() {
        calendarAdapter.refreshDays();
        //handler.post(calendarUpdater);
        TextView month = (TextView)calendarLayout.findViewById(R.id.month_title);        
        month.setTextColor(Color.BLACK);
        int monthID = calendar.get(Calendar.MONTH);
        int[] monthIds = {R.string.january,R.string.february,R.string.march,R.string.april,R.string.may,R.string.june,
                R.string.july,R.string.august,R.string.september,R.string.october,R.string.november,R.string.december};
        month.setText(monthIds[monthID]);
        String tmp = (String) month.getText();
        month.setText(tmp + " " + calendar.get(Calendar.YEAR));
    }

    protected final void onNextMonth() {
        if (calendar.get(Calendar.MONTH) == Calendar.DECEMBER) {
            calendar.set((calendar.get(Calendar.YEAR) + 1), Calendar.JANUARY, 1);
        } else {
            calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + 1);
        }
        updateCurrentMonth(calendar);
    }

    protected final void onPreviousMonth() {
        if (calendar.get(Calendar.MONTH) == Calendar.JANUARY) {
            calendar.set((calendar.get(Calendar.YEAR) - 1), Calendar.DECEMBER, 1);
        } else {
            calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH)-1);
        }
        updateCurrentMonth(calendar);
    }

    public static float convertDpToPixels(float dp,Context context){
        Resources resources = context.getResources();
        DisplayMetrics metrics = resources.getDisplayMetrics();
        float px = dp * (metrics.densityDpi/160f);
        return px;
    }

    public static float convertPixelsToDp(float px,Context context){
        Resources resources = context.getResources();
        DisplayMetrics metrics = resources.getDisplayMetrics();
        float dp = px / (metrics.densityDpi / 160f);
        return dp;   
    }

    private final class DayItemClickListener implements OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            final TextView dayView = (TextView)view.findViewById(R.id.date_in_cell);
            final CharSequence text = dayView.getText();
            if (text != null && !"".equals(text)) {
                calendarAdapter.setSelected(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), Integer.valueOf(String.valueOf(text)));
            }
        }       
    }
}

解决方案

The reason why your month don't update when you swipe is because you have declared the protected static Calendar calendar; static. Once you remove the static, all three pages show different months.

Keep your calendar view just as it is on github, except this change:

static CalendarView newInstance(Calendar a) {
    CalendarView f = new CalendarView(a);
    return f;
}

public CalendarView(Calendar cal) {
    calendar = cal;
}

Your adapter will be as simple as:

public class InfinitePagerAdapter extends FragmentPagerAdapter{

    CalendarView[] fragList;  

    public InfinitePagerAdapter(FragmentManager fm, CalendarView[] fragList) {
        super(fm);
        this.fragList = fragList;
    }

    @Override
    public Fragment getItem(int position) {
        return fragList[position];
    }

    @Override
    public int getCount() {
        return fragList.length;
    }
}

Finally in your Calendar widget modify as below:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_calendar_widget);

        final CalendarView[] fragList = new CalendarView[3];
        curMonth = Calendar.getInstance();
        Calendar prevMonth, nextMonth;
        prevMonth = (Calendar) curMonth.clone();
        nextMonth = (Calendar) curMonth.clone();
        prevMonth.set(Calendar.MONTH, prevMonth.get(Calendar.MONTH) - 1);
        nextMonth.set(Calendar.MONTH, nextMonth.get(Calendar.MONTH) + 1);
        fragList[0] = CalendarView.newInstance(prevMonth);
        fragList[1] = CalendarView.newInstance(curMonth);
        fragList[2] = CalendarView.newInstance(nextMonth);

        monthPage = (ViewPager) findViewById(R.id.pager);
        monthPageAdapter = new InfinitePagerAdapter(getSupportFragmentManager(), fragList);
        monthPage.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageScrollStateChanged(int arg0) {
                // TODO Auto-generated method stub
                if (arg0 == ViewPager.SCROLL_STATE_IDLE) {
                    if (mSelectedPageIndex < PAGE_MIDDLE) {
                        fragList[0].onPreviousMonth();
                        fragList[1].onPreviousMonth();
                        fragList[2].onPreviousMonth();
                    } else if (mSelectedPageIndex > PAGE_MIDDLE) {
                        fragList[0].onNextMonth();
                        fragList[1].onNextMonth();
                        fragList[2].onNextMonth();
                    }
                    monthPage.setCurrentItem(1, false);
                }
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onPageSelected(int arg0) {
                // TODO Auto-generated method stub
                mSelectedPageIndex = arg0;
            }
        });
        monthPage.setAdapter(monthPageAdapter);
        monthPage.setCurrentItem(1, false);
    }

That is all you need to do. Everything should work as desired.

Note: Despite everything works, cloning and passing around calendar objects may not be the best thing to do. Calendar objects are expensive. You should pass around Time if possible. Take some motivation from here

这篇关于如何使无限寻呼机在Android中使用ViewPager的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆