2012-11-04 36 views
10

Trong hoạt động của tôi, tôi đang sử dụng ViewPager để vuốt sang trái/phải và hiển thị chế độ xem theo tháng cho phù hợp. Tôi đang đi qua các tháng, năm giá trị từ onCreate đến PagerAdapter:Lịch và PagerAdapter - Số lần xem không giới hạn

private static int NUM_AWESOME_VIEWS = 3; 

viewPager = (ViewPager) v.findViewById(R.id.pager); 
cAdapter = new CalendarPagerAdapter(this.getActivity().getApplicationContext(), date_value, fragmentManager, month, year); 
viewPager.setAdapter(cAdapter); 
viewPager.setOffscreenPageLimit(3); 

Calendar bắt đầu từ tháng mười một và sau đó cuộn đến tháng Giêng. Tôi muốn Lịch hiển thị các lượt xem không giới hạn về phía trước và phía sau.

PagerAdapter:

public CalendarPagerAdapter(Context context, int dv, FragmentManager fm, int month, int year){ 
    this.context = context; 
    this.dv = dv; 
    this.fm = fm; 
    this.month = month; 
    this.year = year; 

} 

public Object instantiateItem(View collection, int position) { 
    Log.d("Object", "Instantiated"); 
    LayoutInflater inflater = (LayoutInflater) collection.getContext() 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    View v = inflater.inflate(R.layout.simple_calendar_view, null); 

    _calendar.set(Calendar.MONTH, month); 
    _calendar.set(Calendar.YEAR, year); 

    month = _calendar.get(Calendar.MONTH) + 1; 
    year = _calendar.get(Calendar.YEAR); 

    currentMonth = (Button) v.findViewById(R.id.currentMonth); 
    currentMonth.setText(hijri.getMonthForInt(month-1).toUpperCase() + " " + year); 

    calendarView = (GridView) v.findViewById(R.id.calendar); 
    calendarWeek = (GridView) v.findViewById(R.id.calendarweek); 

    calendarWeek.setAdapter(new CalendarWeekAdapter(context, firstDay)); 
    // Initialised 
    adapter = new GridCellAdapter(calendarView, context, R.id.calendar_day_gridcell, month, year, 0, 0, 0); 
    adapter.notifyDataSetChanged(); 
    calendarView.setAdapter(adapter); 

    ((ViewPager) collection).addView(v, 0); 

    return v; 
} 

Dựa trên Jon Willis' code, đây là những gì tôi đã đưa ra, nhưng khi vị trí của ViewPager là 0 hoặc 2, trang trở nên trống rỗng và sau đó hiển thị vào tháng tới + 1 (tức là sau khi cuộn tháng 1, trang sẽ nhấp nháy và hiển thị tháng 3). Nó không di chuyển trơn tru. Tôi không chắc chắn làm thế nào để làm điều đó.

viewPager.setOnPageChangeListener(new OnPageChangeListener() { 
    @Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

    } 

    @Override 
    public void onPageScrollStateChanged(int state) { 
      if (state == ViewPager.SCROLL_STATE_IDLE) 

       Log.d("Calendar ViewPager", "Calendar ViewPager" + viewPager.getCurrentItem()); 

        if (focusedPage == 0) { 

          _calendar.add(Calendar.MONTH, -1); 
          month = _calendar.get(Calendar.MONTH); 
          year = _calendar.get(Calendar.YEAR); 

          setGridCellAdapter(context, month, year); 

        } else if (focusedPage == 2) { 

          _calendar.add(Calendar.MONTH, +1); 
          month = _calendar.get(Calendar.MONTH); 
          year = _calendar.get(Calendar.YEAR); 


          setGridCellAdapter(context, month, year); 

        } 

        viewPager.setCurrentItem(1, false); 
      } 
    } 

    @Override 
    public void onPageSelected(int position) { 
      focusedPage = position; 
    } 
}); 



public void setGridCellAdapter(Context ctx, int month, int year) 
{ 
    cAdapter = new CalendarPagerAdapter(ctx, date_value, fragmentManager, month, year); 
    Log.d("Object", "Re-instantiatted" + month + year); 
    cAdapter.notifyDataSetChanged(); 
    viewPager.setAdapter(cAdapter); 

} 
+0

Tôi nghĩ chúng tôi đã giải quyết vấn đề này rồi. Nếu bạn có thể đưa cho tôi thư mục dự án hoàn chỉnh của bạn, tôi sẽ làm việc này cho bạn. Bạn đã trả tiền cho tôi một khoản tiền thưởng một lần cho việc này. Tôi đã đăng các thư mục dự án hoàn chỉnh trước khi sử dụng Google Drive của mình. Tôi nén nó, tải nó lên ổ google, đánh dấu nó là công khai, sau đó đăng một liên kết đến nó ở đây. Đó là nếu bạn không nhớ làm cho tất cả các mã của bạn có sẵn. –

+0

Xin chào @JasonHessley, thực sự đánh giá cao nếu bạn có thể giúp tôi về điều này. – input

Trả lời

4

Tôi đã đạt được để thực hiện điều này nhưng không hoàn hảo bằng cách sử dụng từng trang dưới dạng 3 đoạn. Khi người dùng nhanh chóng sang phải hoặc trái, nó sẽ đặt trở lại giữa và cập nhật nguồn dữ liệu mới cho từng đoạn.

Trong Main

MonthViewContentFragment[] fragList = new MonthViewContentFragment[3]; 
fragList[0] = MonthViewContentFragment.newInstance(prevMonth); 
fragList[1] = MonthViewContentFragment.newInstance(currentMonth); 
fragList[2] = MonthViewContentFragment.newInstance(nextMonth); 

ViewPager monthPage = (ViewPager) v.findViewById(R.id.monthview_content); 
MonthPageAdapter monthPageAdapter = new MonthPageAdapter(getFragmentManager(), fragList); 
monthPage.setAdapter(monthPageAdapter); 
monthPage.setOnPageChangeListener(this); 
monthPage.setCurrentItem(1, false); 

trong onPageScrollStateChanged

if (state == ViewPager.SCROLL_STATE_IDLE) { 

    if (focusPage < PAGE_CENTER) { 
     currentMonth.add(Calendar.MONTH, -1); 
    } else if (focusPage > PAGE_CENTER) { 
     currentMonth.add(Calendar.MONTH, 1);  
    } 
    monthPageAdapter.setCalendar(currentMonth); 
    monthPage.setCurrentItem(1, false); 
    updateTitle(); 
} 

trong onPageSelected

public void onPageSelected(int position) { 
     // TODO Auto-generated method stub 
     focusPage = position; 
} 

Trong MonthPageAdapter

MonthViewContentFragment[] fragList;  
    MonthViewContentFragment temp; 
    int fragNumber = 3; 

    public MonthPageAdapter(FragmentManager fm, MonthViewContentFragment[] 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 3; 
    } 
    public void setCalendar(Calendar currentMonth) { 

     Calendar prevMonth = Calendar.getInstance(); 
     prevMonth.setTime(currentMonth.getTime()); 
     prevMonth.add(Calendar.MONTH, -1); 

     Calendar nextMonth = Calendar.getInstance(); 
     nextMonth.setTime(currentMonth.getTime()); 
     nextMonth.add(Calendar.MONTH, 1); 
      //update all 3 fragments 
     fragList[0].updateUI(prevMonth); 
     fragList[1].updateUI(currentMonth); 
     fragList[2].updateUI(nextMonth); 
    } 

Trong MonthViewContentFragment

@Override 
    public void updateUI(Calendar monthYear) { 

     View v = getView(); 
     if (v == null) 
      return; 
     //setNewDataSource calcurate new List<String> date 
     calendarViewAdapter.setNewDataSource(monthYear); 
     calendarViewAdapter.notifyDataSetChanged(); 
    } 

Đây không phải là hoàn hảo bởi vì khi người dùng nhanh chóng quá nhanh. Cuộn không thay đổi thành không hoạt động nhưng sau đó ViewPager sẽ kết thúc.

+0

Cảm ơn bạn đã trả lời. Bạn có thể vui lòng cho tôi biết 'PAGE_CENTER' và' focusPage' và 'isDragging' là gì không? – input

+0

Tôi không chắc chắn tại sao, nhưng tôi nhận được lỗi 'ArrayIndexOutOfBoundException'. – input

+0

PAGE_CENTER luôn là 1. focusPage được đặt thành 0 hoặc 2 khi swifting sau đó đặt lại thành 1 sau khi cập nhật. isDragging chỉ cần loại bỏ nó, sai lầm của tôi. – SaintTail

4

Tôi không chắc tôi hiểu điều này (không bao giờ sử dụng ViewPager này, đã luôn luôn sử dụng HorizontalViewSlider khác thay), nhưng đối với onPageScrollStateChanged của bạn() tại sao bạn có một trường hợp đặc biệt cho focusedPage == 0 và focusedPage = = 2?

nếu không có gì đặc biệt vào tháng 1 và tháng 3, có thể xóa mọi thứ bên trong onPageScrollStateChanged()?

phỏng đoán của tôi là nhấp nháy là từ khi bạn gọi setGridCellAdapter() vì điều đó sẽ làm mới trang từ gọi notifyDataSetChanged.

+0

cảm ơn bạn đã trả lời. Tôi đang đặt số lượng cho chế độ xem cho 3 chế độ xem tại một thời điểm.Vì vậy, nếu tôi di chuyển qua lại, nó sẽ tải tháng tiếp theo và trước đó trong nền. Đó là những gì tôi hiểu từ logic ở đây: http://stackoverflow.com/questions/7440012/infinite-viewpager – input

Các vấn đề liên quan