用GirdView来实现复杂显示的日历

项目中急用能在日期下面显示小方块的日历控件,这一显示效果老总和我说是项目成功与否的关键,我之前下了俩个日历的源码发现都比较难用,所以心里没有底,就来先看看现在能在网上收刮到的日历都有哪些?

1:android原生的日历Calendar

 CalendarView控件的实现效果图如下所示:

  

  

  这是Android3.0及以上版本自带的日历控件,我们可通过流动鼠标滑轮来选择上一月或是下一月,然后选择自己想要的日期,感觉就是灵活度不够,如果需要CalendarView更多的信息,可以查看Android官方文档:http://developer.android.com/reference/android/widget/CalendarView.html

2. 各种自定义控件

     

    

如果对其感兴趣可以在这位大神的博客中找到

我都下来看了一下,发现代码写的都狠牛逼,但是扩展性和美观都达不到我的要求,所以走上Github

3:Github上大神的开源项目

ExtendedCalendarViewimage

看起来设计很符合我的胃口,日期里面还有小的标记,很像我要做的效果,后来不知道什么原因,我没有仔细研究这个项目。

还有CaldroidTimesSquare for Android都不太容易扩展,所以就放弃了用人家的项目。

最后实在没办法了,自己用GridView开发试试看,依据就是,要显示一个日历,就是很多的日期项,上个月的日期和下个月的日期都用空白表示,本月的只要知道一共多少天按照顺序就可以用GridView显示,一旦能用GridView显示了,那么里面要显示很复杂的或者漂亮的效果就有可能了。

功夫不负有心人,最后我实现了下面的效果:


每一个item背景我用了渐变,所以还出现了一种意想不到的效果,可以看出每个蓝色的item 下面有有几个绿色的实心和空心的小方块。绿色的item是今天的日期,这样的一张图完美的实现的需求,不出意外,老板今天拿给客户看的时候,客户很满意,效果很是不错,最后老板夸了我,我很世故的说:“都是老板指导有方”。呵呵,完美的屌丝程序猿逆袭,太机智了我☺。

这逼装的略过哈,下面给出核心的代码(其实也不算核心,思路有了很简单的)

日期实体类:

public class CalendarCell {

	private int id; // id
	private int time;// 几号 24
	private Date date;// 准确的时间
	private int tag;// 标签 0:上个月 , 1:这个月 2:下个月 
	private boolean isSelect; // 是否选中   今天
	private int count; // 这一天有几个任务

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public int getTime() {
		return time;
	}

	public void setTime(int time) {
		this.time = time;
	}

	public Date getDate() {
		return date;
	}

	public void setDate(Date date) {
		this.date = date;
	}

	public int getTag() {
		return tag;
	}

	public void setTag(int tag) {
		this.tag = tag;
	}

	public boolean isSelect() {
		return isSelect;
	}

	public void setSelect(boolean isSelect) {
		this.isSelect = isSelect;
	}

	public int getCount() {
		return count;
	}

	public void setCount(int count) {
		this.count = count;
	}

}

显示的fragment布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:gravity="center"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@drawable/c2_brown2"
            android:gravity="center"
            android:padding="2dp"
            android:text="周一"
            android:textSize="@dimen/week_text_size" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@drawable/c2_brown2"
            android:gravity="center"
            android:text="周二"
            android:textSize="@dimen/week_text_size" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@drawable/c2_brown2"
            android:gravity="center"
            android:text="周三"
            android:textSize="@dimen/week_text_size" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@drawable/c2_brown2"
            android:gravity="center"
            android:text="周四"
            android:textSize="@dimen/week_text_size" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@drawable/c2_brown2"
            android:gravity="center"
            android:text="周五"
            android:textSize="@dimen/week_text_size" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@drawable/c2_brown2"
            android:gravity="center"
            android:text="周六"
            android:textSize="@dimen/week_text_size" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@drawable/c2_brown2"
            android:gravity="center"
            android:text="周日"
            android:textSize="@dimen/week_text_size" />
    </LinearLayout>

    <GridView
        android:id="@+id/gv_calendar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:cacheColorHint="@color/transparent"
        android:dividerHeight="2dp"
        android:fadingEdgeLength="2dp"
        android:fastScrollEnabled="true"
        android:footerDividersEnabled="false"
        android:horizontalSpacing="2dp"
        android:numColumns="7"
        android:scrollbars="vertical"
        android:scrollingCache="false"
        android:verticalSpacing="2dp" >
    </GridView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="本月人工数:"
            android:textColor="@color/grey_middle" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:text="19.5"
            android:textColor="@color/android_green" />
    </LinearLayout>

</LinearLayout>
显示的Fragment:

/**
 * 日历-护工工作安排
 * 
 * @author Jinyang
 * 
 */
public class CalendarFragment extends SherlockFragment {
	public static String TAG = "CalendarFragment";
	private GridView mGridView;
	private CalendarAdapter mAdapter;

	private List<CalendarCell> mCellList;

	private static int GridCount = 42;

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View viewRoot = inflater.inflate(R.layout.fragment_calendar, null);
		init(viewRoot);
		getDate();
		setListener();
		return viewRoot;
	}

	@SuppressWarnings("deprecation")
	private void init(View viewRoot) {
		setHasOptionsMenu(true);// 允许操作ActionBar;
		Date date = new Date();
		((MainActivity) getActivity()).setActionBarTitle(date.toLocaleString());
		mGridView = (GridView) viewRoot.findViewById(R.id.gv_calendar);
		mCellList = new ArrayList<CalendarCell>();
		mAdapter = new CalendarAdapter(getActivity(), mCellList,
				R.layout.item_calendar);
		mGridView.setAdapter(mAdapter);
	}

	/**
	 * 模拟数据
	 */
	private void getDate() {
		int totalCount = CalendarUtil.getDaysByMonth();
		int preDayCount = CalendarUtil.getWeekOfFirstMonth() - 1;
		int today = CalendarUtil.getToday();
		AppContext.showLog("这个月一个多少天" + CalendarUtil.getDaysByMonth());
		AppContext.showLog("第一天为星期几" + CalendarUtil.getWeekOfFirstMonth());
		// 上个月的空白日期
		for (int i = 0; i < preDayCount; i++) {
			CalendarCell c = new CalendarCell();
			c.setTag(0);
			mCellList.add(c);
		}
		// 本月
		for (int i = 1; i <= totalCount; i++) {
			CalendarCell c = new CalendarCell();
			c.setTag(1);
			c.setTime(i);
			if (i == 14 || i == 15) {
				c.setCount(3);
			}
			if (i == 20) {
				c.setCount(1);
			}
			if (i == 21) {
				c.setCount(4);
			}
			if (i == 30) {
				c.setCount(5);
			}
			if (i == today) {
				c.setSelect(true);
			}
			mCellList.add(c);
		}
		// 下个月
		int nextDayCount = GridCount - totalCount - preDayCount;
		for (int i = 0; i < nextDayCount; i++) {
			CalendarCell c = new CalendarCell();
			c.setTag(2);
			mCellList.add(c);
		}
	}
	private void setListener() {
		mGridView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				if (mCellList.get(arg2).getTag() == 1) {
					((MainActivity) getActivity()).turnToFragment(
							getFragmentManager(), CalendarDetailFragment.class,
							CalendarDetailFragment.TAG, null, true);
				}

			}
		});

	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case android.R.id.home:
			AppContext.showLog("点击了返回");
			getFragmentManager().popBackStack();
			break;
		default:
			break;
		}
		return super.onOptionsItemSelected(item);
	}
}

Gridview的item的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ly_calendar_item"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="@drawable/shape_cell_bg"
    android:orientation="vertical"
    android:padding="5dp" >

    <TextView
        android:id="@+id/tv_item_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:text="2"
        android:textColor="@color/grey_middle"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/tv_item_count"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/tv_item_time"
        android:layout_centerHorizontal="true"
        android:layout_margin="3dp"
        android:text=""
        android:textColor="@color/android_green"
        android:textSize="10sp" />

</RelativeLayout>

GridView的adapter:

import java.util.List;

import android.annotation.SuppressLint;
import android.content.Context;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.james.hospitalmg.R;
import com.james.hospitalmg.model.CalendarCell;

@SuppressLint("ResourceAsColor")
public class CalendarAdapter extends AbsObjectAdapter<CalendarCell> {

	public CalendarAdapter(Context context, List<CalendarCell> data,
			int layoutRes) {
		super(context, data, layoutRes);
	}

	@Override
	protected void setData(int pos, View convertView, CalendarCell itemData) {
		TextView time = getViewFromHolder(convertView, R.id.tv_item_time);
		TextView count = getViewFromHolder(convertView, R.id.tv_item_count);
		RelativeLayout bg = getViewFromHolder(convertView,
				R.id.ly_calendar_item);
		if (itemData.getTag() == 1) {
			time.setText("" + itemData.getTime());
			StringBuffer str = new StringBuffer();
			int careCount = itemData.getCount();
			for (int i = 0; i < careCount; i++) {
				str.append("■");
			}
			if (careCount > 0) {
				str.append("□");
				bg.setBackgroundResource(R.drawable.c2_gray4);
			}
			count.setText(str);
			// 今天
			if (itemData.isSelect()) {
				bg.setBackgroundResource(R.drawable.c2_brown2);
			}
		} else {
			time.setText("");
			count.setText("");
		}

	}

}






Caldroid

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值