当只有一条记录时,Android json搜索将显示2条记录
问题:在Textwatcher中当只有一条记录时,Android json搜索将显示2条记录,android,arrays,json,filter,textwatcher,Android,Arrays,Json,Filter,Textwatcher,问题:在Textwatcher中 当数据与名字eq中的值匹配时,搜索(筛选)显示2条记录当我键入M时,它将显示2条mary记录,但当我键入k时,它显示1条mary kom记录和2条Karl plus记录 json数据 {"details": [ { "id": "01", "name": "Mary Kom", "email": "abc@uvw.in",
当数据与名字eq中的值匹配时,搜索(筛选)显示2条记录当我键入M时,它将显示2条mary记录,但当我键入k时,它显示1条mary kom记录和2条Karl plus记录 json数据
{"details": [
{
"id": "01",
"name": "Mary Kom",
"email": "abc@uvw.in",
"address": "xx-xx-xxxx,x - street, x - country",
"gender" : "male",
"phone": {
"mobile": "+91 0000000000",
"home": "00 000000",
"office": "00 000000"
}
},
{
"id": "02",
"name": "karl plus",
"email": "pqrp@gmail.com",
"address": "xx-xx-xxxx,x - street, x - country",
"gender" : "male",
"phone": {
"mobile": "+91 0000000000",
"home": "00 000000",
"office": "00 000000"
}
}
]}
守则:
public class MainActivity extends ListActivity {
private ProgressDialog pDialog;
EditText inputSearch;
ListAdapter adapter;
// URL to get contacts JSON
private static String url = "http://www.abcd.in/api/details";
// JSON Node names
private static final String TAG_CONTACTS = "contacts";
private static final String TAG_ID = "id";
private static final String TAG_NAME = "name";
private static final String TAG_EMAIL = "email";
private static final String TAG_ADDRESS = "address";
private static final String TAG_GENDER = "gender";
private static final String TAG_PHONE = "phone";
private static final String TAG_PHONE_MOBILE = "mobile";
private static final String TAG_PHONE_HOME = "home";
private static final String TAG_PHONE_OFFICE = "office";
// contacts JSONArray
JSONArray contacts = null;
// Hashmap for ListView
ArrayList<HashMap<String, String>> contactList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contactList = new ArrayList<HashMap<String, String>>();
ListView lv = getListView();
inputSearch = (EditText) findViewById(R.id.inputSearch);
// Enabling Search Filter
inputSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int start, int before, int count) {
// When user change the Text
((SimpleAdapter) adapter).getFilter().filter(cs);
}
@Override
public void beforeTextChanged(CharSequence cs, int start, int count, int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable cs) {
// TODO Auto-generated method stub
}
});
// Listview on item click listener
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// getting values from selected ListItem
String name = ((TextView) view.findViewById(R.id.name)).getText().toString();
String cost = ((TextView) view.findViewById(R.id.email)).getText().toString();
String description = ((TextView) view.findViewById(R.id.mobile)).getText().toString();
// Starting single contact activity
Intent in = new Intent(getApplicationContext(), SingleContactActivity.class);
in.putExtra(TAG_NAME, name);
in.putExtra(TAG_EMAIL, cost);
in.putExtra(TAG_PHONE_MOBILE, description);
startActivity(in);
}
});
// Calling async task to get json
new GetContacts().execute();
}
/**
* Async task class to get json by making HTTP call
* */
private class GetContacts extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// Showing progress dialog
pDialog = new ProgressDialog(MainActivity.this);
pDialog.setMessage("Please wait...");
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected Void doInBackground(Void... arg0) {
// Creating service handler class instance
ServiceHandler sh = new ServiceHandler();
// Making a request to url and getting response
String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);
Log.d("Response: ", "> " + jsonStr);
if (jsonStr != null) {
try {
JSONObject jsonObj = new JSONObject(jsonStr);
// Getting JSON Array node
contacts = jsonObj.getJSONArray(TAG_CONTACTS);
// looping through All Contacts
for (int i = 0; i < contacts.length(); i++) {
JSONObject c = contacts.getJSONObject(i);
String id = c.getString(TAG_ID);
String name = c.getString(TAG_NAME);
String email = c.getString(TAG_EMAIL);
String address = c.getString(TAG_ADDRESS);
String gender = c.getString(TAG_GENDER);
// Phone node is JSON Object
JSONObject phone = c.getJSONObject(TAG_PHONE);
String mobile = phone.getString(TAG_PHONE_MOBILE);
String home = phone.getString(TAG_PHONE_HOME);
String office = phone.getString(TAG_PHONE_OFFICE);
// tmp hashmap for single contact
HashMap<String, String> contact = new HashMap<String, String>();
// adding each child node to HashMap key => value
contact.put(TAG_ID, id);
contact.put(TAG_NAME, name);
contact.put(TAG_EMAIL, email);
contact.put(TAG_PHONE_MOBILE, mobile);
// adding contact to contact list
contactList.add(contact);
}
} catch (JSONException e) {
e.printStackTrace();
}
} else {
Log.e("ServiceHandler", "Couldn't get any data from the url");
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
// Dismiss the progress dialog
if (pDialog.isShowing())
pDialog.dismiss();
/**
* Updating parsed JSON data into ListView
* */
adapter = new SimpleAdapter(MainActivity.this, contactList, R.layout.list_item, new String[]
{ TAG_NAME, TAG_EMAIL, TAG_PHONE_MOBILE }, new int[] { R.id.name,R.id.email, R.id.mobile });
setListAdapter(adapter);
}
}}
public类MainActivity扩展了ListActivity{
私人对话;
编辑文本输入搜索;
列表适配器;
//获取联系人JSON的URL
专用静态字符串url=”http://www.abcd.in/api/details";
//JSON节点名称
专用静态最终字符串标记_CONTACTS=“CONTACTS”;
私有静态最终字符串标记\u ID=“ID”;
私有静态最终字符串标记_NAME=“NAME”;
私有静态最终字符串标记\u EMAIL=“EMAIL”;
私有静态最终字符串标记_ADDRESS=“ADDRESS”;
私有静态最终字符串标记_GENDER=“GENDER”;
专用静态最终字符串标记_PHONE=“PHONE”;
专用静态最终字符串标记\u PHONE\u MOBILE=“MOBILE”;
专用静态最终字符串标记\u PHONE\u HOME=“HOME”;
专用静态最终字符串标记\u PHONE\u OFFICE=“OFFICE”;
//联系JSONArray
JSONArray联系人=null;
//ListView的Hashmap
ArrayList联系人列表;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contactList=新的ArrayList();
ListView lv=getListView();
inputSearch=(EditText)findViewById(R.id.inputSearch);
//启用搜索筛选器
inputSearch.addTextChangedListener(新的TextWatcher(){
@凌驾
public void onTextChanged(字符序列cs、int start、int before、int count){
//当用户更改文本时
((SimpleAdapter)适配器).getFilter().filter(cs);
}
@凌驾
更改前文本之前的公共无效(字符序列cs、int start、int count、int after){
//TODO自动生成的方法存根
}
@凌驾
公共无效后文本更改(可编辑cs){
//TODO自动生成的方法存根
}
});
//单击项目上的Listview侦听器
lv.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
//从选定的ListItem获取值
字符串名称=((TextView)view.findviewbyd(R.id.name)).getText().toString();
字符串成本=((TextView)view.findViewById(R.id.email)).getText().toString();
字符串描述=((TextView)view.findviewbyd(R.id.mobile)).getText().toString();
//启动单一联系人活动
Intent in=新的Intent(getApplicationContext(),SingleContactActivity.class);
in.putExtra(标签名称、名称);
in.putExtra(标签、电子邮件、成本);
in.putExtra(标签、手机、说明);
星触觉(in);
}
});
//调用异步任务以获取json
新建GetContacts().execute();
}
/**
*异步任务类通过HTTP调用获取json
* */
私有类GetContacts扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
//显示进度对话框
pDialog=新建进度对话框(MainActivity.this);
setMessage(“请稍候…”);
pDialog.setCancelable(假);
pDialog.show();
}
@凌驾
受保护的Void doInBackground(Void…arg0){
//创建服务处理程序类实例
ServiceHandler sh=新的ServiceHandler();
//向url发出请求并获得响应
字符串jsonStr=sh.makeServiceCall(url,ServiceHandler.GET);
Log.d(“响应:”、“>”+jsonStr);
if(jsonStr!=null){
试一试{
JSONObject jsonObj=新的JSONObject(jsonStr);
//获取JSON数组节点
contacts=jsonObj.getJSONArray(TAG_contacts);
//通过所有触点循环
对于(int i=0;ivalue
联系人。放置(标签号,ID);
联系人:put(标签名称、姓名);
联系方式:放置(标签、电子邮件、电子邮件);
联系人。放置(标签、手机、手机);
//将联系人添加到联系人列表
联系人列表。添加(联系人);
}
}捕获(JSONException e){
e、 printStackTrace();
}
}否则{
Log.e(“ServiceHandler”,“无法从url获取任何数据”);
}