文档章节

跨应用访问自己定义的ContentProvider,用SearchView搜索关键字(16)

f
 flyqilong
发布于 2016/02/21 21:13
字数 613
阅读 30
收藏 0
//输入分数时精确查找,而输入其他时模糊查找
public class MainActivity extends Activity {
        //访问其他app的ContentProvider暴露出来的authorities示例
	private String student = "content://com.example.providercustomUtils.mycontentprovider/studentinfo";// 就想访问数据库字段,模糊查询
	// student_score访问的是数字,被操作的应用那里要写一个匹配器,/#个是数字的标志
	private String student_score = "content://com.example.providercustomUtils.mycontentprovider/studentinfo_id";
	private ListView listview;
	private SearchView searchView;
	private SimpleAdapter adapter;
	private List<Map<String, String>> list;
	private TextView empty;
	private ContentResolver resolver;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		searchView = (SearchView) this.findViewById(R.id.searchView_main);
		listview = (ListView) this.findViewById(R.id.listView_main_wordslist);
		empty = (TextView) this.findViewById(R.id.text_main_emptyinfo);
		resolver = getContentResolver();
		listview.setEmptyView(empty);
		list = getDataFillListView(null);// 查询文本框传入null,代表刚开始的时候加载全部数据
		adapter = new SimpleAdapter(this, list, R.layout.item_listview,
				new String[] { "sname", "score" }, new int[] {
						R.id.text_item_name, R.id.text_item_score });
		listview.setAdapter(adapter);
		searchView.setOnQueryTextListener(new OnQueryTextListener() {

			@Override
			public boolean onQueryTextSubmit(String query) {
				return false;
			}

			@Override
			// 每次搜索文本框内容改变就会触发 //newText:为查询条件
			public boolean onQueryTextChange(String newText) {
				fillListView(newText);
				return true;// 这里要b把false改为true
			}

		});
	}

	public void fillListView(String newText) {
		// 先把原来的数据清空
		list.clear();
		List<Map<String, String>> newlist = getDataFillListView(newText);
		list.addAll(newlist);
		adapter.notifyDataSetChanged();

	}

	// keywords是搜索条件
	public List<Map<String, String>> getDataFillListView(String keyword) {
		Cursor cursor = null;
		if (keyword == null) {// 空默认查找所有数据
			cursor = resolver.query(Uri.parse(student), null, null, null,
					"score desc");
		} else {
			if (isNumber(keyword)) {// 判断条件是否是数字
				// ContentUris.withAppendedId(contentUri, id),将一个Uri在最后加进id或数字
				cursor = resolver.query(ContentUris.withAppendedId(
						Uri.parse(student_score), Long.parseLong(keyword)),
						null, null, null, null);
			} else {
				cursor = resolver.query(
						ContentUris.withAppendedId(Uri.parse(student),
								Long.parseLong(keyword)), null, null, null,
						null);
			}
		}

		return cursorToList(cursor);
	}

	public List<Map<String, String>> cursorToList(Cursor cursor) {
		List<Map<String, String>> list = new ArrayList<Map<String, String>>();
		while (cursor.moveToNext()) {// 循环:行
			Map<String, String> map = new HashMap<String, String>();
			// key:是columName列名
			for (int i = 0; i < cursor.getColumnCount(); i++) {// 循环:列
				map.put(cursor.getColumnName(i), cursor.getString(i));
			}
			list.add(map);
		}
		cursor.close();
		return list;
	}

	public boolean isNumber(String keyword) {
		// 使用正则表达式判断数字
		Pattern pattern = Pattern.compile("[0-9]+");// 表示至少一个数字
		return pattern.matcher(keyword).matches();
		// 看是否匹配传入的参数再matches()才返回boolean值
	}
}

//主布局文件
    <SearchView
        android:id="@+id/searchView_main"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:iconifiedByDefault="false"
        android:queryHint="请输入关键字查询">
    </SearchView>

    <ListView
        android:id="@+id/listView_main_wordslist"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </ListView>

    <TextView
        android:id="@+id/text_main_emptyinfo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="暂无数据。。。" />
//listview的自定义布局
 <TextView
        android:id="@+id/text_item_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#f00"
        android:text="" />

    <TextView
        android:id="@+id/text_item_score"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="" />


© 著作权归作者所有

f
粉丝 3
博文 93
码字总数 53900
作品 0
Android工程师
私信 提问
一图解惑之Android管理ContentProvider结构

准备 在上图之前还是先简单总结下相关的数据结构类。 在Framework中可以理解为一个ContentProviderRecord对应应用层中的一个ContentProvider,主要的数据结构类和其相关的成员变量在下面简要...

Catsuo
2018/01/10
0
0
Android 搜索框 search dialog 和 search widget

分为search dialog和search widget 区别: A,search dialog是一个被系统控制的UI组件。但他被用户激活的时候,它总是出现在activity的上。 B,Android系统负责处理search dialog上所有的事件,...

CrazyManDF
2016/08/08
168
0
一图解惑之Android调用ContentProvider基本流程

准备 基本使用 ContentProvider作为四大组件之一,在开发过程中经常被使用到。我们的常规做法是定义一个ContentProvider,然后在使用的时候使用ContentResolver提供的接口来访问数据。一个进...

Catsuo
2018/01/10
0
0
android Content Provider 详解

Android中的Contentprovider机制可支持在多个应用中存储和读取数据。这也是跨应用共享数据的唯一方式。在android系统中,没有一个公共的内存区域,供多个应用共享存储数据。 Android提供了一...

鉴客
2011/12/21
39.2K
5
ContentProvider的理解与使用

ContentProvider管理android以结构化方式存放的数据。他以相对安全的方式封装数据并且提供简易的处理机制。Content provider提供不同进程间数据交互的标准化接口。 本文结构: 1.Content Pr...

丁佳辉
2016/06/20
29
1

没有更多内容

加载失败,请刷新页面

加载更多

优雅的关闭Spring Boot

优雅的关闭Spring Boot 1、实现 TomcatConnectorCustomizer 接口拿到Tomcat的连接获取 Tomcat连接池 2、实现 ApplicationListener<ContextClosedEvent> 监听服务器关闭事件,注册JVM钩子函数...

sowhat
今天
2
0
Python3-Web开发

简介 Web开发框架 什么是Web框架? Web应用程序框架或简单的Web框架表示一组库和模块,使Web应用程序开发人员能够编写应用程序,而不必担心协议,线程管理等低级细节。 virtualenv是一个虚拟...

wuxinshui
今天
3
0
使用技媒体实践编写发布博客

技媒体实践博客 CSDN OSChina 知乎 简书 思否 掘金 51CTO

晨猫
今天
2
0
Lucene

1、什么是全文检索 数据分类 我们生活中的数据总体分为两种:结构化数据和非结构化数据。 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。 非结构化数据:指不定长或无固...

榴莲黑芝麻糊
昨天
5
0
python到setuptools、pip工具的安装

python安装 基础开发库   apt-get install gcc  apt-get install openssl libssl-dev 安装数据库和开发库   apt-get install mysql-server libmysqld-dev python环境   下载地址...

问题终结者
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部