1 2 package com.xxmassdeveloper.mpchartexample; 3 4 import android.annotation.SuppressLint; 5 import android.content.Context; 6 import android.content.Intent; 7 import android.graphics.Color; 8 import android.net.Uri; 9 import android.os.Bundle; 10 import androidx.annotation.NonNull; 11 import android.view.LayoutInflater; 12 import android.view.Menu; 13 import android.view.MenuItem; 14 import android.view.View; 15 import android.view.ViewGroup; 16 import android.view.WindowManager; 17 import android.widget.ArrayAdapter; 18 import android.widget.ListView; 19 20 import com.github.mikephil.charting.charts.BarChart; 21 import com.github.mikephil.charting.components.XAxis; 22 import com.github.mikephil.charting.components.XAxis.XAxisPosition; 23 import com.github.mikephil.charting.components.YAxis; 24 import com.github.mikephil.charting.data.BarData; 25 import com.github.mikephil.charting.data.BarDataSet; 26 import com.github.mikephil.charting.data.BarEntry; 27 import com.github.mikephil.charting.interfaces.datasets.IBarDataSet; 28 import com.github.mikephil.charting.utils.ColorTemplate; 29 import com.xxmassdeveloper.mpchartexample.notimportant.DemoBase; 30 31 import java.util.ArrayList; 32 import java.util.List; 33 34 /** 35 * Demonstrates the use of charts inside a ListView. IMPORTANT: provide a 36 * specific height attribute for the chart inside your ListView item 37 * 38 * @author Philipp Jahoda 39 */ 40 public class ListViewBarChartActivity extends DemoBase { 41 42 @Override onCreate(Bundle savedInstanceState)43 protected void onCreate(Bundle savedInstanceState) { 44 super.onCreate(savedInstanceState); 45 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 46 WindowManager.LayoutParams.FLAG_FULLSCREEN); 47 setContentView(R.layout.activity_listview_chart); 48 49 setTitle("ListViewBarChartActivity"); 50 51 ListView lv = findViewById(R.id.listView1); 52 53 ArrayList<BarData> list = new ArrayList<>(); 54 55 // 20 items 56 for (int i = 0; i < 20; i++) { 57 list.add(generateData(i + 1)); 58 } 59 60 ChartDataAdapter cda = new ChartDataAdapter(getApplicationContext(), list); 61 lv.setAdapter(cda); 62 } 63 64 private class ChartDataAdapter extends ArrayAdapter<BarData> { 65 ChartDataAdapter(Context context, List<BarData> objects)66 ChartDataAdapter(Context context, List<BarData> objects) { 67 super(context, 0, objects); 68 } 69 70 @SuppressLint("InflateParams") 71 @NonNull 72 @Override getView(int position, View convertView, @NonNull ViewGroup parent)73 public View getView(int position, View convertView, @NonNull ViewGroup parent) { 74 75 BarData data = getItem(position); 76 77 ViewHolder holder; 78 79 if (convertView == null) { 80 81 holder = new ViewHolder(); 82 83 convertView = LayoutInflater.from(getContext()).inflate( 84 R.layout.list_item_barchart, null); 85 holder.chart = convertView.findViewById(R.id.chart); 86 87 convertView.setTag(holder); 88 89 } else { 90 holder = (ViewHolder) convertView.getTag(); 91 } 92 93 // apply styling 94 if (data != null) { 95 data.setValueTypeface(tfLight); 96 data.setValueTextColor(Color.BLACK); 97 } 98 holder.chart.getDescription().setEnabled(false); 99 holder.chart.setDrawGridBackground(false); 100 101 XAxis xAxis = holder.chart.getXAxis(); 102 xAxis.setPosition(XAxisPosition.BOTTOM); 103 xAxis.setTypeface(tfLight); 104 xAxis.setDrawGridLines(false); 105 106 YAxis leftAxis = holder.chart.getAxisLeft(); 107 leftAxis.setTypeface(tfLight); 108 leftAxis.setLabelCount(5, false); 109 leftAxis.setSpaceTop(15f); 110 111 YAxis rightAxis = holder.chart.getAxisRight(); 112 rightAxis.setTypeface(tfLight); 113 rightAxis.setLabelCount(5, false); 114 rightAxis.setSpaceTop(15f); 115 116 // set data 117 holder.chart.setData(data); 118 holder.chart.setFitBars(true); 119 120 // do not forget to refresh the chart 121 // holder.chart.invalidate(); 122 holder.chart.animateY(700); 123 124 return convertView; 125 } 126 127 private class ViewHolder { 128 129 BarChart chart; 130 } 131 } 132 133 /** 134 * generates a random ChartData object with just one DataSet 135 * 136 * @return Bar data 137 */ generateData(int cnt)138 private BarData generateData(int cnt) { 139 140 ArrayList<BarEntry> entries = new ArrayList<>(); 141 142 for (int i = 0; i < 12; i++) { 143 entries.add(new BarEntry(i, (float) (Math.random() * 70) + 30)); 144 } 145 146 BarDataSet d = new BarDataSet(entries, "New DataSet " + cnt); 147 d.setColors(ColorTemplate.VORDIPLOM_COLORS); 148 d.setBarShadowColor(Color.rgb(203, 203, 203)); 149 150 ArrayList<IBarDataSet> sets = new ArrayList<>(); 151 sets.add(d); 152 153 BarData cd = new BarData(sets); 154 cd.setBarWidth(0.9f); 155 return cd; 156 } 157 158 @Override onCreateOptionsMenu(Menu menu)159 public boolean onCreateOptionsMenu(Menu menu) { 160 getMenuInflater().inflate(R.menu.only_github, menu); 161 return true; 162 } 163 164 @Override onOptionsItemSelected(MenuItem item)165 public boolean onOptionsItemSelected(MenuItem item) { 166 167 switch (item.getItemId()) { 168 case R.id.viewGithub: { 169 Intent i = new Intent(Intent.ACTION_VIEW); 170 i.setData(Uri.parse("https://github.com/PhilJay/MPAndroidChart/blob/master/MPChartExample/src/com/xxmassdeveloper/mpchartexample/ListViewBarChartActivity.java")); 171 startActivity(i); 172 break; 173 } 174 } 175 176 return true; 177 } 178 179 @Override saveToGallery()180 public void saveToGallery() { /* Intentionally left empty */ } 181 } 182