大三学生一个,喜欢编程,喜欢谷歌,喜欢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)的更多相关文章

  1. Android开发学习之路-RecyclerView滑动删除和拖动排序

    Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...

  2. Android开发学习之路--基于vitamio的视频播放器(二)

      终于把该忙的事情都忙得差不多了,接下来又可以开始good good study,day day up了.在Android开发学习之路–基于vitamio的视频播放器(一)中,主要讲了播放器的界面的 ...

  3. Android开发学习之路--网络编程之xml、json

    一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载 ...

  4. Android开发学习之路--Activity之初体验

    环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...

  5. Android开发学习之路--Android Studio cmake编译ffmpeg

      最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...

  6. Android开发学习之路--Android系统架构初探

    环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究.这里从芯片及硬件模块-& ...

  7. Android开发学习之路--MAC下Android Studio开发环境搭建

    自从毕业开始到现在还没有系统地学习android应用的开发,之前一直都是做些底层的驱动,以及linux上的c开发.虽然写过几个简单的app,也对android4.0.3的源代码做过部分的分析,也算入门 ...

  8. Android开发学习之路--UI之ListView

    这里再学习写android的ListView,其实我们都使用过ListView,就像手机的联系人,就是用的ListView了.下面就实现下简单的ListView吧,首先是xml文件中添加相关的代码: ...

  9. Android开发学习之路--Broadcast Receiver之初体验

    学习了Activity组件后,这里再学习下另一个组件Broadcast Receiver组件.这里学习下自定义的Broadcast Receiver.通过按键自己发送广播,然后自己接收广播.新建MyB ...

随机推荐

  1. 如何写出优雅兼备可读性的javascript代码

    即或是最简单的需求,不同的程序员也会写出不一样的代码: 需求:充值程序过虑不符合条件的充值金额,即只能充入100.200.500.1000金额,其它过虑: 1.菜鸟程序员可能会这样写,虽然可读性强,代 ...

  2. 《photon中配置lite的相关问题》

    前几天在学习photon的时候发现了一个问题: 无论如何都找不到Lite文件夹,我是一个新手这也是写给那些新上手的朋友: 首先下载SDK以后配置完成后无论如何都找不到Lite文件夹和相关的Lite.d ...

  3. Object 转化为String时的一个问题 null->"null"

    近日在工作出了一个较大的问题,导致被客户投诉. 事情大致是,某个功能里新增对用户手机的修改,在平台数据同步过程中,出现了将用户以前的要同步的数据,那时还没有手机号码所以是null,新功能上线后,将手机 ...

  4. GERBER文件

    GERBER文件 GERBER文件是一种国际标准的光绘格式文件,它包含RS-274-D和RS-274-X两种格式,其中RS-274-D称为基本GERBER格式,并 要同时附带D码文件才能完整描述一张图 ...

  5. ruby 学习笔记 2 -变量

    变量 在ruby的世界里,变量有5种,全局变量 局部变量 实例变量 常量 类变量以及伪变量 常用的: 全局: 在全局使用,使用$开头,因为是全局的,所以在任何的代码例子中都可以改变其值,造成混乱,所以 ...

  6. JAVA单例的三种实现方式

    1. public class MySingleton { private MySingleton() {} private MySingleton instance = new MySingleto ...

  7. 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 / ...

  8. onBlur事件与onfocus事件(js)

      onFocus事件就是当光标落在文本框中时发生的事件. onBlur事件是光标失去焦点时发生的事件. 可以编如下例子 1.html <HTML><HEAD><TITL ...

  9. linux shell 字符串操作

    转:http://justcoding.iteye.com/blog/1963463 在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作 ...

  10. Android Studio 无法启动模拟器的一种可能是你装的是Ghost版的系统

    我遇到的问题是,打开模拟器,进度条走到最后,突然出现了emulator error,然后模拟器就无法启动(不好意思当时没有截图).我是在Ghost版 win7系统下运行Android Studio 的 ...