title: Enable and Disable the dates in android
body: <p>i am using calendar in my application, successfully have implemented calender in my app, but the doubt is how to enable and disable the specific dates(ex: need to enable only monday in all months or Monday &amp; sunday in all months).</p>
  
  <p>My calender view </p>
  
  <pre><code>import java.util.ArrayList;
  import java.util.GregorianCalendar;
  import java.util.Locale;
  
  import android.app.Activity;
  import android.graphics.Color;
  import android.graphics.Typeface;
  import android.os.Bundle;
  import android.os.Handler;
  import android.util.Log;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.view.Window;
  import android.widget.AdapterView;
  import android.widget.AdapterView.OnItemClickListener;
  import android.widget.GridView;
  import android.widget.LinearLayout;
  import android.widget.RelativeLayout;
  import android.widget.TextView;
  import android.widget.Toast;
  
  import com.infometricx.adapter.CalendarAdapter;
  import com.infometricx.utils.CalendarUtility;
  
  public class CalendarView extends Activity {
  
      public GregorianCalendar month, itemmonth;// calendar instances.
  
      public CalendarAdapter adapter;// adapter instance
      public Handler handler;// for grabbing some event values for showing the dot
                              // marker.
      public ArrayList&lt;String&gt; items; // container to store calendar items which
                                      // needs showing the event marker
      ArrayList&lt;String&gt; event;
      LinearLayout rLayout;
      ArrayList&lt;String&gt; date;
      ArrayList&lt;String&gt; desc;
  
      Typeface MyriadPro;
  
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
  
          requestWindowFeature(Window.FEATURE_NO_TITLE);
          setContentView(R.layout.calender);
          Locale.setDefault(Locale.US);
  
          rLayout = (LinearLayout) findViewById(R.id.text);
  
          MyriadPro = Typeface.createFromAsset(getAssets(),
                  "fonts/MyriadPro-Light.otf");
  
          month = (GregorianCalendar) GregorianCalendar.getInstance();
          itemmonth = (GregorianCalendar) month.clone();
  
          items = new ArrayList&lt;String&gt;();
  
          adapter = new CalendarAdapter(this, month);
  
          GridView gridview = (GridView) findViewById(R.id.gridview);
          gridview.setAdapter(adapter);
  
          handler = new Handler();
          handler.post(calendarUpdater);
  
          TextView title = (TextView) findViewById(R.id.title);
          title.setText(android.text.format.DateFormat.format("MMMM yyyy", month));
  
          title.setTypeface(MyriadPro);
  
          RelativeLayout previous = (RelativeLayout) findViewById(R.id.previous);
  
          previous.setOnClickListener(new OnClickListener() {
  
              @Override
              public void onClick(View v) {
                  setPreviousMonth();
                  refreshCalendar();
              }
          });
  
          RelativeLayout next = (RelativeLayout) findViewById(R.id.next);
          next.setOnClickListener(new OnClickListener() {
  
              @Override
              public void onClick(View v) {
                  setNextMonth();
                  refreshCalendar();
  
              }
          });
  
          gridview.setOnItemClickListener(new OnItemClickListener() {
              public void onItemClick(AdapterView&lt;?&gt; parent, View v,
                      int position, long id) {
                  // removing the previous view if added
                  if (((LinearLayout) rLayout).getChildCount() &gt; 0) {
                      ((LinearLayout) rLayout).removeAllViews();
                  }
                  desc = new ArrayList&lt;String&gt;();
                  date = new ArrayList&lt;String&gt;();
                  ((CalendarAdapter) parent.getAdapter()).setSelected(v);
                  String selectedGridDate = CalendarAdapter.dayString
                          .get(position);
  
                  Log.d("selectedGridDate", "-----&gt;" + selectedGridDate);
  
                  String[] separatedTime = 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 &gt; 10) &amp;&amp; (position &lt; 8)) {
                      setPreviousMonth();
                      refreshCalendar();
                  } else if ((gridvalue &lt; 7) &amp;&amp; (position &gt; 28)) {
                      setNextMonth();
                      refreshCalendar();
                  }
                  ((CalendarAdapter) parent.getAdapter()).setSelected(v);
  
                  for (int i = 0; i &lt; CalendarUtility.startDates.size(); i++) {
  
                  }
  
                  for (int i = 0; i &lt; CalendarUtility.startDates.size(); i++) {
                      if (CalendarUtility.startDates.get(i).equals(
                              selectedGridDate)) {
                          desc.add(CalendarUtility.nameOfEvent.get(i));
                      }
                  }
  
                  if (desc.size() &gt; 0) {
                      for (int i = 0; i &lt; desc.size(); i++) {
                          TextView rowTextView = new TextView(CalendarView.this);
  
                          // set some properties of rowTextView or something
                          rowTextView.setText("Event:" + desc.get(i));
                          rowTextView.setTextColor(Color.BLACK);
  
                          // add the textview to the linearlayout
                          rLayout.addView(rowTextView);
  
                      }
  
                  }
  
                  desc = null;
  
              }
  
          });
      }
  
      protected void setNextMonth() {
          if (month.get(GregorianCalendar.MONTH) == month
                  .getActualMaximum(GregorianCalendar.MONTH)) {
              month.set((month.get(GregorianCalendar.YEAR) + 1),
                      month.getActualMinimum(GregorianCalendar.MONTH), 1);
          } else {
              month.set(GregorianCalendar.MONTH,
                      month.get(GregorianCalendar.MONTH) + 1);
          }
  
      }
  
      protected void setPreviousMonth() {
          if (month.get(GregorianCalendar.MONTH) == month
                  .getActualMinimum(GregorianCalendar.MONTH)) {
              month.set((month.get(GregorianCalendar.YEAR) - 1),
                      month.getActualMaximum(GregorianCalendar.MONTH), 1);
          } else {
              month.set(GregorianCalendar.MONTH,
                      month.get(GregorianCalendar.MONTH) - 1);
          }
  
      }
  
      protected void showToast(String string) {
          Toast.makeText(this, string, Toast.LENGTH_SHORT).show();
  
      }
  
      public void refreshCalendar() {
          TextView title = (TextView) findViewById(R.id.title);
  
          adapter.refreshDays();
          adapter.notifyDataSetChanged();
          handler.post(calendarUpdater); // generate some calendar items
  
          title.setText(android.text.format.DateFormat.format("MMMM yyyy", month));
  
      }
  
      public Runnable calendarUpdater = new Runnable() {
  
          @Override
          public void run() {
              items.clear();
  
              // Print dates of the current week
              // DateFormat df = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
  
              event = CalendarUtility.readCalendarEvent(CalendarView.this);
              Log.d("=====Event====", event.toString());
              Log.d("=====Date ARRAY====", CalendarUtility.startDates.toString());
  
              for (int i = 0; i &lt; CalendarUtility.startDates.size(); i++) {
  
                  itemmonth.add(GregorianCalendar.DATE, 1);
                  items.add(CalendarUtility.startDates.get(i).toString());
              }
              adapter.setItems(items);
              adapter.notifyDataSetChanged();
          }
      };
  }
  </code></pre>
  
  <p>My Calender Adapter</p>
  
  <pre><code>import java.text.DateFormat;
  import java.text.SimpleDateFormat;
  import java.util.ArrayList;
  import java.util.GregorianCalendar;
  import java.util.List;
  import java.util.Locale;
  
  import android.content.Context;
  import android.graphics.Color;
  import android.graphics.Typeface;
  import android.util.Log;
  import android.view.LayoutInflater;
  import android.view.View;
  import android.view.ViewGroup;
  import android.widget.BaseAdapter;
  import android.widget.ImageView;
  import android.widget.TextView;
  
  import com.infometricx.goappointed.R;
  
  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&lt;String&gt; items;
      public static List&lt;String&gt; dayString;
      private View previousView;
      Typeface mMypriad;
  
      public CalendarAdapter(Context c, GregorianCalendar monthCalendar) {
          CalendarAdapter.dayString = new ArrayList&lt;String&gt;();
          Locale.setDefault(Locale.US);
  
          mMypriad = Typeface.createFromAsset(c.getAssets(),
                  "fonts/MyriadPro-Light.otf");
  
          month = monthCalendar;
          selectedDate = (GregorianCalendar) monthCalendar.clone();
          mContext = c;
          month.set(GregorianCalendar.DAY_OF_MONTH, 1);
          this.items = new ArrayList&lt;String&gt;();
          df = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
          curentDateString = df.format(selectedDate.getTime());
          refreshDays();
      }
  
      public void setItems(ArrayList&lt;String&gt; 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;
          final 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.calenderitem, 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) &gt; 1) &amp;&amp; (position &lt; firstDay)) {
              // setting offdays to white color.
              dayView.setTextColor(Color.WHITE);
              dayView.setClickable(false);
              dayView.setFocusable(false);
          } else if ((Integer.parseInt(gridvalue) &lt; 7) &amp;&amp; (position &gt; 28)) {
              dayView.setTextColor(Color.WHITE);
              dayView.setClickable(false);
              dayView.setFocusable(false);
          } else {
              // setting curent month's days in blue color.
              dayView.setTextColor(Color.BLACK);
          }
  
          if (dayString.get(position).equals(curentDateString)) {
              setSelected(v);
              previousView = v;
          } else {
              v.setBackgroundResource(R.drawable.list_item_background);
          }
  
          dayView.setText(gridvalue);
          dayView.setTypeface(mMypriad);
  
          // create date string for comparison
          String date = dayString.get(position);
  
          Log.d("date", "---&gt;" + date);
  
          if (date.length() == 1) {
              date = "0" + date;
          }
          String monthStr = "" + (month.get(GregorianCalendar.MONTH) + 1);
          if (monthStr.length() == 1) {
              monthStr = "0" + monthStr;
          }
          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 &lt; 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;
      }
  
  }
  </code></pre>
  
  <p>Relevant Method:</p>
  
  <pre><code>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) &gt; 1) &amp;&amp; (position &lt; firstDay)) {
          // setting offdays to white color.
          dayView.setTextColor(Color.WHITE);
          dayView.setClickable(false);
          dayView.setFocusable(false);
      } else if ((Integer.parseInt(gridvalue) &lt; 7) &amp;&amp; (position &gt; 28)) {
          dayView.setTextColor(Color.WHITE);
          dayView.setClickable(false);
          dayView.setFocusable(false);
      } else {
          // setting curent month's days in blue color.
          dayView.setTextColor(Color.BLACK);
      }
  </code></pre>
  
  <p>This is my adapter class where i have formed a calendar view</p>
  
  <p>Help me to get a solution, 
  Thanks in advance.</p>