//输入分数时精确查找,而输入其他时模糊查找
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="" />
转载于:https://my.oschina.net/u/2541146/blog/618306