ListView 显示柱状图,并解决滚动时内容重复的问题
2013-09-13 15:23
405 查看
效果图如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/19/35e00e99b6caa31ae9fae71200baf74e)
思路:
1. 给数据源
2. 创建一个类继承自BaseAdapter
3. 将自定的adapter赋给页面中的listView
项目类结构:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/19/4e34017d4c93e5785fa9c2df552748d7)
下面是绑定ListView的具体细节
1. 创建android应用程序com.example.ListViewDemo
2. 在activity_main.xml中,添加ListView控件
3. 创建模拟数据源
4.
4.1创建item_template.xml ,用于显示数据的长度
4.2在colors.xml中定义背景颜色
4.3 自定义ChartView类,根据数字改变其长度,继承自RelativeLayout
4.4 设置每一项的样式,创建item.xml
5. 添加MyAdapter类,需继承自BaseAdapter
6. 准备工作完成后,让我们在MainActivity中调用吧
思路:
1. 给数据源
2. 创建一个类继承自BaseAdapter
3. 将自定的adapter赋给页面中的listView
项目类结构:
下面是绑定ListView的具体细节
1. 创建android应用程序com.example.ListViewDemo
2. 在activity_main.xml中,添加ListView控件
<ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent"> </ListView>
3. 创建模拟数据源
public class NameValue { public String name; public int value; public String filter;//用于分组使用 public NameValue(String name,int value,String filter){ this.name = name; this.value = value; this.filter = filter; } public static ArrayList<NameValue> setValues() { ArrayList<NameValue> options =new ArrayList<NameValue>(); { options.add(newNameValue("a", 10,"aaa")); options.add(newNameValue("a1", 31,"aaa")); options.add(newNameValue("a2", 3,"aaa")); options.add(newNameValue("a3", 20,"bbb")); options.add(newNameValue("a4", 350,"bbb")); options.add(newNameValue("a5", 310,"bbb")); options.add(newNameValue("a6", 320,"ccc")); options.add(newNameValue("a7", 330,"bbb")); options.add(newNameValue("a8", 230,"ccc")); options.add(newNameValue("a9", 130,"ccc")); } return options; }
4.
4.1创建item_template.xml ,用于显示数据的长度
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:background="@color/chart_bg"> <TextView android:id="@+id/textview_num" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:ellipsize="end" android:singleLine="true" android:text="123" android:textColor="@color/white" android:textSize="30sp" android:layout_marginRight="5dip"/> </ RelativeLayout >
4.2在colors.xml中定义背景颜色
<color name="white">#FFFFFF</color> <color name="chart_bg">#FF9900</color>
4.3 自定义ChartView类,根据数字改变其长度,继承自RelativeLayout
public class ChartView extends RelativeLayout{ private TextView textView; public ChartView(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.item_template,this); textView=(TextView)findViewById(R.id.textview_num); } public void setTextViewText(String text){ textView.setText(text); } }
4.4 设置每一项的样式,创建item.xml
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_marginLeft="10dip" android:layout_marginRight="10dip"> <TextView android:id="@+id/textview_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:singleLine="true" android:ellipsize="end" android:textSize="18sp" android:text="name" android:layout_marginLeft="10dip" android:layout_marginRight="10dip" /> <com.example.listviewdemo.view.ChartView android:id="@+id/chart" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dip" android:layout_marginRight="10dip"/> <TextViewandroid:layout_width="match_parent" android:layout_height="1dip" android:background="@color/chart_bg" android:layout_marginTop="7dip"/> </LinearLayout>
5. 添加MyAdapter类,需继承自BaseAdapter
public class MyAdapter extends BaseAdapter { ArrayList<NameValue> nvl; Context context; int max; int width; public MyAdapter(Context context,ArrayList<NameValue> nvl,int width){ this.nvl = nvl; this.context = context; this.width = width; this.max = selectMaxValue(nvl); } /** * 查询数组中的最大值 * @param options * @return */ private int selectMaxValue(ArrayList<NameValue> options){ if(options ==null){ return 0; } int max = 0; max = options.get(0).value; for (int i = 0; i < options.size(); i++) { if(options.get(i).value > max){ max = options.get(i).value ; } } return max; } @Override public int getCount() { // TODO Auto-generated method stub return nvl.size(); } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return nvl.get(arg0); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { myListItem myList = null; TextView textview_name = null; if(convertView ==null) { System.out.println("为空:" + position); myList = new myListItem(); convertView = LayoutInflater.from(context).inflate(R.layout.item,null,false); textview_name = (TextView)convertView.findViewById(R.id.textview_name); ChartView chart = (ChartView)convertView.findViewById(R.id.chart); myList.textview_name = textview_name; myList.chart = chart; convertView.setTag(myList); } else { myList = (myListItem)convertView.getTag(); System.out.println("不为空:" + position); } NameValue nv = nvl.get(position); myList.textview_name.setText(nv.name); myList.chart.setTextViewText(String.valueOf(nv.value)); android.view.ViewGroup.LayoutParams lp2 = myList.chart.getLayoutParams(); //计算值占屏幕的宽度,40是去除左右留下的边距 int a = (int) ((this.width - DensityUtil.dip2px(context, 40))* nv.value/max); lp2.width = a; if(a<20){ myList.chart.setTextViewText(String.valueOf("")); } return convertView; } /** * Item 项中的数据结构,解决listView滚动时,内容重复问题,此类定义每个Item项包含的内容 * @author Administrator * */ static class myListItem{ TextView textview_name; ChartView chart; } }
6. 准备工作完成后,让我们在MainActivity中调用吧
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView listView = (ListView)findViewById(R.id.listView); ArrayList<NameValue> values = NameValue.getNameValues(); //width:当前设备的宽度 int width =this.getWindowManager().getDefaultDisplay().getWidth(); MyAdapter mydapter = new MyAdapter(MainActivity.this, values, width); listView.setAdapter(mydapter); }
相关文章推荐
- 关于ListView的Adapter,解决ListView滚动后内容重复的问题
- 关于ListView的Adapter,解决ListView滚动后内容重复的问题
- android listview 异步加载图片并防止错位及解决ListView滚动后内容重复的问题
- 关于ListView的Adapter,解决ListView滚动后内容重复的问题
- 关于ListView的Adapter,解决ListView滚动后内容重复的问题
- 关于ListView的Adapter,解决ListView滚动后内容重复的问题
- 关于ListView的Adapter,解决ListView滚动后内容重复的问题
- 关于ListView的Adapter,解决ListView滚动后内容重复的问题
- 关于ListView的Adapter,解决ListView滚动后内容重复的问题
- 关于ListView的Adapter,解决ListView滚动后内容重复的问题
- Android ListView滑动过程中图片显示重复错乱闪烁问题解决
- RecyclerView, ListView 只显示一行内容 问题解决
- Android ListView滑动过程中图片显示重复错位闪烁问题解决
- universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法
- universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法
- (二)、Android ListView滑动过程中图片显示重复错位闪烁问题解决
- 关于div的滚动条滚动到底部,内容显示不全的问题。(已解决)
- Android ListView滑动过程中图片显示重复错乱闪烁问题解决
- Android ListView滑动过程中图片显示重复错乱闪烁问题解决
- ListView滚动后内容重复的问题(Listview进度条,图片错乱的问题)