• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 package com.xxmassdeveloper.mpchartexample;
3 
4 import android.content.Context;
5 import android.content.Intent;
6 import android.graphics.Color;
7 import android.net.Uri;
8 import android.os.Bundle;
9 import androidx.annotation.NonNull;
10 import android.view.Menu;
11 import android.view.MenuItem;
12 import android.view.View;
13 import android.view.ViewGroup;
14 import android.view.WindowManager;
15 import android.widget.ArrayAdapter;
16 import android.widget.ListView;
17 
18 import com.github.mikephil.charting.data.BarData;
19 import com.github.mikephil.charting.data.BarDataSet;
20 import com.github.mikephil.charting.data.BarEntry;
21 import com.github.mikephil.charting.data.Entry;
22 import com.github.mikephil.charting.data.LineData;
23 import com.github.mikephil.charting.data.LineDataSet;
24 import com.github.mikephil.charting.data.PieData;
25 import com.github.mikephil.charting.data.PieDataSet;
26 import com.github.mikephil.charting.data.PieEntry;
27 import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
28 import com.github.mikephil.charting.utils.ColorTemplate;
29 import com.xxmassdeveloper.mpchartexample.listviewitems.BarChartItem;
30 import com.xxmassdeveloper.mpchartexample.listviewitems.ChartItem;
31 import com.xxmassdeveloper.mpchartexample.listviewitems.LineChartItem;
32 import com.xxmassdeveloper.mpchartexample.listviewitems.PieChartItem;
33 import com.xxmassdeveloper.mpchartexample.notimportant.DemoBase;
34 
35 import java.util.ArrayList;
36 import java.util.List;
37 
38 /**
39  * Demonstrates the use of charts inside a ListView. IMPORTANT: provide a
40  * specific height attribute for the chart inside your ListView item
41  *
42  * @author Philipp Jahoda
43  */
44 public class ListViewMultiChartActivity extends DemoBase {
45 
46     @Override
onCreate(Bundle savedInstanceState)47     protected void onCreate(Bundle savedInstanceState) {
48         super.onCreate(savedInstanceState);
49         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
50                 WindowManager.LayoutParams.FLAG_FULLSCREEN);
51         setContentView(R.layout.activity_listview_chart);
52 
53         setTitle("ListViewMultiChartActivity");
54 
55         ListView lv = findViewById(R.id.listView1);
56 
57         ArrayList<ChartItem> list = new ArrayList<>();
58 
59         // 30 items
60         for (int i = 0; i < 30; i++) {
61 
62             if(i % 3 == 0) {
63                 list.add(new LineChartItem(generateDataLine(i + 1), getApplicationContext()));
64             } else if(i % 3 == 1) {
65                 list.add(new BarChartItem(generateDataBar(i + 1), getApplicationContext()));
66             } else if(i % 3 == 2) {
67                 list.add(new PieChartItem(generateDataPie(), getApplicationContext()));
68             }
69         }
70 
71         ChartDataAdapter cda = new ChartDataAdapter(getApplicationContext(), list);
72         lv.setAdapter(cda);
73     }
74 
75     /** adapter that supports 3 different item types */
76     private class ChartDataAdapter extends ArrayAdapter<ChartItem> {
77 
ChartDataAdapter(Context context, List<ChartItem> objects)78         ChartDataAdapter(Context context, List<ChartItem> objects) {
79             super(context, 0, objects);
80         }
81 
82         @NonNull
83         @Override
getView(int position, View convertView, @NonNull ViewGroup parent)84         public View getView(int position, View convertView, @NonNull ViewGroup parent) {
85             //noinspection ConstantConditions
86             return getItem(position).getView(position, convertView, getContext());
87         }
88 
89         @Override
getItemViewType(int position)90         public int getItemViewType(int position) {
91             // return the views type
92             ChartItem ci = getItem(position);
93             return ci != null ? ci.getItemType() : 0;
94         }
95 
96         @Override
getViewTypeCount()97         public int getViewTypeCount() {
98             return 3; // we have 3 different item-types
99         }
100     }
101 
102     /**
103      * generates a random ChartData object with just one DataSet
104      *
105      * @return Line data
106      */
generateDataLine(int cnt)107     private LineData generateDataLine(int cnt) {
108 
109         ArrayList<Entry> values1 = new ArrayList<>();
110 
111         for (int i = 0; i < 12; i++) {
112             values1.add(new Entry(i, (int) (Math.random() * 65) + 40));
113         }
114 
115         LineDataSet d1 = new LineDataSet(values1, "New DataSet " + cnt + ", (1)");
116         d1.setLineWidth(2.5f);
117         d1.setCircleRadius(4.5f);
118         d1.setHighLightColor(Color.rgb(244, 117, 117));
119         d1.setDrawValues(false);
120 
121         ArrayList<Entry> values2 = new ArrayList<>();
122 
123         for (int i = 0; i < 12; i++) {
124             values2.add(new Entry(i, values1.get(i).getY() - 30));
125         }
126 
127         LineDataSet d2 = new LineDataSet(values2, "New DataSet " + cnt + ", (2)");
128         d2.setLineWidth(2.5f);
129         d2.setCircleRadius(4.5f);
130         d2.setHighLightColor(Color.rgb(244, 117, 117));
131         d2.setColor(ColorTemplate.VORDIPLOM_COLORS[0]);
132         d2.setCircleColor(ColorTemplate.VORDIPLOM_COLORS[0]);
133         d2.setDrawValues(false);
134 
135         ArrayList<ILineDataSet> sets = new ArrayList<>();
136         sets.add(d1);
137         sets.add(d2);
138 
139         return new LineData(sets);
140     }
141 
142     /**
143      * generates a random ChartData object with just one DataSet
144      *
145      * @return Bar data
146      */
generateDataBar(int cnt)147     private BarData generateDataBar(int cnt) {
148 
149         ArrayList<BarEntry> entries = new ArrayList<>();
150 
151         for (int i = 0; i < 12; i++) {
152             entries.add(new BarEntry(i, (int) (Math.random() * 70) + 30));
153         }
154 
155         BarDataSet d = new BarDataSet(entries, "New DataSet " + cnt);
156         d.setColors(ColorTemplate.VORDIPLOM_COLORS);
157         d.setHighLightAlpha(255);
158 
159         BarData cd = new BarData(d);
160         cd.setBarWidth(0.9f);
161         return cd;
162     }
163 
164     /**
165      * generates a random ChartData object with just one DataSet
166      *
167      * @return Pie data
168      */
generateDataPie()169     private PieData generateDataPie() {
170 
171         ArrayList<PieEntry> entries = new ArrayList<>();
172 
173         for (int i = 0; i < 4; i++) {
174             entries.add(new PieEntry((float) ((Math.random() * 70) + 30), "Quarter " + (i+1)));
175         }
176 
177         PieDataSet d = new PieDataSet(entries, "");
178 
179         // space between slices
180         d.setSliceSpace(2f);
181         d.setColors(ColorTemplate.VORDIPLOM_COLORS);
182 
183         return new PieData(d);
184     }
185 
186     @Override
onCreateOptionsMenu(Menu menu)187     public boolean onCreateOptionsMenu(Menu menu) {
188         getMenuInflater().inflate(R.menu.only_github, menu);
189         return true;
190     }
191 
192     @Override
onOptionsItemSelected(MenuItem item)193     public boolean onOptionsItemSelected(MenuItem item) {
194 
195         switch (item.getItemId()) {
196             case R.id.viewGithub: {
197                 Intent i = new Intent(Intent.ACTION_VIEW);
198                 i.setData(Uri.parse("https://github.com/PhilJay/MPAndroidChart/blob/master/MPChartExample/src/com/xxmassdeveloper/mpchartexample/ListViewMultiChartActivity.java"));
199                 startActivity(i);
200                 break;
201             }
202         }
203 
204         return true;
205     }
206 
207     @Override
saveToGallery()208     public void saveToGallery() { /* Intentionally left empty */ }
209 }
210