Android Api Demos登顶之路(四十五)Loader-->Cursor
这个demo演示了类载入器的用法。关于类载入器的使用我们在前面的demo中已经介绍过了 在此再小小的复习一下。
类载入器的使用步骤:
* 1.获取类载入器的管理者LoaderManager manager = tent.getLoaderManager();
* 2.初始化loader
MainActivity
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FragmentManager fm = getFragmentManager();
// 推断一下假设activity中没有载入视图,则创建新的视图并载入
if (fm.findFragmentById(android.R.id.content) == null) {
CursorLoaderListFragment frg = new CursorLoaderListFragment();
fm.beginTransaction().add(android.R.id.content, frg).commit();
}
}
public class CursorLoaderListFragment extends ListFragment implements
OnQueryTextListener, OnCloseListener {
private SimpleCursorAdapter mAdapter;
private MySearchView mySearchView;
private String mCurrentFilter;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// 当查询结果为空,listview中无显示内容时,设置显示的提示信息
setEmptyText("No phone numbers!");
// 设置显示actionbar
setHasOptionsMenu(true);
mAdapter = new SimpleCursorAdapter(getActivity(),
android.R.layout.simple_list_item_2, null, new String[] {
Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS },
new int[] { android.R.id.text1, android.R.id.text2 }, 0);
setListAdapter(mAdapter);
// 此时不显示列表。由于数据还没准备好
setListShown(false);
// 获取类载入器的管理者,并初始化
getLoaderManager().initLoader(0, null, myLoader);
}
// 定义要查询的内容
private final String[] CONTACTS_SUMMARY_PROJECTION = new String[] {
Contacts._ID, Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS,
Contacts.CONTACT_PRESENCE, Contacts.PHOTO_ID,
Contacts.LOOKUP_KEY };
private LoaderCallbacks<Cursor> myLoader = new LoaderCallbacks<Cursor>() {
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Uri baseUri;
if (mCurrentFilter != null) {
// 假设查询条件不为空,则在原来的基础上追加查询条件
baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI,
Uri.encode(mCurrentFilter));
} else {
baseUri = Contacts.CONTENT_URI;
}
// 定义查询条件
String selection = "((" + Contacts.DISPLAY_NAME
+ " NOTNULL) AND (" + Contacts.HAS_PHONE_NUMBER
+ "=1) AND (" + Contacts.DISPLAY_NAME + " != '' ))";
return new CursorLoader(getActivity(), baseUri,
CONTACTS_SUMMARY_PROJECTION, selection, null,
Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
// 载入完毕交换查询结果
mAdapter.swapCursor(cursor);
//假设Fragment处于恢复状态中则显示载入动画,否则不显示载入动画
//数据准备完毕,显示列表
if(isResumed()){
setListShown(true);
}else{
setListShownNoAnimation(true);
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
//重新启动载入器时首先要确保清除旧的数据
mAdapter.swapCursor(null);
}
};
// 自己定义搜索视图
public class MySearchView extends SearchView {
public MySearchView(Context context) {
super(context);
}
// 正常情况下serchView在收缩的时候是不会清空当中的内容的
// 这里我们须要重写收缩时的方法,在收缩时清空内容
@Override
public void onActionViewCollapsed() {
// 仅仅更新查询内容不提交查询
setQuery("", false);
super.onActionViewCollapsed();
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
MenuItem item = menu.add("search");
item.setIcon(android.R.drawable.ic_menu_search);
// 设置item的显示方式
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM
| MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
mySearchView = new MySearchView(getActivity());
// 监听查询内容的变化
mySearchView.setOnQueryTextListener(this);
mySearchView.setOnCloseListener(this);
//设置搜索框默认自己主动缩小为图标
mySearchView.setIconifiedByDefault(true);
//设置item的动作视图,按下前仅仅显示小图标。按下后展开显示
item.setActionView(mySearchView);
}
@Override
public boolean onQueryTextSubmit(String query) {
// 不必关心是否提交。在查询内容发生变化时就已经作出了处理
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
String newFilter = !TextUtils.isEmpty(newText) ?
newText : null;
// 当查询条件没有变化时,不做不论什么事,仅仅是返回true。
if (mCurrentFilter == null && newFilter == null) {
return true;
}
if (mCurrentFilter != null && mCurrentFilter.equals(newFilter)) {
return true;
}
mCurrentFilter = newFilter;
// 重新启动载入器
getLoaderManager().restartLoader(0, null, myLoader);
return true;
}
@Override
public boolean onClose() {
// 将查询内容置空
if (!TextUtils.isEmpty(mySearchView.getQuery())) {
mySearchView.setQuery(null, true);
}
return true;
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Toast.makeText(getActivity(), "Item clicked:" + id, 0).show();
}
}
}
配置文件里加入权限
<uses-permission android:name="android.permission.READ_CONTACTS"/>
Android Api Demos登顶之路(四十五)Loader-->Cursor的更多相关文章
- 测开之路四十五:Django之最小程序
安装Django库 Django最小程序 import sysfrom django.conf.urls import urlfrom django.conf import settingsfrom ...
- 孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备
孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天本来应当继续学习Python的数据库操作,但根据过去我自 ...
- Gradle 1.12用户指南翻译——第四十五章. 应用程序插件
本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- 《手把手教你》系列技巧篇(四十五)-java+ selenium自动化测试-web页面定位toast-上篇(详解教程)
1.简介 在使用appium写app自动化的时候介绍toast的相关元素的定位,在Web UI测试过程中,也经常遇到一些toast,那么这个toast我们这边如何进行测试呢?今天宏哥就分两篇介绍一下. ...
- NeHe OpenGL教程 第四十五课:顶点缓存
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- SQL注入之Sqli-labs系列第四十一关(基于堆叠注入的盲注)和四十二关四十三关四十四关四十五关
0x1普通测试方式 (1)输入and1=1和and1=2测试,返回错误,证明存在注入 (2)union select联合查询 (3)查询表名 (4)其他 payload: ,( ,( 0x2 堆叠注入 ...
- “全栈2019”Java第四十五章:super关键字
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- (十四--十五)数据库查询优化Part I
(十四--十五)数据库查询优化Part I 如果理解的有问题.欢迎大家指出.这也是我在看课记得笔记..可能会有很多问题 查询优化的重要性 请记住用户只会告诉DMBS他们想要什么样的结果,而不会告诉他们 ...
- 第四十五个知识点:描述一些对抗RSA侧信道攻击的基础防御方法
第四十五个知识点:描述一些对抗RSA侧信道攻击的基础防御方法 原文地址:http://bristolcrypto.blogspot.com/2015/08/52-things-number-45-de ...
随机推荐
- CREATE CONVERSION - 定义一个用户定义的码制转换
SYNOPSIS CREATE [DEFAULT] CONVERSION name FOR source_encoding TO dest_encoding FROM funcname DESCRIP ...
- Python的前世今生
放弃 拾起 放弃 拾起 最终决定好好的编写一次Python的学习笔记 人生苦短,我用Python --------------Life is short, you need Python 再不抓紧,就 ...
- 通过JS判断联网类型和连接状态的实现代码
<!DOCTYPE HTML><html xmlns="http://www.w3.org/1999/xhtml" lang="en"> ...
- struct 和class 区别
最开始,就让我们来讨论一下一个最最基本,也最最容易被人忽视掉的问题——C++中的struct和class有什么区别?如果谈到C中的struct和C++中的class的区别,你应该会告诉我很多.但我现在 ...
- npm run build报错(npm ERR! code ELIFECYCLE)的解决办法
具体报错如下图: 环境:centos7 应该node_modules安装问题,我们需要重新安装 rm -rf node_modules rm package-lock.json npm cache c ...
- eclipse之版本代号
- 集训第四周(高效算法设计)H题 (贪心)
Description Most financial institutions had become insolvent during financial crisis and went bank ...
- admin——django自带数据库管理工具
admin是Django自带的数据库管理工具,是一个app 在admin.py中可以自己定制类来使admin数据库管理页面展现自己想要查看的信息 models.py from django.db im ...
- allegro学习--区域约束
前言: 在有些情况需要我们在走线时在某些区域的时候,线是细的,例如BGA封装的FPGA在引出线的时候,我们希望在FPGA内部的线细,出了FPGA后,线变粗.如图: 这就用到了区域的规则约束. 实现: ...
- QueryParser
[概述] 其他工具类使用比较方便,但不够灵活.QueryParser也实现了较多的匹配方式. [QueryParser的应用] /** * 使用QueryParser进行查询 * @throws Pa ...