无法加粗或突出显示Android自定义日历的事件日期

时间:2014-11-10 09:07:47

标签: java android calendar

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.calendar);
    Locale.setDefault(Locale.US);

    test1 = "2014-11-08";
    test2 = "2014-11-07";
    test3 = "2014-12-08";
    test4 = "2014-12-04";

    rLayout = (LinearLayout) findViewById(R.id.text);
    tvView = (TextView)findViewById(R.id.tvView);
    tvView1 = (TextView)findViewById(R.id.tvView1);
    tvView2 = (TextView)findViewById(R.id.tvView2);
    tvView3 = (TextView)findViewById(R.id.tvView3);
    tvView4 = (TextView)findViewById(R.id.tvView4);
    tvView5 = (TextView)findViewById(R.id.tvView5);

    tvView3.setVisibility(View.GONE);
    tvView4.setVisibility(View.GONE);
    tvView5.setVisibility(View.GONE);

    month = (GregorianCalendar) Calendar.getInstance();
    itemmonth = (GregorianCalendar) month.clone();

    items = new ArrayList<String>();

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

    RelativeLayout previous = (RelativeLayout) findViewById(R.id.previous);

    previous.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            setPreviousMonth();
            refreshCalendar();
            tvView.setVisibility(View.GONE);
        }
    });

    RelativeLayout next = (RelativeLayout) findViewById(R.id.next);
    next.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            setNextMonth();
            refreshCalendar();
            tvView.setVisibility(View.GONE);


        }
    });



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

            TextView cdate = (TextView)v.findViewById(R.id.date);
            if(cdate instanceof TextView && !cdate.getText().equals("")) 
            {

                 TextView title  = (TextView) findViewById(R.id.title);
                title.setText(android.text.format.DateFormat.format("MMMM yyyy", month));

                testMonth=title.getText().toString();

                String day = cdate.getText().toString();
                Toast.makeText(getApplicationContext(),day+" "+testMonth,Toast.LENGTH_SHORT).show();

            }

            // removing the previous view if added
            if (rLayout.getChildCount() > 0) {
            //  rLayout.removeAllViews();
            }
            desc = new ArrayList<String>();
            date = new ArrayList<String>();
            ((CalendarAdapter) parent.getAdapter()).setSelected(v);
            String selectedGridDate = CalendarAdapter.dayString
                    .get(position);
            tvView.setVisibility(View.VISIBLE);
            tvView3.setVisibility(View.VISIBLE);
            tvView4.setVisibility(View.VISIBLE);
            tvView5.setVisibility(View.VISIBLE);
            if(test1.equals(selectedGridDate))
            {
                tvView.setText("My Goal");
                tvView.setTextColor(Color.RED);
                tvView1.setText("");
                tvView1.setTextColor(Color.CYAN);
                tvView2.setText("");
            }
            else if(test2.equals(selectedGridDate))
            {
                tvView.setText("Passion of a Student");
                tvView.setTextColor(Color.RED);
                tvView1.setText("Creating my own Goal");
                tvView1.setTextColor(Color.CYAN);
                tvView2.setText("Circular Task");
                tvView2.setTextColor(Color.GREEN);

            }
            else if(test3.equals(selectedGridDate))
            {
                tvView.setText("My test Passion");
                tvView.setTextColor(Color.RED);
                tvView1.setText("");
                tvView1.setTextColor(Color.CYAN);
                tvView2.setText("");
            }
            else if(test3.equals(selectedGridDate))
            {
                tvView.setText("My test Task");
                tvView.setTextColor(Color.RED);
            }

            else
            {
                tvView.setText("No task found");
                tvView.setTextColor(Color.MAGENTA);
                tvView1.setText("");
                tvView1.setTextColor(Color.CYAN);
                tvView2.setText("");
                tvView2.setTextColor(Color.GREEN);
                tvView3.setVisibility(View.GONE);
                tvView4.setVisibility(View.GONE);
                tvView5.setVisibility(View.GONE);
            }

            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 > 10) && (position < 8)) {
                setPreviousMonth();
                refreshCalendar();
            } else if ((gridvalue < 7) && (position > 28)) {
                setNextMonth();
                refreshCalendar();
            }
            ((CalendarAdapter) parent.getAdapter()).setSelected(v);

            for (int i = 0; i < Utility.startDates.size(); i++) {
                if (Utility.startDates.get(i).equals(selectedGridDate)) {
                    desc.add(Utility.nameOfEvent.get(i));
                }
            }

            if (desc.size() > 0) {
                for (int i = 0; i < 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(Calendar.MONTH) == month
            .getActualMaximum(Calendar.MONTH)) {
        month.set((month.get(Calendar.YEAR) + 1),
                month.getActualMinimum(Calendar.MONTH), 1);
    } else {
        month.set(Calendar.MONTH,
                month.get(Calendar.MONTH) + 1);
    }

}

protected void setPreviousMonth() {
    if (month.get(Calendar.MONTH) == month
            .getActualMinimum(Calendar.MONTH)) {
        month.set((month.get(Calendar.YEAR) - 1),
                month.getActualMaximum(Calendar.MONTH), 1);
    } else {
        month.set(Calendar.MONTH,
                month.get(Calendar.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);
        String itemvalue;
        event = Utility.readCalendarEvent(CalendarView.this);
        Log.d("=====Event====", event.toString());
        Log.d("=====Date ARRAY====", Utility.startDates.toString());

        for (int i = 0; i < Utility.startDates.size(); i++) {
            itemvalue = df.format(itemmonth.getTime());
            itemmonth.add(Calendar.DATE, 1);
            items.add(Utility.startDates.get(i).toString());
        }
        adapter.setItems(items);
        adapter.notifyDataSetChanged();
    }
};

这里我可以在点击特定日期时查看所有事件,但我的要求也是显示带有粗体样式的日期或包含事件而没有单击gridview项目的任何其他颜色视图。我的适配器类如下::: < / p>

    public class CalendarAdapter extends BaseAdapter {
private Context mContext;

private java.util.Calendar month;
public GregorianCalendar pmonth;
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(Calendar.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;
}

@Override
public int getCount() {
    return dayString.size();
}

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

@Override
public long getItemId(int position) {
    return 0;
}

// create a new view for each item referenced by the Adapter
@Override
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_layout, 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(Calendar.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(Calendar.DAY_OF_WEEK);
    // finding number of weeks in current month.
    maxWeeknumber = month.getActualMaximum(Calendar.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(Calendar.DAY_OF_MONTH, calMaxP + 1);

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

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

    }
}

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

    return maxP;
}

}

1 个答案:

答案 0 :(得分:0)

Atlast我已经解决了我的问题,更改了我的Runnable日历更新程序,如下所示:

    public Runnable calendarUpdater = new Runnable() {

    @Override
    public void run() 
    {
    items.clear();

    // Print dates of the current week
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    String itemvalue;
    for (int i = 0; i < 7; i++) 
    {
    itemvalue = df.format(itemmonth.getTime());
    itemmonth.add(Calendar.DATE, 1);
    items.add("2014-12-08");
    items.add("2014-12-04");
    items.add("2014-11-07");
    items.add("2014-11-08");
    }
    adapter.setItems(items);
    adapter.notifyDataSetChanged();
    }
};

现在我可以在不点击gridView项目的情况下看到这些事件。感谢所有人在这方面的友好合作。但现在问题是如何在Android谷歌日历上显示此事件。