当前位置: 首页 > news >正文

AnyChart 的tagCloud组件

组件渲染失败错误

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_mistake_analysis); MistakeDao mistakeDao =new MistakeDao(MistakeAnalysisActivity.this); List<String> subjectErrorlist= mistakeDao.getSubjectErrorCount(); Log.d("lxf",subjectErrorlist.toString()); anyChartView = findViewById(R.id.anycart); tagCloud = AnyChart.tagCloud(); // 绑定到 Spinner Spinner subjectspinner=findViewById(R.id.subjectSpinner); String[] grades = new String[] {"语文","数学","英语"}; ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, grades); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); subjectspinner.setAdapter(adapter); subjectspinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { String selectedSubject = parent.getItemAtPosition(position).toString(); Log.d("lxf","spinnersubject="+selectedSubject); //初始化标签云 setupAnyChart(selectedSubject,mistakeDao); } @Override public void onNothingSelected(AdapterView<?> parent) {} }); //初始化练习结果recyview rvRecord = findViewById(R.id.practicerecyview); PracticeDao dao = new PracticeDao(this); List<PracticeRecord> list = dao.queryAll(); rvRecord.setLayoutManager(new LinearLayoutManager(this)); rvRecord.setAdapter(new PracticeRecordAdapter(this,list)); } private void setupAnyChart(String subject, MistakeDao mistakeDao) { // 清空旧图表 anyChartView.clear(); tagCloud.title("错题知识点分布"); LoginManager loginManager = LoginManager.getInstance(this); int userId = loginManager.getUserId(); // 获取每个知识点对应的错题数量 List<KnowledgeCount> tags = mistakeDao.getKnowledgePointsWithCount(userId, subject); if (tags.isEmpty()) { tags.add(new KnowledgeCount("暂无数据", 1)); } // 找到最小和最大数量,用于字体和颜色映射 int minWeight = Integer.MAX_VALUE; int maxWeight = Integer.MIN_VALUE; for (KnowledgeCount item : tags) { int count = item.getCount(); if (count < minWeight) minWeight = count; if (count > maxWeight) maxWeight = count; } if (minWeight == maxWeight) { minWeight = 1; maxWeight = minWeight + 10; } List<DataEntry> data = new ArrayList<>(); for (KnowledgeCount item : tags) { int weight = item.getCount(); // 用实际数量控制字体大小 String tag = item.getKnowledgePoint(); // 知识点名称 // 颜色渐变(红色系深浅) int red = 255; int green = 100 + (int)((255 - 100) * (maxWeight - weight) / (float)(maxWeight - minWeight)); int blue = 100 + (int)((255 - 100) * (maxWeight - weight) / (float)(maxWeight - minWeight)); String color = String.format("#%02X%02X%02X", red, green, blue); ValueDataEntry entry = new ValueDataEntry(tag, weight); entry.setValue("color", color); data.add(entry); } tagCloud.angles(new Integer[]{0}); // 水平显示 tagCloud.textSpacing(5); tagCloud.animation(true); // 平滑动画 tagCloud.data(data); anyChartView.setChart(tagCloud); }

问题1:anyChartView.clear();TagCloud 的配置刚初始化就被打断了

问题2:

tagCloud = AnyChart.tagCloud(); tagCloud.title("错题知识点分布"); tagCloud.angles(new Integer[]{0}); tagCloud.textSpacing(5); tagCloud.animation(true); anyChartView.setChart(tagCloud);

每次更新spinner都要更新渲染配置,由于渲染是data没准备好,导致渲染失败

修正后

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_mistake_analysis); MistakeDao mistakeDao =new MistakeDao(MistakeAnalysisActivity.this); List<String> subjectErrorlist= mistakeDao.getSubjectErrorCount(); // 初始化 AnyChartView 和 TagCloud(只创建一次) anyChartView = findViewById(R.id.anycart); tagCloud = AnyChart.tagCloud(); tagCloud.title("错题知识点分布"); tagCloud.angles(new Integer[]{0}); tagCloud.textSpacing(5); tagCloud.animation(true); anyChartView.setChart(tagCloud); // 绑定到 Spinner Spinner subjectspinner=findViewById(R.id.subjectSpinner); String[] grades = new String[] {"语文","数学","英语"}; ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, grades); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); subjectspinner.setAdapter(adapter); subjectspinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { String selectedSubject = parent.getItemAtPosition(position).toString(); Log.d("lxf","spinnersubject="+selectedSubject); setupAnyChart(selectedSubject,mistakeDao); } @Override public void onNothingSelected(AdapterView<?> parent) {} }); } // TagCloud 刷新方法(只更新数据,不创建新实例) private void setupAnyChart(String subject, MistakeDao mistakeDao) { LoginManager loginManager = LoginManager.getInstance(this); int userId = loginManager.getUserId(); List<KnowledgeCount> tags = mistakeDao.getKnowledgePointsWithCount(userId, subject); if (tags.isEmpty()) { tags.add(new KnowledgeCount("暂无数据", 1)); } // 找到最小和最大数量,用于字体和颜色映射 int minWeight = Integer.MAX_VALUE; int maxWeight = Integer.MIN_VALUE; for (KnowledgeCount item : tags) { int count = item.getCount(); if (count < minWeight) minWeight = count; if (count > maxWeight) maxWeight = count; } if (minWeight == maxWeight) { minWeight = 1; maxWeight = minWeight + 10; } List<DataEntry> data = new ArrayList<>(); for (KnowledgeCount item : tags) { int weight = item.getCount(); String tag = item.getKnowledgePoint(); // 红色渐变 int red = 255; int green = 100 + (int) ((255 - 100) * (maxWeight - weight) / (float) (maxWeight - minWeight)); int blue = 100 + (int) ((255 - 100) * (maxWeight - weight) / (float) (maxWeight - minWeight)); String color = String.format("#%02X%02X%02X", red, green, blue); ValueDataEntry entry = new ValueDataEntry(tag, weight); entry.setValue("color", color); data.add(entry); } tagCloud.data(data); }
http://www.jsqmd.com/news/643988/

相关文章:

  • 别再让电源振荡了!手把手教你给UC3842加斜坡补偿(附计算步骤)
  • 3步解决乐谱数字化难题:Audiveris OMR引擎从图像到可编辑乐谱的完整实践指南
  • 【从0到1构建一个ClaudeAgent】规划与协调-任务系统
  • 2026年好用的高精度线材轧机推荐,企业选择探讨 - myqiye
  • 基于Qwen3.5-2B的MySQL智能运维助手:安装配置与性能调优
  • 从PRT到STP:除了批量转换,工程师更该关心的数据完整性与版本管理
  • StructBERT在不同行业术语下的相似度计算适应性展示
  • AI 名片的核心功能拆解:哪些功能是企业真正需要的?(避坑指南)
  • 2026商务出行平台推荐:企业差旅痛点分析与数字化解决方案 - 匠言榜单
  • 如何通过手机号找回QQ号:3分钟快速解决方案
  • 2/3英寸靶面工业镜头配置全攻略:如何用25mm焦距实现0.05mm检测精度
  • 3步解决Windows多语言软件兼容性问题:Locale Emulator完全指南
  • 三步搞定Windows语音转文字:免费离线神器深度解析
  • RoadRunner场景建模避坑指南:从FBX模型导入到Simulink联合仿真全流程解析
  • 武汉佰利和建筑防水工程有限公司:武汉防水维修电话 - LYL仔仔
  • 3个维度重新定义SillyTavern:从技术工具到情感伙伴的进化之路
  • PyTorch 2.8通用镜像惊艳效果:RTX 4090D跑Llama3-70B推理延迟实测分享
  • 3步解锁网易云音乐:ncmdump让NCM格式文件随处播放
  • 终极Windows 11安装指南:MediaCreationTool.bat让老旧电脑轻松升级
  • 2026年实测10款硬核论文降AI工具:高效降低AI率,AI率降至6% - 降AI实验室
  • 别再混淆了!5分钟搞懂ARM Cortex-M的异常、中断、NVIC和向量表到底啥关系
  • <项目代码>yolo 胸部X光疾病识别<目标检测>
  • 如何找到靠谱的大润发购物卡回收渠道? - 团团收购物卡回收
  • 西门子S7-1200 PLC博途全方位学习包
  • LLM核心参数配置指南:基础篇 - AI
  • intv_ai_mk11开源模型优势:Apache 2.0协议商用友好,支持商业闭源集成与白标定制
  • 突破光学装配瓶颈,DTAS 3D公差分析及尺寸链计算-光线装配赋能精密制造
  • 有源晶振与温度补偿晶振的应用与优势分析
  • 2026年室内装修公司选择支招,推荐靠谱的家装公司哪家强 - 工业品网
  • 3分钟搞定魔兽争霸III终极优化:免费解决宽屏、卡顿与地图加载问题