ListView的扩展

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天的今天比较完善的提交测试了。什么都没有,只是平凡的生活中一个很小的标注。独立开发、基础知识、完善的编码风格、从零到一的构建,技术点的检核也还算不错的。所以,反思、优化~~


谁的青春不迷茫,谁的未来是肯定?!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

壹叁零壹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值