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