在GridView中获取项目

时间:2013-08-16 16:28:58

标签: android android-gridview

您好我尝试在gridview中制作日历。

我希望每次用户点击gricel时都会标记gricel。

我的问题是,我无法取消之前选择的gricel未加标记。

我尝试使用setOnItemClickListener作为我的gridview,但它的doest工作,请参阅我的问题:

GridView setOnItemClickListener does not respond to clicks

所以我尝试将setOnClickListener用于我的adpater中的视图。

它正在努力让它们被点击但我无法更新我的适配器中的任何视图。

要更新最后一个视图,我有一个虚拟Button和Drawable对象。

我附上了gridview的图片。我希望每次只标记一个gricel

这是我的适配器代码:

        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

1 个答案:

答案 0 :(得分:0)

在自定义适配器类的getView()方法中添加以下代码行:

btn.setFocusable(false);
btn.setClickable(false);
相关问题