2013-03-11 13 views
6

Mam bazę danych dat, w której mam więcej niż jedną datę, więc chcę podkreślić tło wszystkich dat, które dostałem z bazy danych i wypróbowałem logika, ale nie udało się tutaj umieścić mój kod idzie w nieskończoną pętlę.i chcesz uzyskać wynik podobny do tego przypuszczam, że mam daty takie jak w bazie danych 5/3/2013 i 9/3/2013, to dwa tła powinny być tłem wyróżnij w widoku kalendarza. Kiedyś ten link http://www.androidhub4you.com/2012/10/custom-calendar-in-android.html tutaj jest mój kod:Jak podświetlić daty kalendarza, które daty pochodzą z bazy danych

tutaj w printmonth() funkcja zrobiłem zmiany

public class CalendarActivity extends Activity implements OnClickListener { 
private static final String tag = "CalendarActivity"; 
private TextView currentMonth; 
private Button selectedDayMonthYearButton; 
private ImageView prevMonth; 
private ImageView nextMonth; 
private GridView calendarView; 
private GridCellAdapter adapter; 
private Calendar _calendar; 
@SuppressLint("NewApi") 
private int month, year; 

@SuppressLint({ "NewApi", "NewApi", "NewApi", "NewApi" }) 
private final DateFormat dateFormatter = new DateFormat(); 
private static final String dateTemplate = "MMMM yyyy"; 
int i; 
String valuofday; 
int stryear; 
DB_Database db; 
String strmonthvalueofdatabase; 
String[] strdate; 
String value; 
ArrayList<String> arraylist = new ArrayList<String>(); 

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

    _calendar = Calendar.getInstance(Locale.getDefault()); 
    month = _calendar.get(Calendar.MONTH) + 1; 
    year = _calendar.get(Calendar.YEAR); 
    // Log.d(tag, "Calendar Instance:= " + "Month: " + month + " " + 
    // "Year: " 
    // + year); 

    selectedDayMonthYearButton = (Button) this 
      .findViewById(R.id.selectedDayMonthYear); 
    selectedDayMonthYearButton.setText("Selected: "); 

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

    // Initialised 
    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_MONTH)); 
    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)); 
     stryear = calendar.get(Calendar.YEAR); 
     // Log.d(tag, "New Calendar:= " + calendar.getTime().toString()); 
     // Log.d(tag, "CurrentDayOfWeek :" + getCurrentWeekDay()); 
     // Log.d(tag, "CurrentDayOfMonth :" + getCurrentDayOfMonth()); 
     printMonth(month, year); 

     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); 
     // The number of days to leave blank at 
     // the start of this month. 

     int trailingSpaces = 0; 
     int daysInPrevMonth = 0; 
     int prevMonth = 0; 
     int prevYear = 0; 
     int nextMonth = 0; 
     int nextYear = 0; 

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

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

     // Gregorian Calendar : MINUS 1, set to FIRST OF MONTH 
     GregorianCalendar cal = new GregorianCalendar(yy, currentMonth, 1); 
     // Log.d(tag, "Gregorian Calendar:= " + cal.getTime().toString()); 

     if (currentMonth == 11) { 
      prevMonth = currentMonth - 1; 
      daysInPrevMonth = getNumberOfDaysOfMonth(prevMonth); 
      nextMonth = 0; 
      prevYear = yy; 
      nextYear = yy + 1; 
      // Log.d(tag, "*->PrevYear: " + prevYear + " PrevMonth:" 
      // + prevMonth + " NextMonth: " + nextMonth 
      // + " NextYear: " + nextYear); 
     } else if (currentMonth == 0) { 
      prevMonth = 11; 
      prevYear = yy - 1; 
      nextYear = yy; 
      daysInPrevMonth = getNumberOfDaysOfMonth(prevMonth); 
      nextMonth = 1; 
      // Log.d(tag, "**--> PrevYear: " + prevYear + " PrevMonth:" 
      // + prevMonth + " NextMonth: " + nextMonth 
      // + " NextYear: " + nextYear); 
     } else { 
      prevMonth = currentMonth - 1; 
      nextMonth = currentMonth + 1; 
      nextYear = yy; 
      prevYear = yy; 
      daysInPrevMonth = getNumberOfDaysOfMonth(prevMonth); 
      // Log.d(tag, "***---> PrevYear: " + prevYear + " PrevMonth:" 
      // + prevMonth + " NextMonth: " + nextMonth 
      // + " NextYear: " + nextYear); 
     } 

     // Compute how much to leave before before the first day of the 
     // month. 
     // getDay() returns 0 for Sunday. 
     int currentWeekDay = cal.get(Calendar.DAY_OF_WEEK) - 1; 
     String strcurrentweekdat = Integer.toString(currentWeekDay); 
     Log.v("currentweekdays", strcurrentweekdat); 
     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)) && mm == 1) { 
      ++daysInMonth; 
     } 

     // Trailing Month days 
     for (int i = 0; i < trailingSpaces; i++) { 
      // Log.d(tag, 
      // "PREV MONTH:= " 
      // + prevMonth 
      // + " => " 
      // + getMonthAsString(prevMonth) 
      // + " " 
      // + String.valueOf((daysInPrevMonth 
      // - trailingSpaces + DAY_OFFSET) 
      // + i)); 
      list.add(String 
        .valueOf((daysInPrevMonth - trailingSpaces + DAY_OFFSET) 
          + i) 
        + "-GREY" 
        + "-" 
        + getMonthAsString(prevMonth) 
        + "-" 
        + prevYear); 

     } 
     String strcurrentmonth = getMonthAsString(currentMonth); 
     Log.v("strcurrentmonth", strcurrentmonth); 

     String strcurrentyear = Integer.toString(stryear); 
     Log.v("strcurrentmonth", strcurrentyear); 

     // for database file 

     SQLiteDatabase sqlitedatabase = db.getReadableDatabase(); 
     Cursor cursor = sqlitedatabase.query(DB_Database.REPORT, null, 
       null, null, null, null, null); 

     int hilihgtedDate = 0; 

     // get array of hilighted dates... 
     ArrayList<String> arraylist = new ArrayList<String>(); 

     // get array of hilighted dates... 
     cursor.moveToFirst(); 
     do { 
      arraylist.add(cursor.getString(cursor 
        .getColumnIndex(DB_Database.REPORT_MEDICINE_DATE))); 
      hilihgtedDate++; 
     } while (cursor.moveToNext() == true); 

     // now that you have the dates to be hilighted, create the month 
     // view as you were doing previously, 
     // Trailing Month days 
     for (int i = 0; i < trailingSpaces; i++) { 
      Log.d(tag, 
        "PREV MONTH:= " 
          + prevMonth 
          + " => " 
          + getMonthAsString(prevMonth) 
          + " " 
          + String.valueOf((daysInPrevMonth 
            - trailingSpaces + DAY_OFFSET) 
            + i)); 
      list.add(String 
        .valueOf((daysInPrevMonth - trailingSpaces + DAY_OFFSET) 
          + i) 
        + "-GREY" 
        + "-" 
        + getMonthAsString(prevMonth) 
        + "-" 
        + prevYear); 
     } 

     int k = 0; 
     // Current Month Days 
     for (i = 1; i <= daysInMonth; i++) { 

      // prevents un-ncesessart splitting steps... 
      if (k <= hilihgtedDate) { 
       /* 
       * checks if current date is equal to 1st hilighted date... 
       * if yes, then hilight the date and get the next hilihgted 
       * date, if no, then just add that date 
       */ 
       Log.v("string arraylist", arraylist.get(i)); 
       String[] splitstrdate = arraylist.get(k).split("/"); 

       String splitstrday = splitstrdate[0]; 
       Log.v("splitstrday", splitstrday); 
       int intsplitstrday = Integer.parseInt(splitstrday); 

       String splitstrmonth = splitstrdate[1]; 
       int intmonth = Integer.parseInt(splitstrmonth); 

       int newintvalue = intmonth - 1; 
       String splitstryear = splitstrdate[2]; 
       int intsplitstryear = Integer.parseInt(splitstryear); 
       for (i = 0; i < newintvalue; i++) { 
        String strone = Integer.toString(newintvalue); 
        strone = months[i]; 
        Log.v("strone", strone); 
       } 
       Log.v("month value", months[i].toString()); 
       String strentermonth = months[i].toString(); 

       if (i == intsplitstrday && strcurrentmonth == strentermonth 
         && year == intsplitstryear) { 
        list.add(String.valueOf(i) + "-BLUE" + "-" 
          + getMonthAsString(currentMonth) + "-" + yy); 
        k++; 
       } else { 
        list.add(String.valueOf(i) + "-WHITE" + "-" 
          + getMonthAsString(currentMonth) + "-" + yy); 
       } 
      } else { 
       /* 
       * There are no more hilighted dates, so no need to split 
       * the date and do the checking, simply write the dates as 
       * they are... 
       */ 
       list.add(String.valueOf(i) + "-WHITE" + "-" 
         + getMonthAsString(currentMonth) + "-" + yy); 
      } 
     } 

     // Leading Month days 
     for (int i = 0; i < list.size() % 7; i++) { 
      Log.d(tag, "NEXT MONTH:= " + getMonthAsString(nextMonth)); 
      list.add(String.valueOf(i + 1) + "-GREY" + "-" 
        + getMonthAsString(nextMonth) + "-" + nextYear); 
     } 

    } 

    /** 
    * 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("-"); 
     Log.v("string value", day_color[1]); 
     // Log.v("day",valuofday); 

     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); 
     Log.v("str daycolor", day_color[1]); 

     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.setBackgroundColor(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; 
    } 

} 

}

Odpowiedz

4

w twojej pętli for, trzeba ponownie rozpocząć wartość zmiennej i. Powinien wyglądać mniej więcej tak:

int j = 0; 
for (; j < newintvalue; j++) { 
    String strone = Integer.toString(newintvalue); 
    strone = months[j]; 
    Log.v("strone", strone); 
} 
Log.v("month value", months[j].toString()); 
String strentermonth = months[j].toString(); 
Powiązane problemy