从 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();
                    }
                }
            }
        };