2013-01-21 96 views
1

我需要帮助了解如何在此日历上显示(变灰)日历。如何在gridview上获取前一个月的日期(日历)

我在这里得到目前的月视图..但正如你可以看到前几个月的日子是不可见的。我知道为什么..但如何去做呢?还有一些bug有没有在目前这个作为一个well.please help.Posting代码自定义适配器类:

CalendarAdapter.java

import java.util.ArrayList; 
    import java.util.Calendar; 
    import android.content.Context; 
    import android.graphics.Color; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.BaseAdapter; 
    import android.widget.ImageView; 
    import android.widget.TextView; 

    public class CalendarAdapter extends BaseAdapter { 
static final int FIRST_DAY_OF_WEEK =0; // Sunday = 0, Monday = 1 


private Context mContext; 

private java.util.Calendar month; 
private Calendar selectedDate; 
private ArrayList<String> items; 

public CalendarAdapter(Context c, Calendar monthCalendar) { 
    month = monthCalendar; 
    selectedDate = (Calendar)monthCalendar.clone(); 
    mContext = c; 
    month.set(Calendar.DAY_OF_MONTH, 1); 
    this.items = new ArrayList<String>(); 
    refreshDays(); 
} 

public void setItems(ArrayList<String> items) { 
    for(int i = 0;i != items.size();i++){ 
     if(items.get(i).length()==1) { 
     items.set(i, "0" + items.get(i)); 
     } 
    } 
    this.items = items; 
} 


public int getCount() { 
    return days.length; 
} 

public Object getItem(int position) { 
    return null; 
} 

public long getItemId(int position) { 
    return 0; 
} 

// create a new view for each item referenced by the Adapter 
public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    TextView dayView; 
    if (convertView == null) { // if it's not recycled, initialize some attributes 
     LayoutInflater vi = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.calendar_item, null); 

    } 
    dayView = (TextView)v.findViewById(R.id.date); 

    // disable empty days from the beginning 
    if(days[position].equals("")) { 
     dayView.setClickable(false); 
     dayView.setFocusable(false); 
     //need to show previous months date 


    } 
    else { 
     // mark current day as focused 
     if(month.get(Calendar.YEAR)== selectedDate.get(Calendar.YEAR) && month.get(Calendar.MONTH)== selectedDate.get(Calendar.MONTH) && days[position].equals(""+selectedDate.get(Calendar.DAY_OF_MONTH))) { 
      v.setBackgroundResource(R.drawable.date_area); 
      dayView.setTextColor(Color.parseColor("#FFFFFF")); 
     } 
     else { 
      v.setBackgroundResource(R.drawable.current_date_area); 
     } 
    } 
    dayView.setText(days[position]); 

    // create date string for comparison 
    String date = days[position]; 

    if(date.length()==1) { 
     date = "0"+date; 
    } 
    String monthStr = ""+(month.get(Calendar.MONTH)+1); 
    if(monthStr.length()==1) { 
     monthStr = "0"+monthStr; 
    } 

    // show icon if date is not empty and it exists in the items array 
    /* ImageView iw = (ImageView)v.findViewById(R.id.date_icon); 
    if(date.length()>0 && items!=null && items.contains(date)) {    
     iw.setVisibility(View.VISIBLE); 
    } 
    else { 
     iw.setVisibility(View.INVISIBLE); 
    }*/ 
    return v; 
} 

public void refreshDays() 
{ 
    // clear items 
    items.clear(); 

    int lastDay = month.getActualMaximum(Calendar.DAY_OF_MONTH); 
    int firstDay = (int)month.get(Calendar.DAY_OF_WEEK); 

    // figure size of the array 
    if(firstDay==1){ 
     days = new String[lastDay+(FIRST_DAY_OF_WEEK*6)]; 
    } 
    else { 
     days = new String[lastDay+firstDay-(FIRST_DAY_OF_WEEK+1)]; 
    } 

    int j=FIRST_DAY_OF_WEEK; 

    // populate empty days before first real day 
    if(firstDay>1) { 
     for(j=0;j<firstDay-FIRST_DAY_OF_WEEK;j++) { 
      days[j] = ""; 
     } 
    } 
    else { 
     for(j=0;j<FIRST_DAY_OF_WEEK*6;j++) { 
      days[j] = ""; 
     } 
     j=FIRST_DAY_OF_WEEK*6+1; // sunday => 1, monday => 7 
    } 

    // populate days 
    int dayNumber = 1; 
    for(int i=j-1;i<days.length;i++) { 
     days[i] = ""+dayNumber; 
     dayNumber++; 
    } 
} 

// references to our items 
public String[] days;} 

,这是怎么了活动代码使用该适配器:

CalendarView.java

/*some code above*/ 
/*this is in the OnCreate block*/ 
adapter = new CalendarAdapter(this, month); 

    GridView gridview = (GridView) findViewById(R.id.gridview); 
    gridview.setAdapter(adapter); 
/*some code below*/ 

和我的继承人日历视图屏幕(网格):

CalendarView截图: Grid http://i45.tinypic.com/30wl3fc.png

是直的,并给点意见,我要的是,本月1日之前空白框为必填项与上月的最后一周的日子

回答

2

声明另一个日历

private java.util.Calendar month, prevMonth; 

克隆添加到日历在构造

prevMonth = (Calendar) month.clone(); 
prevMonth.roll(Calendar.MONTH, false); 

然后用这个one.This从上个月下个月当前的第一个和最后一周充满了时代的空格替换refreshDays Insha真主。

public void refreshDays() { 
    // clear items 
    items.clear(); 

    int lastDay = month.getActualMaximum(Calendar.DAY_OF_MONTH); 
    int firstDay = (int) month.get(Calendar.DAY_OF_WEEK); 
    int maxweek = month.getActualMaximum(Calendar.WEEK_OF_MONTH); 
    Log.d("CalendarAdapter", String.valueOf(maxweek)); 
    // figure size of the array 
    /* 
    * if (firstDay == 1) { days = new String[lastDay + (FIRST_DAY_OF_WEEK * 
    * 6)]; } 
    * 
    * else { days = new String[lastDay + firstDay - (FIRST_DAY_OF_WEEK + 
    * 1)]; } 
    */ 
    days = new String[maxweek * 7]; 

    int j = FIRST_DAY_OF_WEEK; 

    // populate empty days before first real day 
    if (firstDay > 1) { 

     // can be made a bit faster if implemented without this following 
     // for loop for roll 
     for (j = 0; j < firstDay - FIRST_DAY_OF_WEEK; j++) { 
      prevMonth.roll(Calendar.DAY_OF_MONTH, false); 
      Log.d("CalendarAdapter", 
        "roll block: " + prevMonth.get(Calendar.DAY_OF_MONTH)); 
     } 

     for (j = 0; j < firstDay - FIRST_DAY_OF_WEEK; j++) { 

      // days[j] = ""; 
      prevMonth.roll(Calendar.DAY_OF_MONTH, true); 
      int dayPrev = prevMonth.get(Calendar.DAY_OF_MONTH); 
      days[j] = " " + String.valueOf(dayPrev) + " "; 
      Log.d("CalendarAdapter", "calculation:J if firstDay>1 -- " + j 
        + " roll gives:" + dayPrev); 
     } 
    } else { 
     for (j = 0; j < FIRST_DAY_OF_WEEK * 6; j++) { 
      days[j] = ""; 
      Log.d("CalendarAdapter", "calculation:J if firstDay<1 -- " + j); 
     } 
     j = FIRST_DAY_OF_WEEK * 6 + 1; // sunday => 1, monday => 7 
    } 

    // populate days 
    int dayNumber = 1; 
    boolean flag = false; 
    for (int i = j - 1; i < days.length; i++) { 

     days[i] = String.valueOf(dayNumber).trim() + "."; 
     if (flag) 
      days[i] = String.valueOf(dayNumber).trim(); 
     if (dayNumber == lastDay) { 
      dayNumber = 0; 
      flag=true; 
     } 
     dayNumber++; 
    } 
} 

// references to our items 
public String[] days; 

}

相关问题