1

请帮助我,我按照本教程http://www.androidhub4you.com/2012/10/custom-calendar-in-android.html 显示水平日历并仅显示当前日期这家伙帮助我修改此代码如何在日历中获取当前工作日可以正常工作,下面是他的源代码,但问题是我正在添加两个新按钮 btnpreviousweek,btnnextweek;我想在点击按钮上显示下周和前一周的日期我该怎么做?帮帮我

                         public class MyCalendarActivity extends Activity implements  
 OnClickListener {
 private static final String tag = "MyCalendarActivity";

 private TextView currentMonth;
//  private Button selectedDayMonthYearButton;
private ImageView prevMonth;
private ImageView nextMonth;
//private HorizontalListView  calendarView;

 Button btnpreviousweek,btnnextweek;


 private GridView calendarView;
 private GridCellAdapter adapter;
 private Calendar _calendar;
 @SuppressLint("NewApi")
 private int month, year;
 private int actualYear, actualMonth, actualDay;
 @SuppressWarnings("unused")
 @SuppressLint({ "NewApi", "NewApi", "NewApi", "NewApi" })
 private final DateFormat dateFormatter = new DateFormat();
 private static final String dateTemplate = "MMMM yyyy";

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
    setContentView(R.layout.my_calendar_view);






 _calendar = Calendar.getInstance(Locale.getDefault());
 month = _calendar.get(Calendar.MONTH) + 1;
 year = _calendar.get(Calendar.YEAR);
 actualYear = year;
 actualMonth = month;
 actualDay = _calendar.get(Calendar.DAY_OF_MONTH);





 Log.d(tag, "Calendar Instance:= " + "Month: " + month + " " + "Year: "
    + year);



 btnpreviousweek = (Button) this.findViewById(R.id.btnpreviousweek);
 btnnextweek = (Button) this.findViewById(R.id.btnnextweek);



  btnpreviousweek.setOnClickListener(new OnClickListener() {

 public void onClick(View arg0) {
    // TODO Auto-generated method stub
 //////////////////////////        what i write here           
   /////////////////////////
 }
     });



   btnnextweek.setOnClickListener(new OnClickListener() {

    public void onClick(View arg0) {
    // TODO Auto-generated method stub
 //////////////////////////        what i write here           
 /////////////////////////
 }
    });





  prevMonth = (ImageView) this.findViewById(R.id.prevMonth);
  prevMonth.setOnClickListener(this);

     currentMonth = (TextView) this.findViewById(R.id.currentMonth);
   currentMonth.setText(DateFormat.format(dateTemplate,
    _calendar.getTime()));

   nextMonth = (ImageView) this.findViewById(R.id.nextMonth);
   nextMonth.setOnClickListener(this);
  calendarView = (GridView) this.findViewById(R.id.calendar);

     adapter = new GridCellAdapter(getApplicationContext(),
    R.id.calendar_day_gridcell, month, year);
  adapter.notifyDataSetChanged();
   calendarView.setAdapter(adapter);
  }

 /**
 * 
 * @param month
 * @param year
 */
  private void setGridCellAdapterToDate(int month, int year) {
  adapter = new GridCellAdapter(getApplicationContext(),
    R.id.calendar_day_gridcell, month, year);
  _calendar.set(year, month - 1, _calendar.get(Calendar.DAY_OF_WEEK));
  currentMonth.setText(DateFormat.format(dateTemplate,
    _calendar.getTime()));
  adapter.notifyDataSetChanged();
  calendarView.setAdapter(adapter);
   }

  @Override
  public void onClick(View v) {
 if (v == prevMonth) {
 if (month <= 1) {
    month = 12;
     year--;
   } else {
    month--;
 }
   Log.d(tag, "Setting Prev Month in GridCellAdapter: " + "Month: "
        + month + " Year: " + year);
   setGridCellAdapterToDate(month, year);
 }
  if (v == nextMonth) {
 if (month > 11) {
    month = 1;
    year++;
 } else {
    month++;
 }
 Log.d(tag, "Setting Next Month in GridCellAdapter: " + "Month: "
        + month + " Year: " + year);
setGridCellAdapterToDate(month, year);
   }

}

  @Override
 public void onDestroy() {
 Log.d(tag, "Destroying View ...");
 super.onDestroy();
  }

// Inner Class
 public class GridCellAdapter extends BaseAdapter implements OnClickListener {
 private static final String tag = "GridCellAdapter";
 private final Context _context;

private final List<String> list;
private static final int DAY_OFFSET = 1;
private final String[] weekdays = new String[] { "Sun", "Mon", "Tue",
    "Wed", "Thu", "Fri", "Sat" };
private final String[] months = { "January", "February", "March",
    "April", "May", "June", "July", "August", "September",
    "October", "November", "December" };
 private final int[] daysOfMonth = { 31, 28, 31, 30, 31, 30, 31, 31, 30,
       31, 30, 31 };
 private int daysInMonth;
private int currentDayOfMonth;
private int currentWeekDay;
 private Button gridcell;
private TextView num_events_per_day;
private final HashMap<String, Integer> eventsPerMonthMap;
 private final SimpleDateFormat dateFormatter = new SimpleDateFormat(
    "dd-MMM-yyyy");

// Days in Current Month
  public GridCellAdapter(Context context, int textViewResourceId,
    int month, int year) {
super();
this._context = context;
this.list = new ArrayList<String>();
Log.d(tag, "==> Passed in Date FOR Month: " + month + " "
        + "Year: " + year);
Calendar calendar = Calendar.getInstance();
setCurrentDayOfMonth(calendar.get(Calendar.DAY_OF_MONTH));

setCurrentWeekDay(calendar.get(Calendar.DAY_OF_WEEK));

Log.d(tag, "New Calendar:= " + calendar.getTime().toString());
Log.d(tag, "CurrentDayOfWeek :" + getCurrentWeekDay());
Log.d(tag, "CurrentDayOfMonth :" + getCurrentDayOfMonth());

// Print Month
printMonth(month, year);

// Find Number of Events
 eventsPerMonthMap = findNumberOfEventsPerMonth(year, month);
 }

 private String getMonthAsString(int i) {
return months[i];
 }

 private String getWeekDayAsString(int i) {
  return weekdays[i];
}

private int getNumberOfDaysOfMonth(int i) {
return daysOfMonth[i];
}

 public String getItem(int position) {
return list.get(position);
}

@Override
public int getCount() {
return list.size();
 }

 /**
 * Prints Month
 * 
 * @param mm
 * @param yy
 */









   private void printMonth(int mm, int yy)
 {
 Log.d(tag, "==> printMonth: mm: " + mm + " " + "yy: " + yy);
 int trailingSpaces = 0;
 int daysInPrevMonth = 0;

 int currentMonth = mm - 1;
 String currentMonthName = getMonthAsString(currentMonth);
 daysInMonth = getNumberOfDaysOfMonth(currentMonth);

 Log.d(tag, "Current Month: " + " " + currentMonthName + " having " +  
 daysInMonth + " days.");

 GregorianCalendar cal = new GregorianCalendar(yy, currentMonth, 
 getCurrentDayOfMonth());
 Log.d(tag, "Gregorian Calendar:= " + cal.getTime().toString());

 int currentWeekDay = cal.get(Calendar.DAY_OF_WEEK) - 1;
 trailingSpaces = currentWeekDay;

 Log.d(tag, "Week Day:" + currentWeekDay + " is " + 
 getWeekDayAsString(currentWeekDay));
 Log.d(tag, "No. Trailing space to Add: " + trailingSpaces);
 Log.d(tag, "No. of Days in Previous Month: " + daysInPrevMonth);

 if (cal.isLeapYear(cal.get(Calendar.YEAR)))
    if (mm == 2) ++daysInMonth;
    else if (mm == 3)
        ++daysInPrevMonth;

 // move at the begging of the week
 int i = getCurrentDayOfMonth();
 int j = currentWeekDay;
 while (i > 1 && j > 0)
 {
    i--;
    j--;
 }
 // print the week, starting at Sunday
  for (j = 0; i <= daysInMonth && j < 7; i++, j++)
{
    Log.d(currentMonthName, String.valueOf(i) + " " + 
 getMonthAsString(currentMonth) + " " + yy);
    // If it is the current date, printing in BLUE (Orange)
    if (i == actualDay && mm == actualMonth && yy == actualYear)
    {
        list.add(String.valueOf(i) + "-BLUE" + "-" + 
  getMonthAsString(currentMonth) + "-" + yy);
    }
    else
    {
        list.add(String.valueOf(i) + "-WHITE" + "-" + 
 getMonthAsString(currentMonth) + "-" + yy);
    }
}
}

 /**
 * NOTE: YOU NEED TO IMPLEMENT THIS PART Given the YEAR, MONTH, retrieve
 * ALL entries from a SQLite database for that month. Iterate over the
* List of All entries, and get the dateCreated, which is converted into
 * day.
* 
* @param year
* @param month
* @return
*/
  private HashMap<String, Integer> findNumberOfEventsPerMonth(int year,
    int month) {
 HashMap<String, Integer> map = new HashMap<String, Integer>();

return map;
}

 @Override
 public long getItemId(int position) {
 return position;
 }

 @Override
  public View getView(int position, View convertView, ViewGroup parent) {
 View row = convertView;
 if (row == null) {
    LayoutInflater inflater = (LayoutInflater) _context

 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    row = inflater.inflate(R.layout.screen_gridcell, parent, 
 false);
 }

 // Get a reference to the Day gridcell
gridcell = (Button) row.findViewById(R.id.calendar_day_gridcell);
gridcell.setOnClickListener(this);

// ACCOUNT FOR SPACING

Log.d(tag, "Current Day: " + getCurrentDayOfMonth());
String[] day_color = list.get(position).split("-");
String theday = day_color[0];
String themonth = day_color[2];
String theyear = day_color[3];
if ((!eventsPerMonthMap.isEmpty()) && (eventsPerMonthMap != 
null))  {
    if (eventsPerMonthMap.containsKey(theday)) {
        num_events_per_day = (TextView) row

 .findViewById(R.id.num_events_per_day);
        Integer numEvents = (Integer) 
 eventsPerMonthMap.get(theday);
        num_events_per_day.setText(numEvents.toString());
    }
 }

 // Set the Day GridCell
 gridcell.setText(theday);
 gridcell.setTag(theday + "-" + themonth + "-" + theyear);
 Log.d(tag, "Setting GridCell " + theday + "-" + themonth + "-"
        + theyear);

if (day_color[1].equals("GREY")) {
    gridcell.setTextColor(getResources()
            .getColor(R.color.lightgray));
}
if (day_color[1].equals("WHITE")) {
    gridcell.setTextColor(getResources().getColor(
            R.color.lightgray02));
}
if (day_color[1].equals("BLUE")) {
     gridcell.setText("(" + theday + ")");

gridcell.setTextColor(getResources().getColor(R.color.orrange));
}
 return row;
 }

@Override
 public void onClick(View view) {
String date_month_year = (String) view.getTag();
 //  selectedDayMonthYearButton.setText("Selected: " + date_month_year);
Log.e("Selected date", date_month_year);
try {
    Date parsedDate = dateFormatter.parse(date_month_year);
    Log.d(tag, "Parsed Date: " + parsedDate.toString());

} catch (ParseException e) {
    e.printStackTrace();
}
}

 public int getCurrentDayOfMonth() {
return currentDayOfMonth;
 }

 private void setCurrentDayOfMonth(int currentDayOfMonth) {
this.currentDayOfMonth = currentDayOfMonth;
 }

 public void setCurrentWeekDay(int currentWeekDay) {
this.currentWeekDay = currentWeekDay;
 }

 public int getCurrentWeekDay() {
return currentWeekDay;
}
}
}
4

1 回答 1

1

该实施适用于月视图,您需要创建自定义周视图:

这就是我创建的方式:

Calendar calendarGlobal;
prevMonth.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                calendarGlobal.add(Calendar.WEEK_OF_YEAR, -1);
                calculateWeek()
            }
        });


        nextMonth.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
        // TODO Auto-generated method stub
        calendarGlobal = Calendar.getInstance();
        calculateWeek();
            }
        });


private void calculateWeek() {
        // TODO Auto-generated method stub
        days.clear();
        // Set the calendar to monday of the current week
        // calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        DateFormat df = new SimpleDateFormat("dd");
        calendarGlobal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        for (int i = 0; i < 7; i++) {
            days.add(df.format(calendarGlobal.getTime()));
            calendarGlobal.add(Calendar.DATE, 1);
        }


    }

一旦你将值设置为 textview 作为 textview.settext(days.get(0)) 星期一等

于 2013-07-25T11:40:05.257 回答