从 json 到自动完成 EditText 的键值
Key Value From json into AutoCompleteEditText
我正在从 JSON 获取以下格式的数据
{
"success": 1,
"message": "done",
"data": [
{
"name": "Central Construction",
"id": 11
},
{
"name": "IT",
"id": 12
},
{
"name": "Marketing",
"id": 13
},
{
"name": "Sales",
"id": 14
}
]
}
在我的回复中,我从数据中获取对象并将其存储在我的模型中
JSONObject parentObject = new JSONObject(response);
JSONArray parentArray = parentObject.getJSONArray("data");
staffData = gson.fromJson(parentArray.toString(),StaffResponseModel.StaffData[].class);
staffName = new ArrayList<String>();
for(StaffResponseModel.StaffData staff : staffData) {
staffName.add(staff.getName());
staffName.add(String.valueOf(staff.getId()));
}
setUpAutoComplete();
最后在我的 SetupAutoComplete
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.support_simple_spinner_dropdown_item,staffName);
visitingStaffTextView.setAdapter(adapter);
visitingStaffTextView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int index, long l) {
String staff = adapter.getItem(index).toString();
Toast.makeText(visitorSignInActivity.this,staff,Toast.LENGTH_LONG).show();
}
});
在 Toast 中,我可以看到选择的名称,并将其设置在 EditText 中,但是我目前无法保存所选名称的 ID,因为我需要将其 use/post 保存到服务器。我在 Whosebug 上看到了很多问题,也试图实现它们,但没有成功。
我在 AutoCompeleteEditText 上显示名称。我需要将 id 值存储在变量中 post 到服务器。
关于我如何在选择名称时获取 ID 的任何建议?
修改您的模型如下:
public class StaffResponseModel {
public int success;
public String message;
public List<StaffData> data;
public static class StaffData {
public String name;
public int id;
}
}
然后从 json 获取数据,如下所示:
StaffResponseModel staffResponseModel = gson.fromJson(response, new TypeToken<StaffResponseModel>(){}.getType());
最后:
staffName = new ArrayList<String>();
for(StaffResponseModel.StaffData staff : staffResponseModel.data) {
staffName.add(staff.name);
staffName.add(String.valueOf(staff.id));
}
setUpAutoComplete();
感谢大家的有用回答和评论,我现在已经通过创建自定义适配器解决了我的问题。
解析JSON值
try {
JSONObject parentObject = new JSONObject(response);
JSONArray parentArray = parentObject.getJSONArray("data");
staffData = gson.fromJson(parentArray.toString(), StaffResponseModel.StaffData[].class);
visitList = new ArrayList<VisitorSignInModel>();
visitorSignInModel visit;
for(StaffResponseModel.StaffData staff : staffData) {
visit = new VisitorSignInModel();
visit.setName(staff.getName());
visit.setId(String.valueOf(staff.getId()));
visitList.add(visit);
}
setUpAutoComplete();
} catch (JSONException e) {
e.printStackTrace();
}
我的 setUpAutoComplete 函数
private void setUpAutoComplete() {
final ArrayAdapter<VisitorSignInModel> adapter = new VisitorAdapter(this, R.id.lbl_name, visitList);
visitingStaffTextView.setAdapter(adapter);
visitingStaffTextView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int index, long l) {
String staff = adapter.getItem(index).getName().toString();
staffSelectedId = (adapter.getItem(index).getId());
Toast.makeText(visitorSignInActivity.this, staffSelectedId ,Toast.LENGTH_LONG).show();
}
});
}
最后我创建了一个名为 VisitorAdapter 的自定义适配器
public class VisitorAdapter extends ArrayAdapter<VisitorSignInModel> {
Context context;
List<VisitorSignInModel> items, tempItems, suggestions;
public VisitorAdapter(Context context, int textViewResourceId, List<VisitorSignInModel> items) {
super(context, textViewResourceId, items);
this.context = context;
this.items = items;
tempItems = new ArrayList<VisitorSignInModel>(items); // this makes the difference.
suggestions = new ArrayList<VisitorSignInModel>();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.row_visitor, parent, false);
}
VisitorSignInModel people = items.get(position);
if (people != null) {
TextView lblName = (TextView) view.findViewById(R.id.lbl_name);
if (lblName != null)
lblName.setText(people.getName());
}
return view;
}
@Override
public Filter getFilter() {
return nameFilter;
}
/**
* Custom Filter implementation for custom suggestions we provide.
*/
Filter nameFilter = new Filter() {
@Override
public CharSequence convertResultToString(Object resultValue) {
String str = ((VisitorSignInModel) resultValue).getName();
return str;
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
if (constraint != null) {
suggestions.clear();
for (VisitorSignInModel people : tempItems) {
if (people.getName().toLowerCase().contains(constraint.toString().toLowerCase())) {
suggestions.add(people);
}
}
FilterResults filterResults = new FilterResults();
filterResults.values = suggestions;
filterResults.count = suggestions.size();
return filterResults;
} else {
return new FilterResults();
}
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
List<VisitorSignInModel> filterList = (ArrayList<VisitorSignInModel>) results.values;
if (results != null && results.count > 0) {
visitList.clear();
for (VisitorSignInModel people : filterList) {
visitList.add(people);
notifyDataSetChanged();
}
}
}
};
我正在从 JSON 获取以下格式的数据
{
"success": 1,
"message": "done",
"data": [
{
"name": "Central Construction",
"id": 11
},
{
"name": "IT",
"id": 12
},
{
"name": "Marketing",
"id": 13
},
{
"name": "Sales",
"id": 14
}
]
}
在我的回复中,我从数据中获取对象并将其存储在我的模型中
JSONObject parentObject = new JSONObject(response);
JSONArray parentArray = parentObject.getJSONArray("data");
staffData = gson.fromJson(parentArray.toString(),StaffResponseModel.StaffData[].class);
staffName = new ArrayList<String>();
for(StaffResponseModel.StaffData staff : staffData) {
staffName.add(staff.getName());
staffName.add(String.valueOf(staff.getId()));
}
setUpAutoComplete();
最后在我的 SetupAutoComplete
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.support_simple_spinner_dropdown_item,staffName);
visitingStaffTextView.setAdapter(adapter);
visitingStaffTextView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int index, long l) {
String staff = adapter.getItem(index).toString();
Toast.makeText(visitorSignInActivity.this,staff,Toast.LENGTH_LONG).show();
}
});
在 Toast 中,我可以看到选择的名称,并将其设置在 EditText 中,但是我目前无法保存所选名称的 ID,因为我需要将其 use/post 保存到服务器。我在 Whosebug 上看到了很多问题,也试图实现它们,但没有成功。
我在 AutoCompeleteEditText 上显示名称。我需要将 id 值存储在变量中 post 到服务器。
关于我如何在选择名称时获取 ID 的任何建议?
修改您的模型如下:
public class StaffResponseModel {
public int success;
public String message;
public List<StaffData> data;
public static class StaffData {
public String name;
public int id;
}
}
然后从 json 获取数据,如下所示:
StaffResponseModel staffResponseModel = gson.fromJson(response, new TypeToken<StaffResponseModel>(){}.getType());
最后:
staffName = new ArrayList<String>();
for(StaffResponseModel.StaffData staff : staffResponseModel.data) {
staffName.add(staff.name);
staffName.add(String.valueOf(staff.id));
}
setUpAutoComplete();
感谢大家的有用回答和评论,我现在已经通过创建自定义适配器解决了我的问题。
解析JSON值
try {
JSONObject parentObject = new JSONObject(response);
JSONArray parentArray = parentObject.getJSONArray("data");
staffData = gson.fromJson(parentArray.toString(), StaffResponseModel.StaffData[].class);
visitList = new ArrayList<VisitorSignInModel>();
visitorSignInModel visit;
for(StaffResponseModel.StaffData staff : staffData) {
visit = new VisitorSignInModel();
visit.setName(staff.getName());
visit.setId(String.valueOf(staff.getId()));
visitList.add(visit);
}
setUpAutoComplete();
} catch (JSONException e) {
e.printStackTrace();
}
我的 setUpAutoComplete 函数
private void setUpAutoComplete() {
final ArrayAdapter<VisitorSignInModel> adapter = new VisitorAdapter(this, R.id.lbl_name, visitList);
visitingStaffTextView.setAdapter(adapter);
visitingStaffTextView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int index, long l) {
String staff = adapter.getItem(index).getName().toString();
staffSelectedId = (adapter.getItem(index).getId());
Toast.makeText(visitorSignInActivity.this, staffSelectedId ,Toast.LENGTH_LONG).show();
}
});
}
最后我创建了一个名为 VisitorAdapter 的自定义适配器
public class VisitorAdapter extends ArrayAdapter<VisitorSignInModel> {
Context context;
List<VisitorSignInModel> items, tempItems, suggestions;
public VisitorAdapter(Context context, int textViewResourceId, List<VisitorSignInModel> items) {
super(context, textViewResourceId, items);
this.context = context;
this.items = items;
tempItems = new ArrayList<VisitorSignInModel>(items); // this makes the difference.
suggestions = new ArrayList<VisitorSignInModel>();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.row_visitor, parent, false);
}
VisitorSignInModel people = items.get(position);
if (people != null) {
TextView lblName = (TextView) view.findViewById(R.id.lbl_name);
if (lblName != null)
lblName.setText(people.getName());
}
return view;
}
@Override
public Filter getFilter() {
return nameFilter;
}
/**
* Custom Filter implementation for custom suggestions we provide.
*/
Filter nameFilter = new Filter() {
@Override
public CharSequence convertResultToString(Object resultValue) {
String str = ((VisitorSignInModel) resultValue).getName();
return str;
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
if (constraint != null) {
suggestions.clear();
for (VisitorSignInModel people : tempItems) {
if (people.getName().toLowerCase().contains(constraint.toString().toLowerCase())) {
suggestions.add(people);
}
}
FilterResults filterResults = new FilterResults();
filterResults.values = suggestions;
filterResults.count = suggestions.size();
return filterResults;
} else {
return new FilterResults();
}
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
List<VisitorSignInModel> filterList = (ArrayList<VisitorSignInModel>) results.values;
if (results != null && results.count > 0) {
visitList.clear();
for (VisitorSignInModel people : filterList) {
visitList.add(people);
notifyDataSetChanged();
}
}
}
};