Android 自訂布局的日曆代碼

來源:互聯網
上載者:User


系統內建的日曆雖然好用,但是不符合某些項目的需求,所以需要自訂布局,看網上許多自訂View完成自訂日曆的,

自認水平不夠,無法駕馭,所以採用gridview來實現。


效果

CalendarUtils:(擷取當前年月對應的資料數組)


package kyle.com.zujian;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
 
/**
 * Created by kyle on 2016/8/12 0012.
 * 擷取某年某月的日期,介面上第一天為周日
 * 通過傳的年和月,擷取對應年月的日期和第一天是周幾
 */
public class CalendarUtils {
    private static int FIRST_DAY_OF_WEEK;//第一天
    private static Calendar calendar;//日曆
 
 
    public static List<DateEntity> getDate(int year, int month) {
        if (year <= 0 || month < 1 || month > 12) {
            return new ArrayList<>();//當年和月不符合規則時,返回空list
        }
        List<DateEntity> dates = new ArrayList<>();
        calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, year);//設定年
        calendar.set(Calendar.MONTH, month - 1);//設定月
        calendar.set(Calendar.DAY_OF_MONTH, 1);//設定第一天
        FIRST_DAY_OF_WEEK = calendar.get(Calendar.DAY_OF_WEEK) - 1;//獲得第一天是周幾 0:周日 6周六
        for (int i = 0; i < FIRST_DAY_OF_WEEK; i++) {//假設是周日則跳過,假設不是周日,就添加對應數目的空白item
            DateEntity entity = new DateEntity();
            dates.add(entity);
        }
        int count = checkDays(year, month);//擷取當前年月的天數
        for (int i = 0; i < count; i++) {
            DateEntity entity2 = new DateEntity(year, month, i + 1);
            dates.add(entity2);
        }
        return dates;
    }
 
    /***
     * 判斷當前年月有多少天
     *
     * @param year
     * @param month
     * @return
     */
    private static int checkDays(int year, int month) {
        if (year < 1 || month > 12 || month < 1) {
            return 0;
        }
        switch (month) {
            case 2:
                if (year % 4 == 0) {
                    return 29;
                } else {
                    return 28;
                }
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                return 31;
            case 4:
            case 6:
            case 9:
            case 11:
                return 30;
        }
        return 0;
    }
}

實體類:DateEntity

package kyle.com.zujian;
 
/**
 * Created by Administrator on 2016/8/9 0009.
 */
public class DateEntity {
    private int year;
    private int month;
    private int day;
 
    @Override
    public String toString() {
        return "DateEntity{" +
                "year=" + year +
                ", month=" + month +
                ", day=" + day +
                '}';
    }
 
    public DateEntity(){
 
}
    public DateEntity( int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
 
 
    public int getYear() {
        return year;
    }
 
    public void setYear(int year) {
        this.year = year;
    }
 
    public int getMonth() {
        return month;
    }
 
    public void setMonth(int month) {
        this.month = month;
    }
 
    public int getDay() {
        return day;
    }
 
    public void setDay(int day) {
        this.day = day;
    }
}

CalendarGridView:(自訂的gridview,把代碼轉移到這裡面,方便調用.)

package kyle.com.zujian;
 
import android.content.Context;
import android.support.v4.content.ContextCompat;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
 
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
 
/**
 * Created by kyle on 2016/8/15 0015.
 * 自訂日曆gridview
 */
public class CalendarGridView extends GridView {
 
    private Context mContext;
    private List<DateEntity> mList = new ArrayList<>();
    private MyAdapter mAdapter;
    private Calendar calendar;
    /***
     * 今天
     */
    private int NOW_YEAR;//當前年
    private int NOW_MONTH;//當前月
    private int NOW_DAY;//當前日
 
    public CalendarGridView(Context context) {
        super(context, null);
        mContext = context;
    }
 
    public CalendarGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        calendar = Calendar.getInstance();//擷取日曆執行個體
        NOW_YEAR = calendar.get(Calendar.YEAR);//當前年
        NOW_MONTH = calendar.get(Calendar.MONTH) + 1;//當前月
        NOW_DAY = calendar.get(Calendar.DAY_OF_MONTH);//當前日
        mAdapter = new MyAdapter();//執行個體化和設定適配器
        setAdapter(mAdapter);
    }
 
    public void init(int year, int month) {
        if (year < 1 || month < 1 || month > 12) {
            Toast.makeText(mContext, "年份或月份錯誤!", Toast.LENGTH_SHORT).show();
            return;
        }
        mList.clear();
        for (DateEntity entity : CalendarUtils.getDate(year, month)) {
            mList.add(entity);
        }
        mAdapter.notifyDataSetChanged();
    }
 
    private class MyAdapter extends BaseAdapter {
 
        @Override
        public int getCount() {
            return mList.size();
        }
 
        @Override
        public Object getItem(int position) {
            return mList.get(position);
        }
 
        @Override
        public long getItemId(int position) {
            return position;
        }
 
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            MyHolder holder;
            if (convertView == null) {
                convertView = View.inflate(mContext, R.layout.item_grid, null);
                holder = new MyHolder();
                holder.llMain = (LinearLayout) convertView.findViewById(R.id.ll_main);
                holder.tvDate = (TextView) convertView.findViewById(R.id.tv_date);
                holder.tvCount = (TextView) convertView.findViewById(R.id.tv_count);
                convertView.setTag(holder);
            } else {
                holder = (MyHolder) convertView.getTag();
            }
            int year = mList.get(position).getYear();
            int month = mList.get(position).getMonth();
            int day = mList.get(position).getDay();
            if (year == NOW_YEAR && month == NOW_MONTH && day == NOW_DAY) {
                holder.llMain.setBackgroundResource(R.color.red);
                holder.tvDate.setTextColor(ContextCompat.getColor(mContext, R.color.white));
                holder.tvCount.setTextColor(ContextCompat.getColor(mContext, R.color.white));
            } else {
                holder.llMain.setBackgroundResource(R.color.white);
                holder.tvDate.setTextColor(ContextCompat.getColor(mContext, R.color.black));
                holder.tvCount.setTextColor(ContextCompat.getColor(mContext, R.color.black));
            }
            if (day != 0) {
                holder.tvDate.setText(mList.get(position).getDay() + "");
            } else {
                holder.tvDate.setText("");
            }
            return convertView;
        }
    }
 
    private class MyHolder {
        private LinearLayout llMain;
        private TextView tvDate;
        private TextView tvCount;
    }
}

在Activity裡面這樣調用:

CalendarGridView mGv= (CalendarGridView) findViewById(R.id.gv);
mGv.init(2016,8);
 

當然,布局和實體類都可以自己去根據需求寫,而如果想要真正的日曆功能,則可以使用viewpager+fragment實現了

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.