2013-10-17 40 views
1
  • 我沒有在我的代碼中使用任何列表視圖,我用適配器類來製作自定義日曆。 以前,它工作的很好。但是,因爲我需要實現從數據庫檢索任何特殊日期的背景圖像,我寫了代碼,但現在getView()方法自動調用多次。
  • 如果有人知道如何阻止它,請給我建議任何解決方案...
  • 謝謝。
  • 代碼是:爲什麼getView()方法自動調用多重時間?

    private static final int FIRST_DAY_OF_WEEK = Calendar.MONDAY; 
    private final Calendar calendar; 
    public final CalendarItem today; 
    private final CalendarItem selected; 
    private final LayoutInflater inflater; 
    
    //added 
    public static CalendarItem eventDate; 
    //added 
    private CalendarItem[] days; 
    Context context; 
    private List<Events> eventList; 
    private String dateRetrived; 
    private String dataRetrived; 
    private int d; 
    private int day1; 
    private String dayS; 
    private String intMonth; 
    private String year; 
    private List<Events> eventList1; 
    private String dateRetrived1; 
    private String dataRetrived1; 
    private Date date1; 
    private List<Events> dateListInDb; 
    private String dateOfEvent; 
    
    
    public CalendarAdapter(Context context, Calendar monthCalendar) { 
        calendar = monthCalendar; 
        today = new CalendarItem(monthCalendar); 
        selected = new CalendarItem(monthCalendar); 
        eventDate = new CalendarItem(monthCalendar); 
        calendar.set(Calendar.DAY_OF_MONTH, 1); 
        inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        this.context = context; 
    } 
    
    public int getCount() { 
        return days.length; 
    } 
    
    public Object getItem(int position) { 
        return days[position]; 
    } 
    
    public long getItemId(int position) { 
        final CalendarItem item = days[position]; 
        if (item != null) { 
         return days[position].id; 
        } 
        return -1; 
    } 
    
    @SuppressLint("SimpleDateFormat") 
    @SuppressWarnings("static-access") 
    public View getView(int position, View view, ViewGroup parent) { 
        if (view == null) { 
         view = inflater.inflate(R.layout.calender_item, null); 
    
        } 
         Toast.makeText(context, "view starts ", Toast.LENGTH_SHORT).show(); 
    
         final TextView dayView = (TextView)view.findViewById(R.id.date); 
         final CalendarItem currentItem = days[position]; 
    
    
    
         method(); 
    
    
         Toast.makeText(context, "out ", Toast.LENGTH_SHORT).show(); 
    
    
         //for now any date... event dates will be taken from DB.. 
    
         if (currentItem == null) { 
          dayView.setClickable(false); 
          dayView.setFocusable(false); 
          view.setBackgroundDrawable(null); 
          dayView.setText(null); 
         } else { 
          if(currentItem.equals(today)) { 
           view.setBackgroundResource(R.drawable.today_background); 
          } 
    
          else if (currentItem.equals(selected)) { 
           view.setBackgroundResource(R.drawable.selected_background); 
           // Toast.makeText(context, "tapped",Toast.LENGTH_LONG).show(); 
    
          } else { 
           view.setBackgroundResource(R.drawable.calnormalmdpi1); 
          } 
          dayView.setText(currentItem.text); 
    
        } 
        return view; 
    
    } 
    
    
    
    private void method() { 
        DatabaseManager db = new DatabaseManager(context); 
    
        DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
        dateListInDb = db.getAllDates(); 
        Iterator<Events> iter = dateListInDb.iterator(); 
    
        for (int j = 0 ; j < dateListInDb.size() ; j++) { 
    
    
         Toast.makeText(context, "loop starts " + j, Toast.LENGTH_SHORT).show(); 
    
         Events dateOfEvent = iter.next(); 
    
    
         String dateOfEventSingle = dateOfEvent.getDateOfEvent(); 
         try { 
          date1 = formatter.parse(dateOfEventSingle); 
          dayS = (String) android.text.format.DateFormat.format("dd", date1); 
          intMonth = (String) android.text.format.DateFormat.format("MM", date1); //06 
          year = (String) android.text.format.DateFormat.format("yyyy", date1); 
          eventDate = new CalendarItem(Integer.parseInt(year), Integer.parseInt(intMonth)-1,Integer.parseInt(dayS)); 
    
    
         } catch (ParseException e1) { 
          // TODO Auto-generated catch block 
          e1.printStackTrace(); 
    
         } 
    
    
         Toast.makeText(context, "loop ends " + j, Toast.LENGTH_SHORT).show(); 
    
         //i = false; 
        } 
    
    } 
    
    public final void setSelected(int year, int month, int day) { 
        selected.year = year; 
        selected.month = month; 
        selected.day = day; 
        notifyDataSetChanged(); 
    } 
    
    public final void refreshDays() { 
        final int year = calendar.get(Calendar.YEAR); 
        final int month = calendar.get(Calendar.MONTH); 
        Toast.makeText(context, "Date : " + month, Toast.LENGTH_SHORT).show(); 
    
        final int firstDayOfMonth = calendar.get(Calendar.DAY_OF_WEEK); 
        final int lastDayOfMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); 
        final int blankies; 
        final CalendarItem[] days; 
    
        if (firstDayOfMonth == FIRST_DAY_OF_WEEK) { 
         blankies = 0; 
        } else if (firstDayOfMonth < FIRST_DAY_OF_WEEK) { 
         blankies = Calendar.SATURDAY - (FIRST_DAY_OF_WEEK - 1); 
        } else { 
         blankies = firstDayOfMonth - FIRST_DAY_OF_WEEK; 
        } 
        days = new CalendarItem[lastDayOfMonth + blankies]; 
    
        for (int day = 1, position = blankies; position < days.length; position++) { 
         days[position] = new CalendarItem(year, month, day++);//added dates 
    
    
        } 
    
    
        this.days = days; 
        notifyDataSetChanged(); 
    } 
    
    
    
    
    public static class CalendarItem { 
        public int year; 
        public int month; 
        public int day; 
        public String text; 
        public long id; 
    
        public CalendarItem(Calendar calendar) { 
         this(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)); 
        } 
    
        public CalendarItem(int year, int month, int day) { 
         this.year = year; 
         this.month = month; 
         this.day = day; 
         this.text = String.valueOf(day); 
         this.id = Long.valueOf(year + "" + month + "" + day); 
        } 
    
        @Override 
        public boolean equals(Object o) { 
         if (o != null && o instanceof CalendarItem) { 
          final CalendarItem item = (CalendarItem)o; 
          return item.year == year && item.month == month && item.day == day; 
         } 
         return false; 
        } 
    } } 
    
+0

方法返回'View',因此它被調用適配器小部件中的每一行。你所能做的就是實現一些緩存機制,它將保存每一行的子部件,以避免性能下降和內存泄漏(如果你正在使用圖像)。 – Sajmon

+0

getView方法將被稱爲days.length times – SKT

+0

@SKT:當我將count數設爲1時,仍然是多次調用 – user2890202

回答

0

引用的Android工程師RomainGuy

This is not an issue, there is absolutely no guarantee on the order in which getView() will be called nor how many times. 

所以,你可以處理重新使用現有的意見(行佈局)正確的最好的。

這是另一個好帖子。

來源:ListView - getView is called too much times

http://developer.android.com/reference/android/widget/GridView.html - 你可以看到這裏的GridView是某種類型的ListView。它擴展了AbsListView,所以我敢打賭,工作流程是相同的。

+0

你好先生。謝謝你的答案。但我沒有實現listview,因爲我正在使用gridviews和片段來實現Calendar。 – user2890202

+0

更新了答案:) –

相關問題