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); }