Android开发学习之路-自定义ListView(继承BaseAdapter)
大三学生一个,喜欢编程,喜欢谷歌,喜欢Android,所以选择的方向自然是Android应用开发,开博第一篇,希望以后会有更多的进步。
最近在做一个记账App的时候,需要一个Activity来显示每个月的消费各个项目的比例,Activity中主要用到一个ListView,ListView中包括一个TextView来显示类型的名称,一个TextView来显示所占比例,一个ProgressBar来显示进度条,让每个条目的比例更加清晰。如下图(这里只提供实现方法,界面效果暂不提供)

因为这种效果比较特别,需要我们自己来实现自定义的效果。下面来实现它:
一、定义每个Item的布局,tendency_list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="beforeDescendants"
android:paddingLeft="5dp"
android:paddingRight="5dp" > <RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:descendantFocusability="afterDescendants" > <TextView
android:id="@+id/tendency_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="15dp"
android:textSize="15sp" /> <ProgressBar
android:id="@+id/tendency_progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/tendency_title"
android:layout_marginBottom="15dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:max="100"
android:progressDrawable="@drawable/progress_style" /> <TextView
android:id="@+id/tendency_total"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="10dp"
android:layout_marginTop="15dp"
android:textSize="15sp" />
</RelativeLayout> </FrameLayout>
复杂冗余的可以无视,就是简单的两个TextView和一个ProgressBar而已
二、创建一个类,继承BaseAdapter,可以是一个独立的类,也可以是当前的activity中建立的一个内部类,重写一些函数即可,这里布局被硬编码了,如果是封装的一个外部类,可以通过参数传进来
public class myAdapter extends BaseAdapter {
private Context context; // 当前的Context
private LayoutInflater mInflater; // 通过LayoutInflater来加载每个item的布局
private double total; // 跟项目有关,把总的金额数传进来,这也是使用内部类的原因
List<Map<String, Object>> map; // 存放数据源
public myAdapter(Context context, List<Map<String, Object>> map,
double total) {
this.context = context;
this.mInflater = LayoutInflater.from(context);
this.total = total;
this.map = map;
}
// 重写这个方法,获得当前ListView共有多少个Item
@Override
public int getCount() {
return listmap.size();
}
// 重写这个方法,获得当前的position
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
// 一个辅助类
public class viewHolder {
TextView title;
ProgressBar progress;
TextView sum;
}
// 一个最重要的方法,重写它来把数据映射到布局上
@Override
public View getView(int position, View view, ViewGroup parent) {
view = mInflater.inflate(R.layout.tendency_list_item, null); // 加载Item的布局
viewHolder vh = new viewHolder(); // 创建辅助类
vh.title = (TextView) view.findViewById(R.id.tendency_title); // 通过Id获取对象
vh.progress = (ProgressBar) view
.findViewById(R.id.tendency_progressBar);
vh.sum = (TextView) view.findViewById(R.id.tendency_total);
vh.title.setText((String) map.get(position).get("type")); // 调用每个对象来把数据映射进去
double part = (Double) map.get(position).get("total");
String part2 = String.format("%.0f", part * 100 / total);
vh.sum.setText(part2 + "%");
vh.progress.setProgress(Integer.parseInt(part2));
return view;
}
}
三、调用即可
myAdapter adapter = new myAdapter(tendency_activity.this, listmap, sum);
show.setAdapter(adapter);
原理其实也比较简单,在实例化的时候,先调用getCount()来计算有多少个Item,然后每个position都调用getView()来进行数据的映射(这样性能不会很好,如何优化日后再补充)。
如有错误,还请指导更正,感谢!
Android开发学习之路-自定义ListView(继承BaseAdapter)的更多相关文章
- Android开发学习之路-RecyclerView滑动删除和拖动排序
Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...
- Android开发学习之路--基于vitamio的视频播放器(二)
终于把该忙的事情都忙得差不多了,接下来又可以开始good good study,day day up了.在Android开发学习之路–基于vitamio的视频播放器(一)中,主要讲了播放器的界面的 ...
- Android开发学习之路--网络编程之xml、json
一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载 ...
- Android开发学习之路--Activity之初体验
环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...
- Android开发学习之路--Android Studio cmake编译ffmpeg
最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...
- Android开发学习之路--Android系统架构初探
环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究.这里从芯片及硬件模块-& ...
- Android开发学习之路--MAC下Android Studio开发环境搭建
自从毕业开始到现在还没有系统地学习android应用的开发,之前一直都是做些底层的驱动,以及linux上的c开发.虽然写过几个简单的app,也对android4.0.3的源代码做过部分的分析,也算入门 ...
- Android开发学习之路--UI之ListView
这里再学习写android的ListView,其实我们都使用过ListView,就像手机的联系人,就是用的ListView了.下面就实现下简单的ListView吧,首先是xml文件中添加相关的代码: ...
- Android开发学习之路--Broadcast Receiver之初体验
学习了Activity组件后,这里再学习下另一个组件Broadcast Receiver组件.这里学习下自定义的Broadcast Receiver.通过按键自己发送广播,然后自己接收广播.新建MyB ...
随机推荐
- 如何写出优雅兼备可读性的javascript代码
即或是最简单的需求,不同的程序员也会写出不一样的代码: 需求:充值程序过虑不符合条件的充值金额,即只能充入100.200.500.1000金额,其它过虑: 1.菜鸟程序员可能会这样写,虽然可读性强,代 ...
- 《photon中配置lite的相关问题》
前几天在学习photon的时候发现了一个问题: 无论如何都找不到Lite文件夹,我是一个新手这也是写给那些新上手的朋友: 首先下载SDK以后配置完成后无论如何都找不到Lite文件夹和相关的Lite.d ...
- Object 转化为String时的一个问题 null->"null"
近日在工作出了一个较大的问题,导致被客户投诉. 事情大致是,某个功能里新增对用户手机的修改,在平台数据同步过程中,出现了将用户以前的要同步的数据,那时还没有手机号码所以是null,新功能上线后,将手机 ...
- GERBER文件
GERBER文件 GERBER文件是一种国际标准的光绘格式文件,它包含RS-274-D和RS-274-X两种格式,其中RS-274-D称为基本GERBER格式,并 要同时附带D码文件才能完整描述一张图 ...
- ruby 学习笔记 2 -变量
变量 在ruby的世界里,变量有5种,全局变量 局部变量 实例变量 常量 类变量以及伪变量 常用的: 全局: 在全局使用,使用$开头,因为是全局的,所以在任何的代码例子中都可以改变其值,造成混乱,所以 ...
- JAVA单例的三种实现方式
1. public class MySingleton { private MySingleton() {} private MySingleton instance = new MySingleto ...
- Minimum configuration for openldap to proxy multiple AD into a single search base
[root@localhost ~]# cd /etc/openldap[root@localhost openldap]# cat slapd.confloglevel 0x900include / ...
- onBlur事件与onfocus事件(js)
onFocus事件就是当光标落在文本框中时发生的事件. onBlur事件是光标失去焦点时发生的事件. 可以编如下例子 1.html <HTML><HEAD><TITL ...
- linux shell 字符串操作
转:http://justcoding.iteye.com/blog/1963463 在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作 ...
- Android Studio 无法启动模拟器的一种可能是你装的是Ghost版的系统
我遇到的问题是,打开模拟器,进度条走到最后,突然出现了emulator error,然后模拟器就无法启动(不好意思当时没有截图).我是在Ghost版 win7系统下运行Android Studio 的 ...