2013-08-16 168 views
0

您好,我嘗試在gridview中創建一個日曆。在GridView中獲取項目

我希望每當用戶點擊gricel時他都會被標記。

我的問題是,我不能得到先前選定的未標記的未分類的gricel。

我嘗試使用setOnItemClickListener我的GridView,但其行的事工,見我的問題在這裏:

GridView setOnItemClickListener does not respond to clicks

所以我試圖用setOnClickListener我adpater內部的看法。

它的工作,讓他們點擊,但我不能更新我的適配器中的任何意見。

要更新最後一個視圖,我有一個虛擬的Button和Drawable對象。

我附上了我的gridview的圖片。我希望每次只有一個gricel將markedd

這是我的適配器代碼:

 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 final int month, year; 
      private int daysInMonth, prevMonthDays; 
      private int currentDayOfMonth; 
      private int currentWeekDay; 
      private Button gridcell; 

      // Days in Current Month 
      public GridCellAdapter(Context context, int textViewResourceId, 
        int month, int year) { 

       super(); 
       this._context = context; 
       this.list = new ArrayList<String>(); 
       this.month = month; 
       this.year = year; 

       //Log.d(tag, "==> Passed in Date FOR Month: " + month + " " 
        // + "Year: " + year); 
       Calendar calendar = Calendar.getInstance(Locale.ENGLISH); 
       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); 

      } 

      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 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; 
       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 == 2) { 
        ++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()) { 
         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); 
       } 
      } 

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

      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.calendar_day_gridcell, parent, 
          false); 
       } 

       Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)) 
         .getDefaultDisplay(); 

       int height = 0; 

       if (android.os.Build.VERSION.SDK_INT >= 13) { 
        Point size = new Point(); 
        display.getSize(size); 
        height = size.y; 

       } else 
        height = display.getHeight(); 

       float scaledDensity = getApplicationContext().getResources() 
         .getDisplayMetrics().scaledDensity; 

       height = (height/((int) scaledDensity)); 

       if (calendarView.getCount() > 35) 
        height = (height - 300)/7; 
       else 
        height = (height - 300)/6; 

       RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
         RelativeLayout.LayoutParams.MATCH_PARENT, height); 

       // Get a reference to the Day gridcell 
       gridcell = (Button) row.findViewById(R.id.calendar_day_gridcell); 
       gridcell.setLayoutParams(lp); 
       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]; 

       // Set the Day GridCell 
       gridcell.setText(theday); 
       gridcell.setTag(theday + "-" + themonth + "-" + theyear); 

       if(dateWanted.equals(theday + "-" + themonth + "-" + theyear)) 
        gridcell.setBackgroundColor(getResources().getColor(R.color.LightGreen)); 

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

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

       return row; 
      } 



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

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       whatclicked(v); 
      } 


     } 


public void whatclicked(View arg1) 
     { 
      // TODO Auto-generated method stub 
      dateWanted = (String) arg1.getTag(); 
      Log.i("date", dateWanted); 

      if(checkedPoistion != -1) 
       lastButtonClicked.setBackground(lastDrawable); 

      checkedPoistion = 1; 
      arg1.setBackgroundColor(getResources().getColor(R.color.LightGreen)); 

      lastDrawable = arg1.getBackground(); 
      lastButtonClicked = (Button) arg1; 

      dateTextView.setText("2 - Choose from which date to start the program\nYou chossed from " 
        + dateWanted); 

     } 

我的XML代碼:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:descendantFocusability="blocksDescendants" 
    android:background="@drawable/background" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/dateTextView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="5sp" 
     android:layout_marginTop="15sp" 
     android:text="From which date to start" 
     android:textColor="@color/Black" 
     android:textSize="17sp" /> 


    <RelativeLayout 
     android:id="@+id/linearLayout1" 
     android:layout_width="fill_parent" 
     android:layout_height="65sp" 
     android:orientation="horizontal" > 

     <ImageButton 
      android:id="@+id/nextMonth" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentRight="true" 
      android:layout_alignParentTop="true" 
      android:src="@drawable/go_next" /> 

     <ImageButton 
      android:id="@+id/prevMonth" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentTop="true" 
      android:layout_marginLeft="18dp" 
      android:src="@drawable/go_back" /> 

     <TextView 
      android:id="@+id/textMonth" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerHorizontal="true" 
      android:layout_centerVertical="true" 
      android:text="TextView" 
      android:textColor="@color/Black" 
      android:textSize="20sp" /> 
    </RelativeLayout> 

    <RelativeLayout 
     android:id="@+id/linearLayout4" 
     android:layout_width="fill_parent" 
     android:layout_height="35sp" 

     android:layout_below="@+id/linearLayout1" 
     android:background="@color/LightBlue" 
     android:orientation="horizontal" > 

     <TextView 
      android:id="@+id/textView4" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:layout_alignParentTop="true" 
      android:layout_marginLeft="16dp" 
      android:layout_toRightOf="@+id/textView1" 
      android:gravity="center_vertical" 
      android:text="Thu" 
      android:textColor="@color/Black" 
      android:textStyle="bold" /> 

     <TextView 
      android:id="@+id/textView5" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:layout_alignParentRight="true" 
      android:layout_alignParentTop="true" 
      android:layout_marginRight="18dp" 
      android:gravity="center_vertical" 
      android:text="Sat" 
      android:textColor="@color/Black" 
      android:textStyle="bold" /> 

     <TextView 
      android:id="@+id/textView3" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentTop="true" 
      android:gravity="center_vertical" 
      android:text="Sun" 
      android:textColor="@color/Black" 
      android:textStyle="bold" /> 

     <TextView 
      android:id="@+id/textView6" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:layout_alignParentTop="true" 
      android:layout_marginLeft="23dp" 
      android:layout_toRightOf="@+id/textView4" 
      android:gravity="center_vertical" 
      android:text="Fri" 
      android:textColor="@color/Black" 
      android:textStyle="bold" /> 

     <TextView 
      android:id="@+id/textView2" 
      android:layout_width="31sp" 
      android:layout_height="match_parent" 
      android:layout_alignParentTop="true" 
      android:layout_marginLeft="28dp" 
      android:layout_toRightOf="@+id/textView3" 
      android:gravity="center_vertical" 
      android:text="Mon" 
      android:textColor="@color/Black" 
      android:textStyle="bold" /> 

     <TextView 
      android:id="@+id/textView9" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:layout_alignParentTop="true" 
      android:layout_marginLeft="19dp" 
      android:layout_toRightOf="@+id/textView2" 
      android:gravity="center_vertical" 
      android:text="Tue" 
      android:textColor="@color/Black" 
      android:textStyle="bold" /> 

     <TextView 
      android:id="@+id/textView1" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:layout_alignParentTop="true" 
      android:layout_centerHorizontal="true" 
      android:gravity="center_vertical" 
      android:text="Wed" 
      android:textColor="@color/Black" 
      android:textStyle="bold" /> 
    </RelativeLayout> 

    <GridView 
     android:id="@+id/calendar" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:clickable="true" 
     android:numColumns="7" 
     android:stretchMode="columnWidth" > 
    </GridView> 

</LinearLayout> 

enter image description here

+0

因爲您使用過: arg1.setBackgroundColor(getResources()。getColor(R.color.LightGreen)); lastDrawable = arg1.getBackground(); 所以lastDrawable總是LightGreen彩色 – hieuxit

+0

並回到第一個問題。如果你想使用gridView.setOnItemClickListener(),我建議你不要在gridCell上使用按鈕。你應該使用包含textview的frameLayout。 – hieuxit

+0

順便說一句「Chossed」不是一個詞,我認爲你正在尋找「選擇」 – Nick

回答

0

添加這些以下行代碼在您的自定義適配器類中的getView()方法中:

btn.setFocusable(false); 
btn.setClickable(false);