android日历(实现左右滑动,上下收起展开,根据标题栏定位)

本文介绍如何使用GridView和ViewPager实现一个可左右滑动、上下展开收起的日历组件。详细讨论了实现过程中的关键点,包括初始化选中日期、高度适配、避免Adapter重复调用等问题,并提供了相关代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先上效果图





主要思想是用gridview+viewpager做的。

这里就上一个主要的DateView类吧:



package com.example.datedemo;


import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.RelativeLayout;
import android.widget.AdapterView.OnItemClickListener;


public class DateView extends RelativeLayout {
private Context context;
private Map<String, DateAdapter> map;
private Calendar today, maxCalendar, minCalendar;//今天,以及日期上限和下限
private ViewPager pager;
private LayoutInflater inflater;
private ModelDate lastSelectedPosition;//当前选中的日期
private SelectedOnClickListener selectedOnClickListener;//日期被选中的接口,提供给外界调用
private boolean isFirst=true;//是否是第一次初始化
private Calendar firstDate;//初始化默认选中的日期
private boolean isFirstShowHead = false;//初始化展开或收起的状态
//设置选中监听
public void setSelectedListenser(SelectedOnClickListener selectedOnClickListener){
this.selectedOnClickListener = selectedOnClickListener;
}
public interface SelectedOnClickListener {
void onSeleted();
}
//设置初始化日期
public void setFirstDate(Calendar firstDate){
this.firstDate = firstDate;
int page = filtGetPage(firstDate.get(Calendar.YEAR),firstDate.get(Calendar.MONTH));
pager.setCurrentItem(page);
}
public DateView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
this.context = context;
LayoutInflater layoutInflater = LayoutInflater.from(context);
layoutInflater.inflate(R.layout.view_date, this, true);
pager = (ViewPager) findViewById(R.id.vp);
inflater = layoutInflater;
today = Calendar.getInstance();
map = new HashMap<String, DateAdapter>();
initMaxAndMinDate();
pager.setAdapter(new MyAdapter());
pager.setOnPageChangeListener(new OnPageChangeListener() {

@Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
if(isFirst){
return;
}
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MONTH, arg0 - 50);
if (arg0 != 50) {
setselected(calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH), 1,arg0);
} else {
setselected(calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH),arg0);
}
}

@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub

}

@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值