1

我需要有关如何在此日历上显示前一个月的日子(灰显)的帮助。

我在这里获得了当前月份的视图.. 但正如您所见,前几个月的日子不可见。我知道为什么.. 但是该怎么做呢?目前的这个也有一些错误。请帮助。发布自定义适配器类的代码:

日历适配器.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;}

这是关于我如何使用这个适配器的活动代码:

日历视图.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*/

这是我的日历视图屏幕(网格):

日历视图截图: 网格

直截了当地说,我只想在本月 1 日之前的空白框中填写上个月的最后一周的日子

4

1 回答 1

2

声明另一个日历

private java.util.Calendar month, prevMonth;

在构造函数中向日历添加克隆

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

然后用这个替换 refreshDays。这将分别用上个月和下个月的天数填充空白区域,分别表示当月的第一周和最后一周。

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;
}
于 2013-01-22T10:53:05.403 回答