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 ...
随机推荐
- C#引用类型(class)和值类型(struct)
1. 值参数 当利用值向方法传递参数时,编译程序给实参的值做一份拷贝,并且将此拷贝传递给该方法.被调用的方法不传内存中实参的值,所以使用值参数时,可以保证实际值是安全的. using System; ...
- yii 图片展示
<?= DetailView::widget([ 'model' => $model, 'attributes' => [ 'id', 'name', 'time', 'pic', ...
- Android studio 分析内存泄漏
以前用eclipse的时候,我们采用的是DDMS和MAT,不仅使用步骤复杂繁琐,而且要手动排查内存泄漏的位置,操作起来比较麻烦.后来随着Android studio的潮流,我也抛弃了eclipse加入 ...
- 【13-Annotation】
Annotation 5个基本的Annotation •@Override •@Deprecated •@SuppressWarnings •@SafeVarargs •@FunctionalInte ...
- Activity设置全屏的三种方法
1.super.onCreate(savedInstanceState)方法之前调用: setTheme(android.R.style.Theme_Light_NoTitleB ...
- 核心动画(CAKeyframeAnimation)
Main.storyboard ViewController.m // // ViewController.m // 8A02.核心动画 - CAKeyframeAnimation // // ...
- "巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场
Combine String #include<cstdio> #include<cstring> #include<iostream> #include<a ...
- javascript练习-私有状态
在经典的面向对象编程中,经常需要将对象的某个状态封装或隐藏在对象内,只有通过对象的方法才能访问这些状态,对外只暴露一些重要的状态可以直接编写.这是就需要私有状态. function Range(fro ...
- 客户端JS性能的一些优化的小技巧
下面是一些关于客户端JS性能的一些优化的小技巧:1.[顶]关于JS的循环,循环是一种常用的流程控制.JS提供了三种循环:for(;;). while().for(in).在这三种循环中 for(in) ...
- mysql5.7压缩包版安装-来自百度经验
解压缩 将下载到的文件解压缩到自己喜欢的位置,例如我自己的位置是C:\mysql57 2 添加环境变量 右键计算机->属性->高级系统设置->环境变量:在系统变量里添加 ...