返回顶部
首页 > 资讯 > 精选 >RecyclerChart动态属性图标联动数据动态加载怎么实现
  • 695
分享到

RecyclerChart动态属性图标联动数据动态加载怎么实现

2023-07-05 08:07:39 695人浏览 安东尼
摘要

本篇内容介绍了“RecyclerChart动态属性图标联动数据动态加载怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!图表联动类似于股

本篇内容介绍了“RecyclerChart动态属性图标联动数据动态加载怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

图表联动

类似于股票的K线跟底部成交量Barchat图表,这里也是上下两个Chart图表,笔者在写到这里的时候,突然间有个大胆的想法,就是完全可以在一个Chart里去绘制上下两部分的数据展现,这样的话也不会存在两个图表联动的问题,同时可能会因为少了一个Chart,性能更好。

好了,这里先讲目前的实现方式。MPAndroidChart中的两个上下两个图表也可以实现连动的方式实现,通过OnChartGestureListener接口实现。因为RecyclerChart是基于Recyclerview 实现的,所以其实只需实现两个Recylcerview的联动即可。

如下在recyclerBarChart 的滑动监听中 同步处理recyclerLineChart的滑动,同样包括回溯的滑动。

recyclerBarChart.addOnScrollListener(new RecyclerView.OnScrollListener() {  private boolean isRightScrollInner;  @Override  public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {    super.onScrollStateChanged(recyclerView, newState);    if (newState == RecyclerView.SCROLL_STATE_IDLE) {      ....      //回溯      if (mBarChartAttrs.enableScrollToScale) {        int scrollToByDx = ChartComputeUtil.computeScrollByXOffset(recyclerView, displayNumber, getXAxisType());        recyclerView.scrollBy(scrollToByDx, 0);        recyclerLineChart.scrollBy(scrollToByDx, 0);      }      .....    }  }  @Override  public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {    super.onScrolled(recyclerView, dx, dy);    //判断左滑,右滑时,ScrollView的位置不一样。    isRightScrollInner = dx < 0;    if (recyclerBarChart.getScrollState() != RecyclerView.SCROLL_STATE_IDLE) {      mItemGestureListener.resetSelectedBarEntry();//清除recyclerLineChart的长按。      recyclerLineChart.scrollBy(dx, dy);    }  }});

同样的,在线性表 recyclerLineChart 的滑动监听里需要同步处理recyclerBarChart的滑动,代码类似。

数据动态加载

其实类似于分页加载数据,跟纵向vertical加载类似,这里是横向horizontal处理的,同样在上面的监听的Listener里面处理 当条件 !

recyclerView.canScrollHorizontally(-1) 左滑不动,加载数据到左边,这里LayoutManager因为 reverse的,所以是 DataList.addAll(list);

当!recyclerView.canScrollHorizontally(1) 右滑不动是,DataList.addAll(0, list)

@Overridepublic void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {  super.onScrollStateChanged(recyclerView, newState);  if (newState == RecyclerView.SCROLL_STATE_IDLE) {    //加载更多    if (!recyclerView.canScrollHorizontally(-1) && isRightScrollInner) {//左滑不动      loadData(updateUI(start))    } else if (!recyclerView.canScrollHorizontally(1)) {//右滑不动      loadData(updateUI(end))    }  }}

回溯

这里先介绍一下实现方案:笔者在构建Entry的时候埋了一个type的钩子,当Entry属于日周月视图的边界,比如日视图的0点,周视图的周一,月视图的1号,通常情况下是这个Item的左边界;但是当RTL时需要特殊处理。

第二,当停下来的时候,遍历当前屏幕显示的Items时,当不对齐的时候,这里必定存在一个上述提到的特殊边界的Item,计算它到Chart边界的(不包含Xais)的距离,存到一个DistanceCompare的对象中。

第三, 在RecyclerView松手Fling停止的时候,计算上面的DistanceCompare对象中的,distanceLeft、distanceRight; 根据 isNearLeft() 去判断是向左,还是向右回弹,isNearLeft() true 向左,否则向右。

//月线靠近左边public boolean isNearLeft(){    return distanceLeft < distanceRight;}//计算 DistanceCompare private static <T extends RecyclerBarEntry> DistanceCompare findDisplayFirstTypePosition(RecyclerView recyclerView, int displayNumbers) {  LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();  DistanceCompare distanceCompare = new DistanceCompare(0, 0);  BaseBarChartAdapter adapter = (BaseBarChartAdapter) recyclerView.getAdapter();  if (null == manager || null == adapter) {    return distanceCompare;  }  List<T> entries = adapter.getEntries();  int firstVisibleItemPosition = manager.findFirstVisibleItemPosition();  int position = firstVisibleItemPosition; //从右边的第一个View开始找  int parentRight = recyclerView.getWidth() - recyclerView.getPaddingRight();  int parentLeft = recyclerView.getPaddingLeft();  for (int i = 0; i < displayNumbers; i++) {    if (i > 0) {      position++;    }    if (position >= 0 && position < entries.size()) {      T barEntry = entries.get(position);      if (barEntry.type == RecyclerBarEntry.TYPE_XAXIS_FIRST || barEntry.type == RecyclerBarEntry.TYPE_XAXIS_SPECIAL) {        distanceCompare.position = position;        View positionView = manager.findViewByPosition(position);        if (null != positionView){          int viewLeft = positionView.getLeft();          int viewRight = positionView.getRight();          distanceCompare.distanceRight = parentRight - viewRight;          distanceCompare.distanceLeft = viewLeft - parentLeft;        }        distanceCompare.setBarEntry(barEntry);        break;      }    }  }  return distanceCompare;}

根据 distanceCompare 计算 scrollByXOffset:简单的数学计算,不过需要仔细。

public static <T extends RecyclerBarEntry> int computeScrollByXOffset(RecyclerView recyclerView, int displayNumbers, int type) {  DistanceCompare distanceCompare = findDisplayFirstTypePosition(recyclerView, displayNumbers);  LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();  BaseBarChartAdapter adapter = (BaseBarChartAdapter) recyclerView.getAdapter();  if (null == adapter) {  return 0;  }  List<T> entries = adapter.getEntries();  int positionCompare = distanceCompare.position;  //T entry = entries.get(positionCompare);  View compareView = manager.findViewByPosition(positionCompare);  if (null == compareView) {  return 0;  }  int compareViewRight = compareView.getRight();  int compareViewLeft = compareView.getLeft();  int childWidth = compareView.getWidth();  int parentLeft = recyclerView.getPaddingLeft();  int parentRight = recyclerView.getWidth() - recyclerView.getPaddingRight();  int scrollByXOffset;  if (distanceCompare.isNearLeft()) {  //靠近左边,content左移,recyclerView右移,取正。  //情况 1.  int distance = AppUtils.isRTLDirection() ? compareViewLeft - parentLeft     : compareViewRight - parentLeft;//原始调整距离  if (positionCompare < displayNumbers + 1) {    //防止 positionCompare过大,计算firstViewRight时,int越界  int firstViewRight = compareViewRight + positionCompare * childWidth;  int distanceRightBoundary = Math.abs(firstViewRight - parentRight);//右边界  if (distanceRightBoundary < distance) { //content左移不够,顶到头,用distanceRightBoundary  distance = distanceRightBoundary;  }  }  scrollByXOffset = distance;  } else {//靠近右边,content右移,recyclerView左移,取负。  int distance = AppUtils.isRTLDirection()?parentRight - compareViewLeft :     parentRight - compareViewRight;//原始调整距离  if (entries.size() - positionCompare < displayNumbers) {  //这个值会为负的。  int lastViewLeft = compareViewLeft - (entries.size() - 1 - positionCompare) * childWidth;  int distanceLeftBoundary = Math.abs(parentLeft - lastViewLeft);    //右边 - 左边,因为 lastViewLeft是负值,实际上是两值相加。  if (distanceLeftBoundary < distance) {//content右移不够,顶到头,distanceLeftBoundary  distance = distanceLeftBoundary;  }  }  //记得取负, scrollBy的话f  scrollByXOffset = distance - 2 * distance;  }  return scrollByXOffset;}

最终也在onScrollStateChanged 实现回溯:

@Overridepublic void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {  super.onScrollStateChanged(recyclerView, newState);  if (newState == RecyclerView.SCROLL_STATE_IDLE) {    .....    //回溯    if (mBarChartAttrs.enableScrollToScale) {      int scrollToByDx = ChartComputeUtil.computeScrollByXOffset(        recyclerView, displayNumber, getXAxisType());      recyclerView.scrollBy(scrollToByDx, 0);      recyclerLineChart.scrollBy(scrollToByDx, 0);    }    ......  }}

“RecyclerChart动态属性图标联动数据动态加载怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: RecyclerChart动态属性图标联动数据动态加载怎么实现

本文链接: https://lsjlt.com/news/350464.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • RecyclerChart动态属性图标联动数据动态加载怎么实现
    本篇内容介绍了“RecyclerChart动态属性图标联动数据动态加载怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!图表联动类似于股...
    99+
    2023-07-05
  • RecyclerChart动态属性图标联动数据动态加载详解
    目录正文图表联动数据动态加载回溯正文 本章节继上一章节中相关的动态属性作介绍,主要讲述三个功能实现点,第一个是上下图表联动问题,类似于股票软件K线上面的Candle图跟下边的MAC...
    99+
    2023-03-02
    RecyclerChart动态属性 RecyclerChart图标联动 RecyclerChart数据动态加载
  • java实现动态编译并动态加载
    在D盘test目录下有个java文件:AlTest.java public class AlTest { public String sayHello(){ System...
    99+
    2024-04-02
  • java对象动态增加属性怎么实现
    在Java中,对象的属性通常是在编译时确定的,无法在运行时动态地增加属性。然而,可以通过使用Java的反射机制来实现动态增加属性的效...
    99+
    2023-10-12
    java
  • Ajax如何实现动态加载数据
    这篇文章给大家分享的是有关Ajax如何实现动态加载数据的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。这个随笔实现了一个Ajax动态加载的例子。使用.net 的MVC框架实现。这个例子重点在前后台交互,其它略写。开...
    99+
    2023-06-08
  • ajax怎么动态加载json数据
    这篇文章将为大家详细讲解有关ajax怎么动态加载json数据,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。jsp代码<form >   姓...
    99+
    2023-06-08
  • javascript下拉框动态加载数据怎么实现
    可以使用Ajax技术来实现JavaScript下拉框动态加载数据。步骤如下:1. 定义一个下拉框元素,例如:```html```2....
    99+
    2023-05-30
    javascript下拉框 javascript
  • springboot动态加载类怎么实现
    要实现Spring Boot动态加载类,可以使用以下步骤: 创建一个ClassLoader对象,用于动态加载类。可以使用URLC...
    99+
    2023-10-25
    springboot
  • js实现动态加载数据瀑布流
    本文实例为大家分享了js实现动态加载数据瀑布流的具体代码,供大家参考,具体内容如下 实现的功能 1.每次下拉到底部会自动加载下一页的数据2.图片逐渐显示 首先html <!DO...
    99+
    2024-04-02
  • Ajax中怎么动态加载数据库
    这期内容当中小编将会给大家带来有关Ajax中怎么动态加载数据库,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。代码如下:<!DOCTYPE html PUBLIC &...
    99+
    2024-04-02
  • 利用Java如何实现动态加载数据库驱动
    利用Java如何实现动态加载数据库驱动?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。代码实现在此只例出核心代码,就是动态加载数据库驱动的类,只是此处暂时没有考虑到数据库连接池的...
    99+
    2023-05-31
    java 动态加载 驱动
  • Vue动态添加属性到data的实现
    目录一、场景例子二、原理分析三、解决方案一、场景例子 <body> <div id="app"> <p v-for="(valu...
    99+
    2022-11-13
    Vue 动态添加属性 Vue 添加属性
  • Angular.js怎么实现动态加载组件
    小编给大家分享一下Angular.js怎么实现动态加载组件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言有时候需要根据URL...
    99+
    2024-04-02
  • java实现动态编译并动态加载的方法
    小编给大家分享一下java实现动态编译并动态加载的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在D盘test目录下有个java文件:AlTest.javap...
    99+
    2023-06-14
  • JAVA怎么动态给实体类添加属性
    在Java中,实体类是由属性和方法组成的对象。通常情况下,我们在定义实体类时会给出固定的属性。但是有时候,我们需要在运行时动态地给实...
    99+
    2023-09-26
    JAVA
  • iscroll如何动态加载数据
    这篇文章将为大家详细讲解有关iscroll如何动态加载数据,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下<div id="wrapp...
    99+
    2024-04-02
  • Android实现ListView数据动态加载的方法
    本文实例讲述了Android实现ListView数据动态加载的方法。分享给大家供大家参考,具体如下: list.setOnScrollListener(new OnScrol...
    99+
    2022-06-06
    方法 listview 动态 Android
  • VB.NET动态属性怎么用
    这篇文章主要为大家展示了“VB.NET动态属性怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“VB.NET动态属性怎么用”这篇文章吧。Visual Basic .NET支持动态属性,其动态属...
    99+
    2023-06-17
  • VUE中怎么实现路由动态加载
    VUE中怎么实现路由动态加载,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。首先新建vue工程,一般我们不会特殊处理路由,但当项目页面越来越多,...
    99+
    2024-04-02
  • js实现瀑布流触底动态加载数据
    本文实例为大家分享了js实现瀑布流触底动态加载数据的具体代码,供大家参考,具体内容如下 // onScrollEvent 滚动条事件 <div class="box" ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作