我开发了一个Android应用程序,其中所有内容都是从json获取的,这是使用asynctask完成并填充在listviews中。我在应用程序中有近10个自定义列表视图。现在我想在主页中实现单个搜索。我是android的新手。请建议我,如何实现它。仅对json对象中的标题节点进行搜索。我知道如何设置搜索小部件,listview xml,添加清单文件元数据以及搜索活动到主活动。我想知道,如何实现所有自定义列表视图的单一搜索。
我的json文件如下所示。自定义列表视图包含图像,标题和说明。
[
{
"name":"Steve",
"title":"How things work",
"image":url,
},
{
"name":"Jack",
"date":"helium extraction",
"image":url,
}
]
1.首先,创建一个Object User
例如:
public class User{
String name;
String title;
String UrlImage;
// setter
// getter
}
2.然后创建一个ListAdapter extends BaseAdapter
来填充ListView中的数据
(从AndroidHive看这个tutoruel)
另请参阅this tutoriel的TutoZone.info(法语),了解如何在custiom适配器中填充数据
3.对于搜索功能,创建一个包含EditText
searchEditText的布局layout_search
4.在包含带有数据的listView的每个布局中包含此布局(来自Json)
5.在你的asynckTask中,将每个JsonObject
添加到A ArrayList<User>
,在解析结束时,你将拥有一个包含所有数据[User(name, title,url)]
并填充在listView中的arrayList
6.回到搜索功能,在每个活动上为editText添加一个监听器:addTextChangedListener:
EditText fillSearch=(EditText)findViewById(R.id.searchEditText);
fillSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
// TODO Auto-generated method stub
String text = fillSearch.getText().toString().toLowerCase(Locale.getDefault());
ArrayList<User> list = search(text); // our function
}
});
7.添加返回列表的搜索方法包含我们搜索的所有数据(以用户在EditText中输入的文本开头):
public ArrayList<User>search(String s)
{
ArrayList<User> list= new ArrayList<User>();
for (User u: listeUsers) { // listUsers= contains all data parsed in asynckTask
if(User.getTitle().toLowerCase().startsWith(s))
{
list.add(u);
}
}
return list;
}
你可以做一件事来快速搜索,在arrayList中保存所需的数据,只需用“.contains”进行for循环运行
JSONObject jsonObjRecv = HttpClientJSON.SendHttpPost(Appconstants.BASE_URL + Appconstants.DATA, jobjsend);
在使用之后,您将在jsonObjRecv中获得json响应:
title = jsonObjRecv.getString("title");
现在用
if(title.contains(//your search string)){//conditions and code }