2017-03-16 1 views
-1

Je reçois des données de JSON au-dessous le formatKey Value De JSON dans AutoCompleteEditText

{ 
    "success": 1, 
    "message": "done", 
    "data": [ 
    { 
     "name": "Central Construction", 
     "id": 11 
    }, 
    { 
     "name": "IT", 
     "id": 12 
    }, 
    { 
     "name": "Marketing", 
     "id": 13 
    }, 
    { 
     "name": "Sales", 
     "id": 14 
    } 
    ] 
} 

Dans ma réponse je reçois l'objet à partir de données et de le stocker dans mon modèle

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

Et enfin dans mon 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(); 

      } 
     }); 

dans le Toast je peux voir le nom qui a choisi et elle fixe également dans le E ditText, cependant je suis actuellement incapable d'enregistrer l'identifiant du nom sélectionné, car je dois utiliser/poster cela sur le serveur. J'ai vu pas mal de questions sur stackoverflow et j'ai aussi essayé de les implémenter mais je n'ai pas eu de chance. Je montre le nom sur AutoCompeleteEditText. J'ai besoin de stocker la valeur d'id dans une variable à envoyer au serveur.

Any Suggestion comment je peux obtenir l'ID quand le nom est choisi?

+0

Est-ce logique pour vous de montrer l'ID sur la AutoCompleteEditText? C'est bizarre – xiaoyuan

+0

@xiaoyuan je ne montre pas l'ID sur AutoComplete je montre le nom, cependant le nom qui est choisi, j'ai besoin de stocker l'ID en valeur int et afficher cette valeur sur le serveur – chirag90

+0

Mais vous avez stocké tous les noms et les identifiants dans 'staffName', le résultat est tout Les données seront affichées sur AutoCompleteEditText. – xiaoyuan

Répondre

0

Merci à tous pour vos réponses utiles et commentaires, j'ai maintenant résolu mon problème en créant un adaptateur personnalisé.

Parsing JSON Valeur

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

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

Et enfin je créé un adaptateur personnalisé appelé 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(); 
        } 
       } 
      } 
     }; 
-1

Modifier votre modèle comme ci-dessous:

public class StaffResponseModel { 
    public int success; 
    public String message; 
    public List<StaffData> data; 

    public static class StaffData { 
     public String name; 
     public int id; 
    } 

}

alors obtenir des données de JSON comme ci-dessous:

StaffResponseModel staffResponseModel = gson.fromJson(response, new TypeToken<StaffResponseModel>(){}.getType()); 

Enfin:

staffName = new ArrayList<String>(); 
for(StaffResponseModel.StaffData staff : staffResponseModel.data) { 
    staffName.add(staff.name); 
    staffName.add(String.valueOf(staff.id)); 
} 
setUpAutoComplete(); 
+0

Salut, désolé je pense que je ne me suis pas expliqué correctement, j'ai besoin de stocker la valeur de l'ID dans int, et le poster sur le serveur à nouveau. Cependant j'ai essayé de faire un Toast avec adapter.getItem (index + 1) .toString(), mais cela montre le nom suivant, pas l'id. – chirag90

+0

Modifiez votre modèle comme ci-dessous 'public class StaffResponseModel { public int success; public String message; public Liste données; Public static class StaffData { public Nom de la chaîne; public int id; }} ' alors obtenir des données de JSON comme ci-dessous: ' staffResponseModel = gson.fromJson (réponse, nouvelle getType() TypeToken () {}.); ' –

+0

j'ai réussi à résoudre le problème maintenant i a dû créer un nouvel adaptateur personnalisé. – chirag90