2013-10-27 2 views
0

맞춤 캘린더가 있습니다. 월별보기의 경우 그리드보기를 사용합니다. 달력의 각 요일에는 매일의 수와 각 날의 이벤트 수가 표시됩니다. 그 목표에 도달하려면 getView에서 매일의 이벤트를 요청하십시오. 성능 향상을 위해보기 내에서 소유자를 사용합니다. 하지만 불행히도 내 앱이 자주 중단되고 한 달에서 다음 달로 전환하면 속도가 매우 느려집니다. 사용자가 다음 달 버튼을 클릭하면 setGridCellAdapterToDate가 호출됩니다.gridview 성능 문제

public void setGridCellAdapterToDate(int month, int year) 
{ 
    adapter = new GridCellAdapter(getActivity().getApplicationContext(), calendarView,R.id.calendar_day_gridcell, month, year); 
    _calendar.set(year, month - 1, _calendar.get(Calendar.DAY_OF_MONTH)); 
    currentMonth.setText(dateFormatter.format(dateTemplate, _calendar.getTime())); 
    adapter.notifyDataSetChanged(); 
    calendarView.setAdapter(adapter); 
    calendarView.setSelected(true); 

} 

내 캘린더의 성능을 향상시키는 방법이 있습니까?

public class GridCellAdapter extends BaseAdapter implements OnClickListener, OnLongClickListener 
{ 
    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 final int month, year; 
    private int daysInMonth, prevMonthDays; 
    private int currentDayOfMonth; 
    private int currentWeekDay; 
    private Button gridcell; 
    private TextView num_events_per_day; 
    private final HashMap eventsPerMonthMap; 
    SimpleDateFormat("dd-MMM-yyyy"); 
    public GridCellAdapter(Context context, GridView gv, int textViewResourceId, int month, int year) 
     { 
      super(); 
      this._context = context; 
      this.list = new ArrayList<String>(); 
      this.month = month; 
      this.year = year; 
            this.mGv = gv; 
      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); 
     } 

    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 leadSpaces = 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()); 
      Calendar caltemp = Calendar.getInstance(); 
      Integer intMonat = caltemp.get(Calendar.MONTH); 
      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; 
      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); 
       } 

      // Current Month Days 
      for (int i = 1; i <= daysInMonth; i++) 
       { 
        Log.d(currentMonthName, String.valueOf(i) + " " + getMonthAsString(currentMonth) + " " + yy); 
        if (i == getCurrentDayOfMonth() && mm == intMonat+1) 
         { 
          list.add(String.valueOf(i) + "-BLUE" + "-" + getMonthAsString(currentMonth) + "-" + yy); 
         } 
        else 
         { 
          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 findNumberOfEventsPerMonth(int year, int month) 
     { 
      HashMap map = new HashMap<String, Integer>(); 
      // DateFormat dateFormatter2 = new DateFormat(); 
      //      
      // String day = dateFormatter2.format("dd", dateCreated).toString(); 
      // 
      // if (map.containsKey(day)) 
      // { 
      // Integer val = (Integer) map.get(day) + 1; 
      // map.put(day, val); 
      // } 
      // else 
      // { 
      // map.put(day, 1); 
      // } 
      return map; 
     } 



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


    public View getView(int position, View convertView, ViewGroup parent) 
     { 
     ViewHolder holder; 
     Integer intRowNumber = 5; 
      View row = convertView; 
      if (row == null) 
       { 
        LayoutInflater inflater = (LayoutInflater) _context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        row = inflater.inflate(R.layout.calendar_day_gridcell, parent, false); 
        //convertView = inflater.inflate(R.layout.calendar_day_gridcell,parent,false); 
        holder = new ViewHolder(); 
        holder.text = (TextView)row.findViewById(R.id.num_events_per_day); 
        holder.gridcell= (Button)row.findViewById(R.id.calendar_day_gridcell); 
        //holder.EventsofMonth = openCalendar.getEventsOfMonth(getActivity(), caltemp.getTimeInMillis(),strCalendarId); 
        row.setTag(holder); 
       } else { 
        holder = (ViewHolder)row.getTag(); 
       } 
      int intHeight = mGv.getHeight(); 
      intHeight = intHeight/intRowNumber; 
      AbsListView.LayoutParams param = new AbsListView.LayoutParams(
        android.view.ViewGroup.LayoutParams.FILL_PARENT, 
        mGv.getHeight()/intRowNumber); 

      //row.setLayoutParams(param); 
      row.setLayoutParams(param); 
      // Get a reference to the Day gridcell 
      //gridcell = (Button) row.findViewById(R.id.calendar_day_gridcell); 
      //gridcell.setOnClickListener(new MyOnClickListener(position)); 
      holder.gridcell.setOnClickListener(this); 
      holder.gridcell.setOnLongClickListener(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]; 
      String selection = "((" + CalendarContract.Events.DTSTART 
        + " >= ?) AND (" + CalendarContract.Events.DTEND + " <= ?) AND (" + CalendarContract.Events.DELETED + " = ?) AND (" + CalendarContract.Events.CALENDAR_ID + " = ?))"; 

      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 


      holder.gridcell.setText(theday); 

      holder.gridcell.setTag(theday + "-" + themonth + "-" + theyear); 
      Log.d(tag, "Setting GridCell " + theday + "-" + themonth + "-" + theyear); 

      if (day_color[1].equals("GREY")) 
       { 
        holder.gridcell.setTextColor(Color.LTGRAY); 
       } 
      if (day_color[1].equals("WHITE")) 
       { 
        holder.gridcell.setTextColor(Color.WHITE); 
       } 
      if (day_color[1].equals("BLUE")) 
       { 
        //gridcell.setTextColor(getResources().getColor(R.color.static_text_color)); 


       holder.gridcell.setTextColor(Color.BLUE); 
       DisplayMetrics metrics; 
       metrics = getActivity().getApplicationContext().getResources().getDisplayMetrics(); 
       float Textsize = 0; 
       Textsize = holder.gridcell.getTextSize()/metrics.density; 
       holder.gridcell.setTextSize(Textsize+4);          

       } 

       //ermittle die Anzahl der Events an diesem Tag und schreibe sie in num_events_per_day 
       Integer intAnzEventsonSelectedDay = 0; 
       //num_events_per_day = (TextView) row.findViewById(R.id.num_events_per_day); 
       String strCurrentDatum = theday + "-" + month + "-" + year; 
       SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); 

       Date dateObj = null; 
       try { 
        dateObj = sdf.parse(strCurrentDatum); 
       } catch (ParseException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

       String temp = dateObj.toString(); 

       caltemp.setTime(dateObj); 
       Cursor curCalendar = openCalendar.getEventsOfDay(getActivity(), caltemp.getTimeInMillis(),strCalendarId); 
       curCalendar.moveToFirst(); 
       intAnzEventsonSelectedDay = curCalendar.getCount(); 
       if (intAnzEventsonSelectedDay > 4){ 
        holder.text.setTextColor(Color.RED); 
       } else{ 
        // 
       } 

       holder.text.setText(intAnzEventsonSelectedDay.toString()); 
      return row; 
     } 

답변

0

성능과 관련된 문제의 일부는 실제로 한 달에 도달하기까지 얼마나 많은 작업을하고 있는지 생각합니다. 가장 좋은 것은 Calendar부터 MonthDisplayHelper으로 전환하는 것입니다. 기본적으로 한 달 배치하는 데 도움이 안드로이드 클래스 내장. 그것도 훌륭한 형식으로, 매주 int 배열로 나눕니다. 그래도 Calendar은 현재 날짜 정보를 유지할 수있는 좋은 방법입니다. 더 중요한 것은 하루 동안 모든 이벤트를로드하는 대신 월을 먼저로드 한 다음 AsyncTask을 사용하여 UI 스레드를 종료 한 후 개별 이벤트를로드하는 것입니다. 한 달에 몇 차례의 이벤트가 있다고 상상해보십시오. 좋은 예가 Google의 기본 캘린더입니다. 충분한 이벤트가있는 경우 월보기가 표시된 후에로드가 시작됩니다. 유용성의 관점에서 볼 때 훌륭한 기능입니다.

+0

안녕하세요. 감사합니다. 이게 정말 도움이됩니다. 모범이 있습니까? – roland