package cn.flightfeather.thirdapp.dataanalysis;
|
|
|
import android.app.Fragment;
|
import android.content.Context;
|
import android.graphics.Color;
|
import android.icu.text.DecimalFormat;
|
import android.os.Build;
|
import android.os.Bundle;
|
import android.support.annotation.Nullable;
|
import android.support.annotation.RequiresApi;
|
import android.support.v7.widget.DividerItemDecoration;
|
import android.support.v7.widget.LinearLayoutManager;
|
import android.support.v7.widget.RecyclerView;
|
import android.view.LayoutInflater;
|
import android.view.View;
|
import android.view.ViewGroup;
|
|
import com.github.mikephil.charting.animation.Easing;
|
import com.github.mikephil.charting.charts.PieChart;
|
import com.github.mikephil.charting.components.Legend;
|
import com.github.mikephil.charting.data.PieData;
|
import com.github.mikephil.charting.data.PieDataSet;
|
import com.github.mikephil.charting.data.PieEntry;
|
import com.github.mikephil.charting.formatter.PercentFormatter;
|
import com.github.mikephil.charting.utils.ColorTemplate;
|
|
import java.util.ArrayList;
|
import java.util.Collections;
|
import java.util.Comparator;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Objects;
|
|
import butterknife.BindView;
|
import butterknife.ButterKnife;
|
import butterknife.Unbinder;
|
import cn.flightfeather.thirdapp.R;
|
import cn.flightfeather.thirdapp.adapter.AllRecyclerViewAdapter;
|
import cn.flightfeather.thirdapp.bean.vo.ProblemlistVo;
|
import cn.flightfeather.thirdapp.bean.vo.TaskVo;
|
|
/**
|
* 2018.11.14
|
* @author riku
|
* 顶层任务的问题类型统计
|
*/
|
public class ProblemDetailFragment extends Fragment {
|
|
private Context context;
|
|
private static final String ARG_PARAM1 = "taskProgressVo";//参数标签
|
|
private TaskVo taskProgressVo;//需要activity传入一个具体的顶层任务对象,用于显示其详细进度信息
|
|
private Unbinder unbinder;
|
|
|
public ProblemDetailFragment() {
|
// Required empty public constructor
|
}
|
|
public static ProblemDetailFragment newInstance(TaskVo taskProgressVo) {
|
ProblemDetailFragment fragment = new ProblemDetailFragment();
|
Bundle args = new Bundle();
|
args.putSerializable(ARG_PARAM1, taskProgressVo);
|
fragment.setArguments(args);
|
return fragment;
|
}
|
|
@Override
|
public void onCreate(Bundle savedInstanceState) {
|
super.onCreate(savedInstanceState);
|
if (getArguments() != null) {
|
taskProgressVo = (TaskVo) getArguments().getSerializable(ARG_PARAM1);
|
}
|
}
|
|
@Override
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
Bundle savedInstanceState) {
|
View view = inflater.inflate(R.layout.fragment_analysis_problem_1, container, false);
|
unbinder = ButterKnife.bind(this, view);
|
return view;
|
}
|
|
|
@RequiresApi(api = Build.VERSION_CODES.N)
|
@Override
|
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
|
super.onViewCreated(view, savedInstanceState);
|
context = getActivity();
|
initPieChart(view);
|
initRecyclerView(view);
|
}
|
|
@Override
|
public void onDestroyView() {
|
super.onDestroyView();
|
unbinder.unbind();
|
}
|
|
//<editor-fold desc="初始化饼图以及对应的列表">
|
private List<ProblemlistVo> problemlists;//问题列表
|
private ArrayList<PieEntry> entries = new ArrayList<>();//饼图数据
|
private AllRecyclerViewAdapter<PieEntry> entryAdapter = null;//list列表适配器(问题统计数据)
|
private final static int MAX_CHART_COUNT = 20; //饼图最多显示区块数
|
private final static String REMAIN_PROBLEM = "其余";
|
|
@BindView(R.id.rv_problem_type)
|
RecyclerView rv_problem_type;
|
|
@BindView(R.id.PC_problem)
|
PieChart mChart;
|
|
/**
|
* 问题类型分布的列表
|
* @param view 问题类型分布fragment
|
*/
|
@RequiresApi(api = Build.VERSION_CODES.N)
|
private void initRecyclerView(View view) {
|
final DecimalFormat decimalFormat = new DecimalFormat("#0.00");
|
rv_problem_type = (RecyclerView) view.findViewById(R.id.rv_problem_type);
|
entryAdapter = new AllRecyclerViewAdapter<PieEntry>(entries, R.layout.item_day_task_progress, context) {
|
@Override
|
public void bindView(AllRecyclerViewAdapter.MyViewHolder holder, PieEntry obj, boolean bool, int position) {
|
float total = 0;
|
for (PieEntry entry : entries) {
|
total = total + entry.getValue();
|
}
|
holder.setText(R.id.tv_item1, entries.get(position).getLabel())
|
.setText(R.id.tv_item2, entries.get(position).getValue() + "")
|
.setText(R.id.tv_item3, decimalFormat.format(entries.get(position).getValue()/ total * 100) + "%");
|
}
|
};
|
|
LinearLayoutManager layoutManager = new LinearLayoutManager(context);
|
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
|
rv_problem_type.setLayoutManager(layoutManager);
|
rv_problem_type.addItemDecoration(new DividerItemDecoration(context, DividerItemDecoration.VERTICAL));
|
rv_problem_type.setAdapter(entryAdapter);
|
}
|
|
private void initPieChart(View view) {
|
|
//饼图样式设置***************************************************************************************************
|
mChart.setUsePercentValues(true);
|
mChart.getDescription().setEnabled(false);
|
mChart.setExtraOffsets(5, 10, 5, 5);
|
// mChart.setExtraOffsets(20.f, 0.f, 20.f, 0.f);
|
|
mChart.setDragDecelerationFrictionCoef(0.95f);
|
|
// mChart.setCenterTextTypeface(mTfLight);
|
// mChart.setCenterText(generateCenterSpannableText());
|
|
mChart.setDrawHoleEnabled(true);
|
mChart.setHoleColor(Color.WHITE);
|
|
mChart.setTransparentCircleColor(Color.WHITE);
|
mChart.setTransparentCircleAlpha(110);
|
|
mChart.setHoleRadius(39f);
|
mChart.setTransparentCircleRadius(41f);
|
|
mChart.setDrawCenterText(true);
|
|
mChart.setRotationAngle(0);
|
// enable rotation of the chart by touch
|
mChart.setRotationEnabled(true);
|
mChart.setHighlightPerTapEnabled(true);
|
|
Legend l = mChart.getLegend();
|
l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
|
l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
|
l.setOrientation(Legend.LegendOrientation.VERTICAL);
|
l.setDrawInside(false);
|
l.setXEntrySpace(7f);
|
l.setYEntrySpace(0f);
|
l.setYOffset(0f);
|
|
// entry label styling
|
mChart.setEntryLabelColor(Color.WHITE);
|
// mChart.setEntryLabelTypeface(mTfRegular);
|
mChart.setEntryLabelTextSize(12f);
|
mChart.setDrawEntryLabels(false);
|
|
//test
|
// setData(new ArrayList<ProblemlistVo>());
|
//
|
|
}
|
|
private void setData(List<ProblemlistVo> problemlists) {
|
//数据初始化***************************************************************************************************
|
entries.clear();
|
|
PieDataSet dataSet = new PieDataSet(entries, "问题类型");
|
|
//test*****
|
// int count = 5;
|
// int mult = 100;
|
// String[] mParties = {"路面积尘", "地面局部未硬化", "站厂出入口无外围护", "无喷淋装置", REMAIN_PROBLEM};
|
// for (int i = 0; i < count; i++) {
|
// entries.add(new PieEntry((int) (Math.random() * mult) + mult / 5, mParties[i]));
|
// }
|
//*********
|
|
//初始化数据
|
HashMap<String, Integer> problemTypeMap = new HashMap<>();
|
while (!problemlists.isEmpty()) {
|
String problemType = problemlists.get(0).getTypename();
|
if (problemType == null) {
|
problemlists.remove(0);
|
continue;
|
}
|
|
int problemCount = 0;
|
for (int i = 0; i < problemlists.size(); i++) {
|
if (Objects.equals(problemType, problemlists.get(i).getTypename())) {
|
problemCount++;
|
problemlists.remove(i);
|
i--;
|
}
|
}
|
problemTypeMap.put(problemType, problemCount);
|
}
|
//按HashMap的value降序排序
|
List<HashMap.Entry<String, Integer>> list = new ArrayList<>(problemTypeMap.entrySet());
|
Collections.sort(list, new Comparator<HashMap.Entry<String, Integer>>() {
|
@Override
|
public int compare(HashMap.Entry<String, Integer> o1, HashMap.Entry<String, Integer> o2) {
|
return o2.getValue().compareTo(o1.getValue());
|
}
|
});
|
// problemTypeMap.clear();
|
// problemTypeMap.entrySet().addAll(list);
|
//初始化Entry,限定最多显示5个扇区,超出的合并为第5个扇区
|
String remainProblemType = "";
|
int remainProblemCount = 0;
|
int chartcount = 0;
|
for (HashMap.Entry<String, Integer> entry : list) {
|
if (chartcount < MAX_CHART_COUNT - 1) {
|
entries.add(new PieEntry((float)entry.getValue(), entry.getKey()));
|
} else {
|
remainProblemCount = remainProblemCount + entry.getValue();
|
remainProblemType = entry.getKey();
|
}
|
chartcount++;
|
}
|
if (chartcount == MAX_CHART_COUNT) {
|
entries.add(new PieEntry((float) remainProblemCount, remainProblemType));
|
} else if (chartcount > MAX_CHART_COUNT) {
|
entries.add(new PieEntry((float) remainProblemCount, REMAIN_PROBLEM));
|
}
|
|
// add a lot of colors
|
ArrayList<Integer> colors = new ArrayList<>();
|
|
for (int c : ColorTemplate.JOYFUL_COLORS)
|
colors.add(c);
|
|
for (int c : ColorTemplate.COLORFUL_COLORS)
|
colors.add(c);
|
|
for (int c : ColorTemplate.VORDIPLOM_COLORS)
|
colors.add(c);
|
|
for (int c : ColorTemplate.LIBERTY_COLORS)
|
colors.add(c);
|
|
for (int c : ColorTemplate.PASTEL_COLORS)
|
colors.add(c);
|
|
colors.add(ColorTemplate.getHoloBlue());
|
|
dataSet.setColors(colors);
|
|
//value line
|
dataSet.setValueLinePart1OffsetPercentage(80.f);
|
dataSet.setValueLinePart1Length(0.2f);
|
dataSet.setValueLinePart2Length(0.4f);
|
//dataSet.setXValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE);
|
dataSet.setYValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE);
|
|
//
|
PieData data = new PieData(dataSet);
|
data.setValueFormatter(new PercentFormatter());
|
data.setValueTextSize(11f);
|
data.setValueTextColor(Color.BLACK);
|
// data.setValueTypeface(mTfLight);
|
if (!entries.isEmpty()) {//数据全为空时,不显示
|
mChart.setData(data);
|
} else {
|
mChart.setData(null);
|
}
|
mChart.setNoDataText("暂无数据");
|
|
// undo all highlights
|
mChart.highlightValues(null);
|
|
mChart.animateY(1400, Easing.EasingOption.EaseInOutQuad);
|
}
|
//</editor-fold>
|
|
/**
|
* 按照搜索条件查询问题分布结果
|
*/
|
// private void search() {
|
// final SweetAlertDialog dialog = DialogUtil.createSweetLoadingDialog(getActivity(), "Loading...");
|
// AreaVo areaVo = new AreaVo();
|
// areaVo.setProvincecode(((Province)SP_province.getSelectedItem()).getProvincecode());
|
// areaVo.setProvincename(((Province)SP_province.getSelectedItem()).getProvincename());
|
// areaVo.setCitycode(((City)SP_city.getSelectedItem()).getCitycode());
|
// areaVo.setCityname(((City)SP_city.getSelectedItem()).getCityname());
|
// areaVo.setDistrictcode(((District)SP_district.getSelectedItem()).getDistrictcode());
|
// areaVo.setDistrictname(((District)SP_district.getSelectedItem()).getDistrictname());
|
// areaVo.setTowncode(((Town) SP_town.getSelectedItem()).getTowncode());
|
// areaVo.setTownname(((Town) SP_town.getSelectedItem()).getTownname());
|
// areaVo = gettime(areaVo);
|
// int position = SP_scense_type.getSelectedItemPosition();
|
// areaVo.setScensetypeid(scenseTypeData.get(position).getValue());
|
// Call<List<ProblemlistVo>> getProblemByArea = problemListService.getByArea(areaVo);
|
// getProblemByArea.enqueue(new Callback<List<ProblemlistVo>>() {
|
// @Override
|
// public void onResponse(Call<List<ProblemlistVo>> call, Response<List<ProblemlistVo>> response) {
|
// if (response.body() != null) {
|
// problemlists = response.body();
|
// }
|
// setData(problemlists);
|
// entryAdapter.notifyDataSetChanged();//刷新列表
|
// DialogUtil.closeDialog(dialog);
|
// }
|
//
|
// @Override
|
// public void onFailure(Call<List<ProblemlistVo>> call, Throwable t) {
|
// setData(problemlists);
|
// DialogUtil.closeDialog(dialog);
|
// }
|
// });
|
//
|
// setChartTitle();//刷新标题
|
// setDateDisplay();//刷新时间
|
// }
|
}
|