Android ListView笔记
来源:互联网 发布:视频会议软件哪个好 编辑:程序博客网 时间:2024/05/22 00:12
1 AdapterView和Adapter
AdapterView的子类有ListView,GridView,可通过继承自它们来自定义此类型的view,并通过实现AdapterView.OnItemClickListener接口来响应AdapterView中每一项上的点击事件,布局文件中对应等标签为:<ListView>、<GridView>。
Adapter充当数据源与AdapterView之间的桥梁,Adapter将数据与其布局绑定,并将每条数据转换为AdapterView中的一条项目。
2 Adapter
Adaper的子类有ArrayAdapter,SimpleCursorAdapter等,当数据源比较复杂时,可以通过继承BaseAdapter类来实现。
(1)ArrayAdapter:数据源为数组时使用此适配器;
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myStringArray);// 构造函数的参数:context,每个项目的布局,数据数组 ListView listView = (ListView) findViewById(R.id.listview);listView.setAdapter(adapter);
(2)SimpleCursorAdapter:数据来自Cursor类时使用此适配器;当使用ContentResolver或从SQLite请求数据时,就将返回cursor对象。
String[] fromColumns = {ContactsContract.Data.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER};int[] toViews = {R.id.display_name, R.id.phone_number};// SimpleCursorAdapter会使用提供的布局,将每个fromColumns项插入对应的toViews视图,为Cursor中的每个行创建一个视图SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.person_name_and_number, cursor, fromColumns, toViews, 0);ListView listView = getListView();listView.setAdapter(adapter);
3 ListView的优化
(1)使用convertView和ViewHolder
(2)getView()方法里不要有耗时任务
(3)异步加载数据
(4)滑动时停止加载(避免滑动时加载数据造成开销太大,停止滑动时再加载数据),分页加载(每次只加载一部分数据),通过实现AbsListView.OnScrollListener接口,并实现onScrollStateChanged(),onScroll()方法来实现;
(5)硬件加速:<listview>设置属性android:hardwareAccelerate="true";
android:scrollingCache="false"默认开启,会消耗大量内存
android:animationCache="false"
(6)item层级不要太高
4 convertView和ViewHolder
ListView的getView()方法中,会调用inflater.inflater(...)来加载每个item的布局来获得view,重用convertview可避免每次获得view都去新建一个view;
当需要获取某个view时,使用findViewById()耗时较大,可使用内部静态内ViewHolder,并用过setTag,getTag来获取view。
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; //判断是否有缓存 if (convertView == null) { //通过LayoutInflate实例化布局 viewHolder = new ViewHolder(); convertView = mInflater.inflate(R.layout.item_layout, parent, false); viewHolder.ivIcon = (ImageView) convertView.findViewById(R.id.iv_icon); viewHolder.tvTitle = (TextView) convertView.findViewById(R.id.tv_title); viewHolder.tvContent = (TextView) convertView.findViewById(R.id.tv_content); convertView.setTag(viewHolder); } else { //通过tag找到缓存的布局 viewHolder = (ViewHolder) convertView.getTag(); } return convertView; }内部静态类ViewHolder:
static class ViewHolder { TextView text; TextView timestamp; ImageView icon; ProgressBar progress; int position;}
5 异步加载
(1)新建一个线程,使用Handler方式来执行加载数据的任务;
(2)使用AysncTask类,在doInBackground()中加载数据,并重写onPostExecute(Bitmap result);
(3)使用加载器;
6 加载器
1 加载器相关API
LoaderManager:用于管理一个或多个 Loader 实例;
LoaderManager.LoaderCallbacks:回调接口,用于客户端通过LoaderManager管理Loader时会回调该接口中的方法;
Loader:执行异步数据加载的加载器类;
AsyncTaskLoader:提供AysncTask来执行工作的抽象加载器;
CursorLoader:AsyncTaskLoader的子类,它将查询ContentResolver并返回一个Cursor;
此外,您可以通过继承自AsyncTaskLoader来异步加载自定义的数据源。
2 LoaderManager 将自动管理加载器的生命周期。LoaderManager 将根据需要启动和停止加载,并维护加载器的状态及其相关内容。LoaderManager 将自动管理加载器的生命周期。您不必直接使用Loader的引用。当特定事件发生时,通常会使用LoaderManager.LoaderCallbacks方法干预加载进程。
3 LoaderManager常用方法
(1)启动加载器:getLoaderManager().initLoader(0,null, this);
第1个参数是标识加载器的唯一ID,第2个参数是可选参数,第三个参数是LoaderManager.LoaderCallbacks实现,LoaderManager将调用此实现来报告加载器事件。将触发LoaderManager.LoaderCallbacks的方法onCreateLoader();
(2)重启加载器:getLoaderManager().restartLoader(0,null, this);
4 LoaderManager.LoaderCallbacks 包括以下方法:
onCreateLoader():针对指定的 ID 进行实例化并返回新的Loader,可以在此方法中创建新加载器;
onLoadFinished() :将在先前创建的加载器完成加载时调用;
onLoaderReset():将在先前创建的加载器重置且其数据因此不可用时调用;
- Android学习笔记--ListView
- Android ListView 学习笔记
- Android笔记-ListView总结
- Android ListView学习笔记
- android笔记-- listview
- Android笔记之listView
- android笔记5-listView
- Android ListView 小笔记
- Android笔记-ListView总结
- android开发笔记:listview
- 【Android笔记】ListView
- Android ListView代码笔记
- Android学习笔记-ListView
- Android ListView笔记
- android组件ListView学习笔记
- android学习笔记之ListView
- android学习笔记 Listview adapter
- android学习笔记19:ListView
- What are some of the most basic things every programmer should know?
- 变量
- Linux和Windows学习日记5
- WINDOWS API ——CREATEMUTEX——创建互斥对象(转)
- rails配置报错邮件告警最最简单例子
- Android ListView笔记
- LightOJ
- JavaScript中String类型的方法
- maven install时Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.5:test
- SpringMvc 中全局异常处理
- 端口被占用解决办法
- 通过AsyncTask异步获取网络图片
- java调用js
- SQL自定义函数