0

我有一个日历,我需要去6个月,而不是6个月转发,并且在6个月前有点麻烦。我如何让这个日历从当前月份开始回溯6个月,然后滚动到过去6个月?带月份标题(Google HeaderView)的日历(GridView)

另外,我正在使用Google HeaderView来显示日历的gridview的headerview。如何在每个月结束后添加空白空间以便能够在该区域放置当月的标题? Google HeaderView似乎只在GridView的开始处填充一次。

public class CalendarAt;ctivity extends Activity implements AppCompatCallback { 
    private AppCompatDelegate delegate; 
    Toolbar mToolbar; 
    private HeaderGridView mGridView; 
    private TextView mHeaderTextView; 
    private LinearLayout calendar_view_header; 
    private ImageView mCalendarButtonClicked, mCalendarButton, settingsBtn, settingsBtnChecked; 
    private PopupWindow mPopUp; 


    //default 6 months +- half a day 
    private static final int DAYS_COUNT = 182; 

    // current displayed month 
    private Calendar currentDate = Calendar.getInstance(); 

    private EventListener eventListener = null; 

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

     HashSet<Date> events = new HashSet<>(); 
     events.add(new Date()); 


     //Show Toolbar without extending AppCompatActivity 
     delegate = AppCompatDelegate.create(this, this); 
     delegate.onCreate(savedInstanceState); 
     delegate.setContentView(R.layout.calendar_main); 
     delegate.setSupportActionBar(mToolbar); 
     mGridView = (HeaderGridView) findViewById(R.id.calendar_grid); 
     settingsBtn = (ImageView) findViewById(R.id.settingsBtn); 
     settingsBtnChecked = (ImageView) findViewById(R.id.settingsBtnClicked); 
     mCalendarButton = (ImageView) findViewById(R.id.eReceiptSearchBtn); 
     mCalendarButton.setVisibility(View.GONE); 
     mCalendarButtonClicked = (ImageView) findViewById(R.id.eReceiptSearchBtnClicked); 
     calendar_view_header = (LinearLayout) findViewById(R.id.calendar_view_header); 
     mCalendarButtonClicked.setVisibility(View.VISIBLE); 
     updateCalendar(); 
     mCalendarButtonClicked.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       startActivity(new Intent(getApplicationContext(), MainActivity.class)); 
      } 
     }); 

     settingsBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       showPreferencesPopup(); 
       mCalendarButtonClicked.setVisibility(View.GONE); 
       mCalendarButton.setVisibility(View.VISIBLE); 
      } 
     }); 
     mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       //Replace with just EReceipts for the specific date which was clicked on 
       startActivity(new Intent(getApplicationContext(), MainActivity.class)); 
      } 
     }); 
    } 

    public void updateCalendar() { 
     updateCalendar(null); 
    } 

    private void updateCalendar(HashSet<Date> events) { 
     Calendar calendar = (Calendar) currentDate.clone(); 
     int monthBeginningCell = calendar.get(Calendar.DAY_OF_WEEK) - 1; 
     ArrayList<Date> cells = new ArrayList<>(); 
     calendar.add(Calendar.DAY_OF_MONTH, -monthBeginningCell); 

     while (cells.size() < DAYS_COUNT) { 
      cells.add(calendar.getTime()); 
      calendar.add(Calendar.DAY_OF_MONTH, 1); 
      calendar.set(Calendar.MONTH, 6); 
     } 

     String monthname=(String)android.text.format.DateFormat.format("MMMM", new Date()); 
     String year = (String)android.text.format.DateFormat.format("yyyy", new Date()); 
     Log.i("HERE", "updateCalendar: " + monthname + " " + year); 
     View headerView = getLayoutInflater().inflate(R.layout.calendar_view_header, null); 
     mGridView.addHeaderView(headerView); 
     mGridView.setAdapter(new CalendarAdapter(getApplicationContext(), cells, events)); 
    } 

    @Override 
    public void onSupportActionModeStarted(ActionMode mode) { 

    } 

    @Override 
    public void onSupportActionModeFinished(ActionMode mode) { 

    } 

    @Nullable 
    @Override 
    public ActionMode onWindowStartingSupportActionMode(ActionMode.Callback callback) { 
     return null; 
    } 

    private class CalendarAdapter extends ArrayAdapter<Date> { 
     private HashSet<Date> eventDays; 
     private LayoutInflater inflater; 

     public CalendarAdapter(Context context, ArrayList<Date> days, HashSet<Date> eventDays) { 
      super(context, R.layout.control_calendar_day, days); 
      this.eventDays = eventDays; 
      inflater = LayoutInflater.from(context); 
     } 

     @Override 
     public View getView(int position, View view, ViewGroup parent) { 
      Date date = getItem(position); 
      int day = date.getDate(); 
      int month = date.getMonth(); 
      int year = date.getYear(); 
      String fullDate; 

      if (view == null) { 
       view = inflater.inflate(R.layout.control_calendar_day, parent, false); 

       view.setBackgroundResource(0); 
       if (eventDays != null) { 
        for (Date eventDate : eventDays) { 
         if (eventDate.getDate() == day && eventDate.getMonth() == month && 
           eventDate.getYear() == year) { 
          view.setBackgroundResource(R.color.colorBlack); 
          ((TextView) view).setTypeface(null, Typeface.BOLD); 
          break; 
         } 
        } 
       } 
       if(day == Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH)) { 
        Log.i("ADAM", "getView: " + day); 


       } 
      } 
      ((TextView) view).setText(String.valueOf(date.getDate())); 
      return view; 
     } 
    } 

    public void setEventListener(EventListener eventListener) { 
     this.eventListener = eventListener; 
    } 

    public interface EventListener { 
     void onDayLongPress(Date date); 
    } 

    private void showPreferencesPopup() { 
     LayoutInflater mInflater = (LayoutInflater) CalendarActivity.this 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View mPopUpLayout = mInflater.inflate(R.layout.settings_btn_click, 
       (ViewGroup) findViewById(R.id.eReceiptsSettingsPopUp)); 
     mPopUp = new PopupWindow(mPopUpLayout, FrameLayout.LayoutParams.MATCH_PARENT, 
       FrameLayout.LayoutParams.WRAP_CONTENT, true); 
     settingsBtn.setVisibility(View.GONE); 
     settingsBtnChecked.setVisibility(View.VISIBLE); 
     mPopUp.setOutsideTouchable(true); 
     mPopUp.showAsDropDown(settingsBtn, 0, 0); 

     mPopUp.setOnDismissListener(new PopupWindow.OnDismissListener() { 
      @Override 
      public void onDismiss() { 
       mPopUp.dismiss(); 
       settingsBtn.setVisibility(View.VISIBLE); 
       settingsBtnChecked.setVisibility(View.GONE); 
      } 
     }); 
    } 
} 

回答

0

我只是使用内置日历小部件而不使用完全自定义日历。我无法让自定义日历工作,我想如何。

使用内置的日历小部件,我只能够允许用户只看到当前月份,同时还可以停止日历在用户设备当前日期的6个月以后。