Android开发之ListView-BaseAdapter的使用
ListView优化原则:
UI优化:
listview条目与条目之间的间隙的分割内容 : android:divider="@android :color/transparent"
listview条目之间的间隙 : android:paddingTop="5.0dip"
listview点中的颜色变化 : android:listSelector="@color/transparent"
在listview的右边 会显示出来一个快速滚动的进度条 : android:fastScrollEnabled="true"
数据适配性能优化:
1.复用历史缓存的view对象 converview,减少采用布局填充器服务和填充布局的次数,达到减少xml->view 操作的次数.
2.定义静态的viewholder ,储存了view对象里面控件的引用, view.setTag() view.getTag(),减少遍历view对象 树状结构的次数
3.采用了内存缓存,缓存一些经常使用的数据:
服务器上的图片,缓存这些图片到手机的Rom卡,sd卡,然后把图片给缓存到内存里面;
缓存从数据库中查询出的所有数据,减少查询数据库的动作
高级优化:
listview的延时加载: 如果listview里面要显示的有很多的数据, 我们不需要一次把所有的数据都获取出来.
分批的加载数据:注册listview滚动监听器onScrollListener(),发现最后一个可见的条目 为listview里面数据适配器里面的最后的一个条目, 从服务器加载更多的内容.
分页的加载数据:服务器需要提供接口, 一次获取一段的数据;数据库提供接口 ,一次查询一段的数据.
listview的快速拖动优化:
当listview在滚动状态下,不去加载listview里面真实的图片和内容,而是把一个缩略图加载界面上.
当listview的滚动状态停止的时候 才去真正的更新里面的条目的内容.
如何让你的ListView实现自动滚动呢? Android其实已经考虑到ListView控件的智能滚动操作。
直接在Layout中写即可,注意下面的stackFromBottom以及transcriptMode这两个属性。
BaseAdapter,官网链接--http://developer.android.com/intl/zh-cn/reference/android/widget/BaseAdapter.html
继承:Object
接口:ListAdapter SpinnerAdapter
已知直接子类:
ArrayAdapter<T>, CursorAdapter, SimpleAdapter
已知间接子类:
ResourceCursorAdapter, SimpleCursorAdapter
使用BaseAdapter,需要实现4个方法:
getCount() --返回需要ListView显示的item数量
getItem(int position) --返回item的位置
getItemId(int position) --返回item的id
getView(int position, View convertView, ViewGroup parent) --显示item的内容
--------------------------------------------------------------------------------------------------------------------------------------
实例(创建一个通讯录):
MainActivity.java代码
public class MainActivity extends Activity {
private ListView phoneList;
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GetPhone.getPhone(MainActivity.this);
phoneList = (ListView) findViewById(R.id.phoneList);
adapter = new MyAdapter(GetPhone.lists, MainActivity.this);
phoneList.setAdapter(adapter);
}
}
布局文件activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.lijingbo.getmyphonenumber.MainActivity" > <ListView
android:id="@+id/phoneList"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView> </LinearLayout>
获取通讯录中联系人的姓名和号码,GetPhone.java
public class GetPhone {
static List<PhoneInfo> lists = new ArrayList<PhoneInfo>();
public static List<PhoneInfo> getPhone(Context context) {
ContentResolver contentResolver = context.getContentResolver();
Cursor cursor = contentResolver.query(Phone.CONTENT_URI, null, null,
null, null);
while (cursor.moveToNext()) {
String number = cursor.getString(cursor
.getColumnIndex(Phone.NUMBER));
String name = cursor.getString(cursor
.getColumnIndex(Phone.DISPLAY_NAME));
Log.d("getmyphonenumber", name + "电话号码:" + number);
PhoneInfo phoneInfo = new PhoneInfo(name, number);
lists.add(phoneInfo);
}
return lists;
}
}
实体类 PhoneInfo.java
public class PhoneInfo {
private String name;
private String number;
public PhoneInfo(String name, String number) {
setName(name);
setNumber(number);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
}
MyAdapter.java
public class MyAdapter extends BaseAdapter {
private List<PhoneInfo> lists;
private Context context;
public MyAdapter(List<PhoneInfo> lists,Context context){
this.lists=lists;
this.context=context;
}
@Override
public int getCount() {
return lists.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder=null;
if (convertView==null) {
holder=new ViewHolder();
convertView=LayoutInflater.from(context).inflate(R.layout.phonedetails, null);
holder.showName=(TextView) convertView.findViewById(R.id.showName);
holder.showNumber=(TextView) convertView.findViewById(R.id.showNumber);
convertView.setTag(holder);
}else {
holder=(ViewHolder) convertView.getTag();
}
holder.showName.setText(lists.get(position).getName());
holder.showNumber.setText(lists.get(position).getNumber());
return convertView;
}
static class ViewHolder{
public TextView showName;
public TextView showNumber;
}
}
phonedetails.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" > <TextView
android:id="@+id/showName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="name"/>
<TextView
android:id="@+id/showNumber"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="number"/> </LinearLayout>
Android开发之ListView-BaseAdapter的使用的更多相关文章
- 【转】Android开发之ListView+EditText-要命的焦点和软键盘问题解决办法
Android开发之ListView+EditText-要命的焦点和软键盘问题解决办法 [原文链接] 这篇文章完美的解决了我几个月没结论的bug... 感谢热爱分享的技术达人~ 我是怎么走进这个大坑的 ...
- Android开发之ListView添加多种布局效果演示
在这个案例中展示的新闻列表,使用到ListView控件,然后在适配器中添加多种布局效果,这里通过重写BaseAdapter类中的 getViewType()和getItemViewType()来做判断 ...
- Android开发之ListView实现不同品种分类分隔栏的效果(非ExpandableListView实现)
我们有时候会遇到这么一个情况.就是我在一个ListView里面须要显示的东西事实上是有种类之分的.比方我要分冬天,夏天.秋天.春天,然后在这每一个季节以下再去载入各自的条目数据. 还有,比方我们的通讯 ...
- android 开发之 ListView 与Adapter 应用实践
在开发android中,ListView 的应用显得非常频繁,只要需要显示列表展示的应用,可以说是必不可少,下面是记录开发中应用到ListView与Adapter 使用的实例: ListView 所在 ...
- Android开发之ListView设置隔行变色
public class HLCheckAdapter extends BaseAdapter { private List<HuoLiang> list; private Context ...
- Android开发之ListView条目批量选择删除
ListView实现的列表,假设是可编辑,可删除的,一般都要提供批量删除功能,否则的话,一项一项的删除体验非常不好,也给用户带来了非常大的麻烦. 实现效果图 详细实现代码 select.xml 主布局 ...
- Android开发之ListView详解 以及简单的listView优化
ListView列表视图 最常用的控件之一,使用场景例如:微信,手机QQ等等. android:divider:每个item之间的分割线,可以使用图片或者色值. android:dividerHeig ...
- android开发之 listview中的item去掉分割线 隐藏分割线
有三种方法: 1> 设置android:divider="@null" 2> android:divider="#00000000" #000000 ...
- 【Android UI】Android开发之View的几种布局方式及实践
引言 通过前面两篇: Android 开发之旅:又见Hello World! Android 开发之旅:深入分析布局文件&又是“Hello World!” 我们对Android应用程序运行原理 ...
- Android开发之Java集合类性能分析
对于Android开发者来说深入了解Java的集合类很有必要主要是从Collection和Map接口衍生出来的,目前主要提供了List.Set和 Map这三大类的集合,今天Android吧(ard8. ...
随机推荐
- ios 兼容IPV4和IPV6网络通信
前言: 苹果官方出了新的规定,要求新上架的app都必须单独支持ipv6-only的网络. 准备工作: 搭建IPV6测试环境:http://blog.csdn.net/potato512/article ...
- 用法简单的图片和视频播放的框架Demo
最近在恶补自己不足的基础知识,偶然在一个QQ群里看到作为同行业的大神们在开源自己的代码.并且在炫耀说让我们找Bug,于是出于好奇就看了下,点开了一个关于图片和视频播放的Demo.也就是接下来我要说的这 ...
- iOS scrollView/tableView滚动到底部
//项目要求tableView滚动到底部就自动加载下一页,UITableView继承自UIScrollView 所以可以在//scrollViewDidEndDecelerating这个方法中进行判断 ...
- Java实战之03Spring-02Spring的核心之IoC
二.Spring的核心之IoC(Inversion of Control 控制反转) 1.IoC是什么? 回顾:连接池原理中的使用. 注意:我们在连接池原理中是使用构造函数注入的,当然还可以通过提供s ...
- [PR & ML 5] [Introduction] Decision Theory
- [翻译][MVC 5 + EF 6] 11:实现继承
原文:Implementing Inheritance with the Entity Framework 6 in an ASP.NET MVC 5 Application 1.选择继承映射到数据库 ...
- CentOS7 systemctl的使用
# 查看正在运行的服务 systemctl # 查看某个服务的状态 systemctl status httpd.service # 启动服务 systemctl start foo.service ...
- PHP中0、空、null和false的总结
php中很多人还不懂php中 0 , '' , null 和 false 之间的区别,这些区别有时会影响到数据判断的正确性和安全性,给程序的测试运行造成很多麻烦.另外在面试题中也会遇到这些问题,如下: ...
- 可以自动安装mysql数据库的一个shell脚本
发布:thatboy 来源:脚本学堂 [大 中 小] 分享一例shell脚本,可以实现mysql数据库的自动安装,脚本写的不错,无论是用来学习,还是生产环境中应用,都是不错的,有需要的朋友 ...
- Django数据库配置
将Django使用数据库由默认的sqlite3更改为mysql: 1.安装mysql驱动程序 MySQLdb(mysql-python) mysqlclient Connector/Python Py ...