使用ViewPager实现左右“无限”滑动的万年历
有时候就是这样,研究一个问题,一开始想到了一个觉得可行的方案,然后去尝试;尝试了很久、很多次,已经要放弃了,关掉电脑心里
这次我遇到的是这样一个问题,由于系统的CalendarView不太美观,所以要自己实现一个日历的布局;所以想到了使用GridView,然后
用ViewPager做左右滑动切换日期的效果;
mCurrentPageNumber
来分别代表当前展示的日期和当前所示的ViewPager的页数;然后滑动的时候,根据传进来的pageNum和当前的mCurrentPageNumber的大小来判断创建的日历是下个月,还是上个月;
mCurrentPageNumber的值为501;问题就出在这里,刚开始的时候初始化500,比如500代表8月,那么499的时候就是七月,这没有问题,可是当七月的界面创建完成之后,当前的Calendar就是七月,而
mCurrentPageNumber是499,在创建501的时候七月加1就是八月,也就是本来501代表9月,可是显示的是8月;滑动之后还出现了各种不可预知的结果......然后我就开始无数次的微调,判断如果是初始化就怎么样,然后就怎么样;改变当前页的值等等;一直一直弄了很久之后我都要昏了可还是没有搞定;最后决定算了,解决不了......
package tk.sweetvvck.calender.adapter; import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date; import tk.sweetvvck.calender.R;
import android.app.Activity;
import android.content.res.Resources;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView; public class CalendarGridViewAdapter extends BaseAdapter { private Calendar calStartDate = Calendar.getInstance();// 当前显示的日历
private Calendar calToday = Calendar.getInstance(); // 今日
private int iMonthViewCurrentMonth = 0; // 当前视图月
// 根据改变的日期更新日历
// 填充日历控件用
private void UpdateStartDateForMonth() {
calStartDate.set(Calendar.DATE, 1); // 设置成当月第一天
iMonthViewCurrentMonth = calStartDate.get(Calendar.MONTH);// 得到当前日历显示的月 // 星期一是2 星期天是1 填充剩余天数
int iDay = 0;
int iFirstDayOfWeek = Calendar.MONDAY;
int iStartDay = iFirstDayOfWeek;
if (iStartDay == Calendar.MONDAY) {
iDay = calStartDate.get(Calendar.DAY_OF_WEEK) - Calendar.MONDAY;
if (iDay < 0)
iDay = 6;
}
if (iStartDay == Calendar.SUNDAY) {
iDay = calStartDate.get(Calendar.DAY_OF_WEEK) - Calendar.SUNDAY;
if (iDay < 0)
iDay = 6;
}
calStartDate.add(Calendar.DAY_OF_WEEK, -iDay); calStartDate.add(Calendar.DAY_OF_MONTH, -1);// 周日第一位 }
ArrayList<java.util.Date> titles;
private ArrayList<java.util.Date> getDates() { UpdateStartDateForMonth(); ArrayList<java.util.Date> alArrayList = new ArrayList<java.util.Date>(); for (int i = 1; i <= 42; i++) {
alArrayList.add(calStartDate.getTime());
calStartDate.add(Calendar.DAY_OF_MONTH, 1);
} return alArrayList;
} private Activity activity;
Resources resources;
// construct
public CalendarGridViewAdapter(Activity a,Calendar cal) {
calStartDate=cal;
activity = a;
resources=activity.getResources();
titles = getDates();
} public CalendarGridViewAdapter(Activity a) {
activity = a;
resources=activity.getResources();
} @Override
public int getCount() {
return titles.size();
} @Override
public Object getItem(int position) {
return titles.get(position);
} @Override
public long getItemId(int position) {
return position;
} @SuppressWarnings("deprecation")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LinearLayout iv = new LinearLayout(activity);
iv.setGravity(Gravity.CENTER);
iv.setOrientation(LinearLayout.VERTICAL);
iv.setBackgroundColor(resources.getColor(R.color.white)); Date myDate = (Date) getItem(position);
Calendar calCalendar = Calendar.getInstance();
calCalendar.setTime(myDate); final int iMonth = calCalendar.get(Calendar.MONTH);
final int iDay = calCalendar.get(Calendar.DAY_OF_WEEK); // 判断周六周日
iv.setBackgroundColor(resources.getColor(R.color.white));
if (iDay == 7) {
// 周六
iv.setBackgroundColor(resources.getColor(R.color.text_6));
} else if (iDay == 1) {
// 周日
iv.setBackgroundColor(resources.getColor(R.color.text_7));
} else { }
// 判断周六周日结束 TextView txtToDay = new TextView(activity);
txtToDay.setGravity(Gravity.CENTER_HORIZONTAL);
txtToDay.setTextSize(9);
if (equalsDate(calToday.getTime(), myDate)) {
// 当前日期
iv.setBackgroundColor(resources.getColor(R.color.selection));
txtToDay.setText("TODAY!");
}
// 设置背景颜色结束 // 日期开始
TextView txtDay = new TextView(activity);// 日期
txtDay.setGravity(Gravity.CENTER_HORIZONTAL); // 判断是否是当前月
if (iMonth == iMonthViewCurrentMonth) {
txtToDay.setTextColor(resources.getColor(R.color.ToDayText));
txtDay.setTextColor(resources.getColor(R.color.Text));
} else {
txtDay.setTextColor(resources.getColor(R.color.noMonth));
txtToDay.setTextColor(resources.getColor(R.color.noMonth));
} int day = myDate.getDate(); // 日期
txtDay.setText(String.valueOf(day)); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
iv.addView(txtDay, lp); LinearLayout.LayoutParams lp1 = new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
iv.addView(txtToDay, lp1); return iv;
} @SuppressWarnings("deprecation")
private Boolean equalsDate(Date date1, Date date2) {
if (date1.getYear() == date2.getYear()
&& date1.getMonth() == date2.getMonth()
&& date1.getDate() == date2.getDate()) {
return true;
} else {
return false;
}
}
}
/*
* Copyright 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package tk.sweetvvck.calender.activity;
import java.util.Calendar;
import tk.sweetvvck.calender.R;
import tk.sweetvvck.calender.adapter.CalendarGridViewAdapter;
import tk.sweetvvck.calender.utils.Utils;
import android.app.Activity;
import android.app.Fragment;
import android.content.res.Resources;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Display;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;
public class CalendarFragment extends Fragment {
public static final String ARG_PAGE = "page";
private int mPageNumber;
private Calendar mCalendar;
private CalendarGridViewAdapter calendarGridViewAdapter;
public static Fragment create(int pageNumber) {
CalendarFragment fragment = new CalendarFragment();
Bundle args = new Bundle();
args.putInt(ARG_PAGE, pageNumber);
fragment.setArguments(args);
return fragment;
}
public CalendarFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPageNumber = getArguments().getInt(ARG_PAGE);
mCalendar = Utils.getSelectCalendar(mPageNumber);
calendarGridViewAdapter = new CalendarGridViewAdapter(getActivity(),
mCalendar);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout containing a title and body text.
ViewGroup rootView = (ViewGroup) inflater.inflate(
R.layout.calendar_view, container, false);
GridView titleGridView = (GridView) rootView
.findViewById(R.id.gridview);
TitleGridAdapter titleAdapter = new TitleGridAdapter(getActivity());
initGridView(titleGridView, titleAdapter);
GridView calendarView = (GridView) rootView
.findViewById(R.id.calendarView);
initGridView(calendarView, calendarGridViewAdapter);
calendarView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
for (int i = 0; i < parent.getCount(); i++) {
if ((i % 7) == 6) {
parent.getChildAt(i).setBackgroundColor(
getActivity().getResources().getColor(
R.color.text_6));
} else if ((i % 7) == 0) {
parent.getChildAt(i).setBackgroundColor(
getActivity().getResources().getColor(
R.color.text_7));
} else {
parent.getChildAt(i).setBackgroundColor(
Color.TRANSPARENT);
}
}
view.setBackgroundColor(getActivity().getResources().getColor(
R.color.selection));
}
});
return rootView;
}
private void initGridView(GridView gridView, BaseAdapter adapter) {
gridView = setGirdView(gridView);
gridView.setAdapter(adapter);// 设置菜单Adapter
}
@SuppressWarnings("deprecation")
private GridView setGirdView(GridView gridView) {
gridView.setNumColumns(7);// 设置每行列数
gridView.setGravity(Gravity.CENTER_VERTICAL);// 位置居中
gridView.setVerticalSpacing(1);// 垂直间隔
gridView.setHorizontalSpacing(1);// 水平间隔
gridView.setBackgroundColor(getResources().getColor(
R.color.calendar_background));
WindowManager windowManager = getActivity().getWindowManager();
Display display = windowManager.getDefaultDisplay();
int i = display.getWidth() / 7;
int j = display.getWidth() - (i * 7);
int x = j / 2;
gridView.setPadding(x, 0, 0, 0);// 居中
return gridView;
}
public class TitleGridAdapter extends BaseAdapter {
int[] titles = new int[] { R.string.Sun, R.string.Mon, R.string.Tue,
R.string.Wed, R.string.Thu, R.string.Fri, R.string.Sat };
private Activity activity;
// construct
public TitleGridAdapter(Activity a) {
activity = a;
}
@Override
public int getCount() {
return titles.length;
}
@Override
public Object getItem(int position) {
return titles[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LinearLayout iv = new LinearLayout(activity);
TextView txtDay = new TextView(activity);
txtDay.setFocusable(false);
txtDay.setBackgroundColor(Color.TRANSPARENT);
iv.setOrientation(LinearLayout.VERTICAL);
txtDay.setGravity(Gravity.CENTER);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
int i = (Integer) getItem(position);
txtDay.setTextColor(Color.GRAY);
Resources res = getResources();
if (i == R.string.Sat) {
// 周六
txtDay.setBackgroundColor(res.getColor(R.color.title_text_6));
} else if (i == R.string.Sun) {
// 周日
txtDay.setBackgroundColor(res.getColor(R.color.title_text_7));
} else {
}
txtDay.setText((Integer) getItem(position));
iv.addView(txtDay, lp);
return iv;
}
}
}
package tk.sweetvvck.calender.activity; import java.util.Calendar;
import tk.sweetvvck.calender.R;
import tk.sweetvvck.calender.utils.Utils;
import android.app.Fragment;
import android.app.FragmentManager;
import android.os.Bundle;
import android.support.v13.app.FragmentStatePagerAdapter;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.widget.TextView;
/**
* 日历
* @author 程科
*/
public class MainActivity extends FragmentActivity {
private ViewPager viewPager;
private TextView tvMonth;
private String month;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = (ViewPager) this.findViewById(R.id.viewpager);
final ScreenSlidePagerAdapter screenSlidePagerAdapter = new ScreenSlidePagerAdapter(
getFragmentManager());
viewPager.setAdapter(screenSlidePagerAdapter);
viewPager.setCurrentItem(500);
tvMonth = (TextView) this.findViewById(R.id.tv_month);
month = Calendar.getInstance().get(Calendar.YEAR)
+ "-"
+ Utils.LeftPad_Tow_Zero(Calendar.getInstance().get(
Calendar.MONTH) + 1);
tvMonth.setText(month);
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
Calendar calendar = Utils.getSelectCalendar(position);
month = calendar.get(Calendar.YEAR)
+ "-"
+ Utils.LeftPad_Tow_Zero(calendar.get(Calendar.MONTH) + 1);
tvMonth.setText(month);
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return CalendarFragment.create(position);
}
@Override
public int getCount() {
return 1000;
}
}
}
使用ViewPager实现左右“无限”滑动的万年历的更多相关文章
- ViewPager结合view无限滑动
使用viewPager进无限滑动,这里的实现是在适配器里面进行,当然在外头使用滑动监听也行. import android.support.v4.view.PagerAdapter; import a ...
- ViewPager无限滑动
2016-6-19 前言 View轮播效果在app中很常见,一想到左右滑动的效果就很容易想到使用ViewPager来实现.对于像我们常说的banner这样的效果,具备无限滑动的功能是可以用ViewPa ...
- Android使用ViewPager实现左右循环滑动及轮播效果
边界的时候会看到一个不能翻页的动画,可能影响用户体验.此外,某些区域性的ViewPager(例如展示广告或者公告之类的ViewPager),可能需要自动轮播的效果,即用户在不用滑动的情况下就能够看到其 ...
- android笔记:ViewPager实现界面的滑动
最近在学习ViewPager实现界面的滑动,拜读了郭神的博客文章,并抽取归纳了自己对ViewPager的理解. ViewPager实现界面滑动的步骤如下: 1.在xml布局内加入控件android.s ...
- Android 使用ViewPager实现左右循环滑动图片
ViewPager这个小demo实现的是可以左右循环滑动图片,下面带索引,滑到最后一页在往右滑动就要第一页,第一页往左滑动就到最后一页,先上效果图,用美女图片是我一贯的作风,呵呵 1. 首先看一 ...
- android 解决ViewPager双层嵌套的滑动问题
解决ViewPager双层嵌套的滑动问题 今天我分享一下ViewPager的双层嵌套时影响内部ViewPager的触摸滑动问题 之前在做自己的一个项目的时候,遇到广告栏图片动态切换,我第一时间想到的就 ...
- Android实战简易教程-第三十四枪(基于ViewPager和FragmentPagerAdapter实现滑动通用Tab)
上一段时间写过一篇文章<基于ViewPager实现微信页面切换效果> 里面实现了相似微信Tab的页面.可是这样的实现方法有个问题.就是以后全部的代码逻辑都必须在MainActivity中实 ...
- Android 仿美团网,探索使用ViewPager+GridView实现左右滑动查看更多分类的功能
看下效果图,自己考虑下自己会如何实现,然后再继续看看作者的实现~ 不记得什么时候,我留意到到美团网首页有使用ViewPager+GridView实现左右滑动查看更多分类的一个功能,感觉它很有趣,于是想 ...
- android 事件拦截 (Viewpager不可以左右滑动)
以前没有做过真正的需求,所以从来没有觉得事件拦截分发处理有什么好懂的. 现在做需求了,真的是什么需求都有,你作为开发都要去研究实现.比如说,只能点不能滑动的viewpager.其实这都可以不用view ...
随机推荐
- 特征提取(Detect)、特征描述(Descriptor)、特征匹配(Match)的通俗解释
特征匹配(Feature Match)是计算机视觉中很多应用的基础,比如说图像配准,摄像机跟踪,三维重建,物体识别,人脸识别,所以花一些时间去深入理解这个概念是不为过的.本文希望通过一种通俗易懂的方式 ...
- poj3696:同余方程,欧拉定理
感觉很不错的数学题,可惜又是看了题解才做出来的 题目大意:给定一个数n,找到8888....(x个8)这样的数中,满足能整除n的最小的x,若永远无法整除n 则输出0 做了这个题和后面的poj3358给 ...
- "V租房"搭建微信租房平台,让租房人发起求租需求并接收合适房源回复,提高租房效率 | 36氪
"V租房"搭建微信租房平台,让租房人发起求租需求并接收合适房源回复,提高租房效率 | 36氪 "V租房"搭建微信租房平台,让租房人发起求租需求并接收合适房源回复 ...
- paip.hadoop的应用研究总结
paip.hadoop的应用研究总结 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/attil ...
- 关于bootstrap--表单(按钮<button>效果、大小、禁用)
1.各种标签实现按钮效果: <button class="btn btn-default" type="button">button标签按钮< ...
- python标准库之字符编码详解
codesc官方地址:https://docs.python.org/2/library/codecs.html 相关帮助:http://www.cnblogs.com/huxi/archive/20 ...
- rac_进行grid自检时提示运行runfixup.sh脚本一例
原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明下面出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlo ...
- Windows系统下nodejs安装及配置
关于nodejs中文站,眼下活跃度最好的知识站应该是http://www.cnodejs.org/ ,而http://cnodejs.org/则活跃度较低.Express.js是nodejs的一个MV ...
- Javascript 文件操作(整理版)
Javascript 文件操作 一.功能实现核心:FileSystemObject 对象 其实,要在Javascript中实现文件操作功能,主要就是依靠FileSystemobject对象.在详细介绍 ...
- py爬取英文文档学习单词
最近开始看一些整本整本的英文典籍,虽然能看个大概,但是作为四级都没过的我来说还是有些吃力,总还有一部分很关键的单词影响我对句子的理解,因为看的是纸质的,所以查询也很不方便,于是想来个突击,我想把程序单 ...