热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

android实现切换日期左右无限滑动效果

本篇内容给大家分享了android开发时候实现自定义的日期无限左右滑动效果以及控件使用的技巧。

大家在进行安卓开发的时候,经常用到日期比如在课程安排,工作安排,日志等地方,今天给大家带来的是让日期左右无限的滑动,并支持自定义显示效果的方法。一起来学习下。

以上是本次所要达到的效果

使用说明:

XML布局

新建XML布局

RecyclerView的layout_behavior为com.ldf.calendar.behavior.RecyclerViewBehavior


 
    
    
 
    
 
  

自定义日历样式
新建CustomDayView继承自DayView并重写refreshContent 和 copy 两个方法

@Override
  public void refreshContent() {
    //你的代码 你可以在这里定义你的显示规则
    super.refreshContent();
  }
 
  @Override
  public IDayRenderer copy() {
    return new CustomDayView(context , layoutResource);
  }

新建CustomDayView实例,并作为参数构建CalendarViewAdapter

CustomDayView customDayView = new CustomDayView(
      context , R.layout.custom_day);
  calendarAdapter = new CalendarViewAdapter(
        context ,
        onSelectDateListener ,
        Calendar.MONTH_TYPE ,
        customDayView);

初始化View
目前来看 相比于Dialog选择日历 我的控件更适合于Activity/Fragment在Activity的onCreate 或者Fragment的onCreateView 你需要实现这两个方法来启动日历并装填进数据

@Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_syllabus);
    initCalendarView();
  }
  
  private void initCalendarView() {
    initListener();
    CustomDayView customDayView = new CustomDayView(
      context , R.layout.custom_day);
    calendarAdapter = new CalendarViewAdapter(
        context ,
        onSelectDateListener ,
        Calendar.MONTH_TYPE ,
        customDayView);
    initMarkData();
    initMonthPager();
  }

使用此方法回调日历点击事件

private void initListener() {
    OnSelectDateListener= new OnSelectDateListener() {
      @Override
      public void onSelectDate(CalendarDate date) {
        //your code
      }
 
      @Override
      public void onSelectOtherMonth(int offset) {
        //偏移量 -1表示上一个月 , 1表示下一个月
        monthPager.selectOtherMonth(offset);
      }
    };
  }

使用此方法初始化日历标记数据

private void initMarkData() {
    HashMap markData = new HashMap<>();
    //1表示红点,0表示灰点
    markData.put("2017-8-9" , "1");
    markData.put("2017-7-9" , "0");
    markData.put("2017-6-9" , "1");
    markData.put("2017-6-10" , "0");
    calendarAdapter.setMarkData(markData);
  }

使用此方法给MonthPager添加上相关监听

monthPager.addOnPageChangeListener(new MonthPager.OnPageChangeListener() {
      @Override
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
      }
 
      @Override
      public void onPageSelected(int position) {
        mCurrentPage = position;
        currentCalendars = calendarAdapter.getAllItems();
        if(currentCalendars.get(position % currentCalendars.size()) instanceof Calendar){
          //you code
        }
      }
 
      @Override
      public void onPageScrollStateChanged(int state) {
      }
    });

重写onWindowFocusChanged方法,使用此方法得知calendar和day的尺寸

 @Override
  public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if(hasFocus && !initiated) {
      CalendarDate today = new CalendarDate();
      calendarAdapter.notifyDataChanged(today);
      initiated = true;
    }
  }
Download

Gradle: Step 1. Add it in your root build.gradle at the end of repositories:

allprojects {
  repositories {
  ...
  maven { url 'https://www.jitpack.io' }
  }
}
Step 2. Add the dependency

  dependencies {
      compile 'com.github.MagicMashRoom:SuperCalendar:v1.3.1'
  }

以上就是本次效果所用到的所有代码和说明,大家有任何问题可以在下方的留言地方讨论。


推荐阅读
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 资源推荐 | TensorFlow官方中文教程助力英语非母语者学习
    来源:机器之心。本文详细介绍了TensorFlow官方提供的中文版教程和指南,帮助开发者更好地理解和应用这一强大的开源机器学习平台。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文介绍如何使用 Sortable.js 库实现元素的拖拽和位置交换功能。Sortable.js 是一个轻量级、无依赖的 JavaScript 库,支持拖拽排序、动画效果和多种插件扩展。通过简单的配置和事件处理,可以轻松实现复杂的功能。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 如何在WPS Office for Mac中调整Word文档的文字排列方向
    本文将详细介绍如何使用最新版WPS Office for Mac调整Word文档中的文字排列方向。通过这些步骤,用户可以轻松更改文本的水平或垂直排列方式,以满足不同的排版需求。 ... [详细]
  • 本文总结了在使用Ionic 5进行Android平台APK打包时遇到的问题,特别是针对QRScanner插件的改造。通过详细分析和提供具体的解决方法,帮助开发者顺利打包并优化应用性能。 ... [详细]
author-avatar
lmaster
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有