2013-03-13 85 views
1

我在android中使用gridview创建一个日历,我也有一个包含选定日期的列表视图。我需要的是我必须从GridView的列表视图中的每个项目比较每个数据。我该怎么做?如何通过gridview循环android

这里是适配器:

public class CalendarAdapter extends BaseAdapter { 
    private Context mContext; 

    private java.util.Calendar month; 
    public GregorianCalendar pmonth; // calendar instance for previous month 
    /** 
    * calendar instance for previous month for getting complete view 
    */ 
    public GregorianCalendar pmonthmaxset; 
    private GregorianCalendar selectedDate; 
    int firstDay; 
    int maxWeeknumber; 
    int maxP; 
    int calMaxP; 
    int lastWeekDay; 
    int leftDays; 
    int mnthlength; 
    String itemvalue, curentDateString; 
    DateFormat df; 

    private ArrayList<String> items; 
    public static List<String> dayString; 
    private View previousView; 

    public CalendarAdapter(Context c, GregorianCalendar monthCalendar) { 
     CalendarAdapter.dayString = new ArrayList<String>(); 
     Locale.setDefault(Locale.US); 
     month = monthCalendar; 
     selectedDate = (GregorianCalendar) monthCalendar.clone(); 
     mContext = c; 
     month.set(GregorianCalendar.DAY_OF_MONTH, 1); 
     this.items = new ArrayList<String>(); 
     df = new SimpleDateFormat("yyyy-MM-dd", Locale.US); 
     curentDateString = df.format(selectedDate.getTime()); 
     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 dayString.size(); 
    } 

    public Object getItem(int position) { 
     return dayString.get(position); 
    } 

    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); 
     // separates daystring into parts. 
     String[] separatedTime = dayString.get(position).split("-"); 
     // taking last part of date. ie; 2 from 2012-12-02 
     String gridvalue = separatedTime[2].replaceFirst("^0*", ""); 
     // checking whether the day is in current month or not. 
     if ((Integer.parseInt(gridvalue) > 1) && (position < firstDay)) { 
      // setting offdays to white color. 
      dayView.setTextColor(Color.WHITE); 
      dayView.setClickable(false); 
      dayView.setFocusable(false); 
     } else if ((Integer.parseInt(gridvalue) < 7) && (position > 28)) { 
      dayView.setTextColor(Color.WHITE); 
      dayView.setClickable(false); 
      dayView.setFocusable(false); 
     } else { 
      // setting curent month's days in blue color. 
      dayView.setTextColor(Color.BLUE); 
     } 

     if (dayString.get(position).equals(curentDateString)) { 
      setSelected(v); 
      previousView = v; 
     } else { 
      v.setBackgroundResource(R.drawable.list_item_background); 
     } 
     dayView.setText(gridvalue); 

     // create date string for comparison 
     String date = dayString.get(position); 

     if (date.length() == 1) { 
      date = "0" + date; 
     } 
     String monthStr = "" + (month.get(GregorianCalendar.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 View setSelected(View view) { 
     if (previousView != null) { 
      previousView.setBackgroundResource(R.drawable.list_item_background); 
     } 
     previousView = view; 
     view.setBackgroundResource(R.drawable.calendar_cel_selectl); 
     return view; 
    } 

    public void refreshDays() { 
     // clear items 
     items.clear(); 
     dayString.clear(); 
     Locale.setDefault(Locale.US); 
     pmonth = (GregorianCalendar) month.clone(); 
     // month start day. ie; sun, mon, etc 
     firstDay = month.get(GregorianCalendar.DAY_OF_WEEK); 
     // finding number of weeks in current month. 
     maxWeeknumber = month.getActualMaximum(GregorianCalendar.WEEK_OF_MONTH); 
     // allocating maximum row number for the gridview. 
     mnthlength = maxWeeknumber * 7; 
     maxP = getMaxP(); // previous month maximum day 31,30.... 
     calMaxP = maxP - (firstDay - 1);// calendar offday starting 24,25 ... 
     /** 
     * Calendar instance for getting a complete gridview including the three 
     * month's (previous,current,next) dates. 
     */ 
     pmonthmaxset = (GregorianCalendar) pmonth.clone(); 
     /** 
     * setting the start date as previous month's required date. 
     */ 
     pmonthmaxset.set(GregorianCalendar.DAY_OF_MONTH, calMaxP + 1); 

     /** 
     * filling calendar gridview. 
     */ 
     for (int n = 0; n < mnthlength; n++) { 

      itemvalue = df.format(pmonthmaxset.getTime()); 
      pmonthmaxset.add(GregorianCalendar.DATE, 1); 
      dayString.add(itemvalue); 

     } 
    } 

    private int getMaxP() { 
     int maxP; 
     if (month.get(GregorianCalendar.MONTH) == month 
       .getActualMinimum(GregorianCalendar.MONTH)) { 
      pmonth.set((month.get(GregorianCalendar.YEAR) - 1), 
        month.getActualMaximum(GregorianCalendar.MONTH), 1); 
     } else { 
      pmonth.set(GregorianCalendar.MONTH, 
        month.get(GregorianCalendar.MONTH) - 1); 
     } 
     maxP = pmonth.getActualMaximum(GregorianCalendar.DAY_OF_MONTH); 

     return maxP; 
    } 
} 

这里是主要活动,其中i点击日期:

gridview.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View v, 
        int position, long id) { 

       ((CalendarAdapter) parent.getAdapter()).setSelected(v); 
       globalVariables.selectedGridDate = CalendarAdapter.dayString 
         .get(position); 
       String[] separatedTime = globalVariables.selectedGridDate.split("-"); 
       String gridvalueString = separatedTime[2].replaceFirst("^0*", 
         "");// taking last part of date. ie; 2 from 2012-12-02. 
       int gridvalue = Integer.parseInt(gridvalueString); 
       // navigate to next or previous month on clicking offdays. 
       if ((gridvalue > 10) && (position < 8)) { 
        setPreviousMonth(); 
        refreshCalendar(); 
       } else if ((gridvalue < 7) && (position > 28)) { 
        setNextMonth(); 
        refreshCalendar(); 
       } 
       ((CalendarAdapter) parent.getAdapter()).setSelected(v); 

       requestConsult(globalVariables.selectedGridDate); 
      } 
     }); 
    } 

提前感谢!

回答

1

你有getItem和getCount。迭代所有项目。像这样:

for(int i=0;i<adapter.getCount();i++){ 
     adapter.getItem(i)..... 
1

我得到了,只是参考我下面的代码解决方案

if (Alldata.ExceptionDat.contains(dayString.get(position))) { 
      dayView.setTextColor(Color.WHITE); 
     dayView.setClickable(true); 
     dayView.setEnabled(true); 
     dayView.setFocusable(true); 
    }` 

ALLDATA是包含我选择日期列表我的数组列表和daystring是包含了所有的最新名单日期,使用这个Alldata.ExceptionDat.contains(dayString.get(position)行来比较。

希望这会对你有帮助