1,CarlendarListview
将每个月时间按照ListView Item展示,能够提供时间滚动的控件。GitHub原始地址:https://github.com/traex/CalendarListview 【转载】
展示效果如图:
存在的弱点:不能回显当前时间之前的时间。
修改:
SimpleMonthAdapter:设置时间的起始点
<span style="font-size:18px;"> public SimpleMonthAdapter(Context context, DatePickerController datePickerController, TypedArray typedArray) {
this.typedArray = typedArray;
calendar = Calendar.getInstance();
<span style="background-color: rgb(255, 153, 255);"> int year = new CalendarDay(System.currentTimeMillis()).year - 3;//修改,设置新的开始时间
calendar.set(year, 1, 1);</span>
firstMonth = typedArray.getInt(R.styleable.DayPickerView_firstMonth, calendar.get(Calendar.MONTH));
lastMonth = typedArray.getInt(R.styleable.DayPickerView_lastMonth, (calendar.get(Calendar.MONTH) - 1) % MONTHS_IN_YEAR);
selectedDays = new SelectedDays<>();
mContext = context;
mController = datePickerController;
init();
}</span>
getItemCount:设置返回Item的个数
<span style="font-size:18px;"> @Override
public int getItemCount() {
int itemCount = (((mController.getMaxYear() - calendar.get(Calendar.YEAR)) + 1) * MONTHS_IN_YEAR);
if (firstMonth != -1)
itemCount -= firstMonth;
if (lastMonth != -1)
itemCount -= (MONTHS_IN_YEAR - lastMonth) - 1;
<span style="background-color: rgb(255, 153, 255);"> if (itemCount < 0) {//设置当开始时间晚于当前时间,返回正确的Item个数
itemCount = -itemCount;
}</span>
return itemCount;
}</span>
为了适应整个View的动态变化,在设置最大年限时,进行修改:【使用地方:MainActivity】
<span style="font-size:18px;"> @Override
public int getMaxYear() {
<span style="background-color: rgb(255, 153, 255);"> return Calendar.YEAR;//动态变化,修改手机系统时间,依旧可以显示</span>
}</span>
修改后的源码地址:我在这里哦\(^o^)/~当前控件可以实现先选后面的时间,再选前面的时间,onDayOfMonthSelected中可以获取每一次有效点击的返回值;onDateRangeSelected中可以获取到设定好后的开始时间和结束时间。
<span style="font-size:18px;"> @Override
public void onDayOfMonthSelected(int year, int month, int day) {
Log.e("Day Selected", day + " / " + month + " / " + year);
}
@Override
public void onDateRangeSelected(SimpleMonthAdapter.SelectedDays<SimpleMonthAdapter.CalendarDay> selectedDays) {
Log.e("Date range selected", selectedDays.getFirst().toString() + " --> " + selectedDays.getLast().toString());
}</span>
【不完善】
当前方法还是不太完善,不能从心所欲控制时间的范围,还不能设置初始值,带入ListView的特点,需要后续继续优化。
2,ExpandListView
ListView的优化主要包含:
继承BaseAdapter,流程化适配器的实现;
ViewHolder的使用;
ConvertView的重复使用;
在ListView的扩展中还包含有:
多种类型的ItemView,分组实现,返回顶部的控制,ListView头部展示,分组Title悬浮展示。
开源项目:https://github.com/singwhatiwanna/PinnedHeaderExpandableListView
实现ListView添加头部图标,并随着滑动可隐藏;分组Item,并悬浮当前Item组的标题栏,如图所示:
开源项目是Eclipse项目,转换成为AS项目:我在这里哦\(^o^)/~
为ListView添加滑动监听事件,可实现直接返回顶部。
goodsDetailLv.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
// 当不滚动时
case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:// 是当屏幕停止滚动时
scrollFlag = false;
// 判断滚动到底部
if (goodsDetailLv.getLastVisiblePosition() == (goodsDetailLv
.getCount() - 1)) {
goBackToTop.setVisibility(View.VISIBLE);
}
// 判断滚动到顶部
if (goodsDetailLv.getFirstVisiblePosition() == 0) {
goBackToTop.setVisibility(View.GONE);
}
break;
case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:// 滚动时
scrollFlag = true;
break;
case AbsListView.OnScrollListener.SCROLL_STATE_FLING:// 是当用户由于之前划动屏幕并抬起手指,屏幕产生惯性滑动时
scrollFlag = false;
break;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
});
3,给自己一点启示
Android学习中,最开始是使用最基本的控件:TextView,EditText等。之后是将控件进行组合,实现更多效果,及进行代码的复用。试着写过几个自己的自定义控件,并没有实际的理解其深层次的原理。如历史回顾一样,基础的东西还需要强化。现在能够更多的应用开源项目,逐步去修改控件适用于新的需求,到最后自己实现更多的开源框架。这里搜罗了很多的开源项目,希望自己更快速地前进。
最近,很多事情夹杂在一起,心中依旧有点迷茫。不过很高兴的是,15个主类,平均每个主类包含布局、bean、适配器、网络请求1300多行代码的App在10天的今天比较完善的提交测试了。什么都没有,只是平凡的生活中一个很小的标注。独立开发、基础知识、完善的编码风格、从零到一的构建,技术点的检核也还算不错的。所以,反思、优化~~
谁的青春不迷茫,谁的未来是肯定?!