android - 如何在gridview(日历)上获取上个月的天数

标签 android gridview calendar

我需要有关如何着手让上个月的日子在此日历上可见(变灰)的帮助。

我在这里看到当前月份的 View ..但是正如您所看到的,前几个月的日子是不可见的。我知道为什么..但是如何去做呢?目前的错误也很少。请帮忙。发布自定义适配器类的代码:

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

这是关于我如何使用此适配器的 Activity 代码:

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

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

日历 View 截图: Grid

直截了当,我只想用上个月的最后一周的天数填写每月 1 号之前的空白框

最佳答案

声明另一个日历

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;
}

关于android - 如何在gridview(日历)上获取上个月的天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14440957/

相关文章:

android - 如何在 Android 中使图像成为 Grid View 的背景?

java - 将日历设置为特定日期?

android - 在android中同时触摸一次日历选择多个日期

java - 使用 ProGuard 导出 Android 应用程序会出现 ParseException 错误

android - Android 应用程序中的验证码

android - 如何将 ChrisBanes 的 ActionBar-PullToRefresh 库与具有 GridView 的 fragment 一起使用

ASP.NET - 如何将 GridView Delete 包装在 try catch 或停止行删除中

java - 更改时区而不更改Java中的时间

android - 如何编写 Firebase Android 仪器测试?

android - 使用深度/通用链接时,iOS 上是否存在 "App Picker"?