2016-05-23 5 views
0

Ich versuche, Liste der Dienste von Web-Service zu holen und es zu Autocompletetextview hinzufügen. Angenommen, Sie geben "a" ein, erhalten Sie die folgende Liste von Diensten in der AutocompleteTextview. Ich denke, es ist ein JSON-Array, aber ich bekomme Fehler "Json error: Value Body Spa at 0 of type java.lang.String cannot be converted to JSONArray". Bitte korrigieren Sie mich, wenn ich das falsch mache.set jsonarray list in autocompletetextview

// you get this json response on entering "a" 
 

 
[ 
 
    "Body Spa", 
 
    "Hair Cut", 
 
    "Hair massage", 
 
    "fghfghfgh", 
 
    "rtyrt", 
 
    "Gold Facial", 
 
    "Foot's massage" 
 
]
public class HomeOptionTwo extends Fragment implements TextWatcher{ 
 

 
    AutoCompleteTextView autoservice; 
 
    String[] list; 
 
    ArrayAdapter<String> adapter; 
 

 
    private static final String SERVICE = "http://192.168.200.1/android/spaservice"; 
 

 
    @Nullable 
 
    @Override 
 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
 
     return inflater.inflate(R.layout.homeoptiontwo, container, false); 
 
    } 
 

 
    @Override 
 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
 
     super.onViewCreated(view, savedInstanceState); 
 

 
     autoservice = (AutoCompleteTextView)view.findViewById(R.id.service); 
 

 

 
     autoservice.addTextChangedListener(this); 
 

 

 

 

 

 
    } 
 

 
    private void prepareMyList() { 
 

 
     StringRequest stringRequest = new StringRequest(Request.Method.POST, SERVICE, 
 
       new Response.Listener<String>() { 
 
        @Override 
 
        public void onResponse(String response) { 
 

 
         try { 
 
          //JSONObject jObj = new JSONObject(response); 
 

 
          JSONArray jsonarray = new JSONArray(response); 
 
          for (int i = 0; i < jsonarray.length(); i++) { 
 
           Toast.makeText(getActivity(), "services:" + jsonarray.getJSONArray(i), Toast.LENGTH_SHORT).show(); 
 

 
           adapter = new ArrayAdapter<String>(
 
             getActivity(), 
 
             android.R.layout.simple_dropdown_item_1line, 
 
             list); 
 

 
           autoservice.setAdapter(adapter); 
 
          } 
 

 

 

 

 

 
         } catch (JSONException e) { 
 
          // JSON error 
 
          e.printStackTrace(); 
 
          Toast.makeText(getActivity(), "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show(); 
 
         } 
 
        } 
 
       }, new Response.ErrorListener() { 
 
      @Override 
 
      public void onErrorResponse(VolleyError error) { 
 
       Toast.makeText(getActivity(), "VolleyError" + error.toString(), Toast.LENGTH_LONG).show(); 
 
      } 
 
     }) { 
 
      @Override 
 
      protected Map<String, String> getParams() { 
 
       Map<String, String> params = new HashMap<String, String>(); 
 
       params.put("'phrase", autoservice.getText().toString()); 
 
       return params; 
 
      } 
 

 
     }; 
 

 
     RequestQueue requestQueue = Volley.newRequestQueue(getActivity()); 
 
     requestQueue.add(stringRequest); 
 
    } 
 

 

 
    @Override 
 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
 

 
    } 
 

 
    @Override 
 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
 
     prepareMyList(); 
 

 
    } 
 

 
    @Override 
 
    public void afterTextChanged(Editable s) { 
 

 
    } 
 
}

+0

JSONArray enthält die Liste der Zeichenfolgen, Sie holen Array aus dem Array, die falsch ist. Ändern Sie Ihren Toast auf 'Toast.makeText (getActivity()," Dienste: "+ jsonarray.getString (i), Toast.LENGTH_SHORT) .show();' –

+0

Sie brauchen keine 'TextWatcher' /' addTextChangedListener' noch asynchrone Voley-Anfragen, siehe http://stackoverflow.com/a/19860624/2252830 – pskink

+0

Ich benutze volley, da der Web-Service die gesamte Liste von 36 Items entsprechend dem eingegebenen Text filtert. Nun, mein aktuelles Problem ist, dass ich alle 36 Elemente bekomme, auch wenn ich einen Text eintrage, der die Objektliste reduzieren sollte. @pskink –

Antwort

1

hier:

Toast.makeText(getActivity(), 
    "services:" + jsonarray.getJSONArray(i), Toast.LENGTH_SHORT).show(); 

jsonarray enthält String als Element statt JSONArray. Verwenden Sie optString oder getString, um den Wert von jsonarray JSONArray mit Index zu erhalten. like:

ArrayList<String> arrList=new ArrayList<String>(); 
for (int i = 0; i < jsonarray.length(); i++) { 
    String strValue=jsonarray.optString(i);        
    arrList.add(strValue); 
} 
    adapter = new ArrayAdapter<String>(
       getActivity(), 
       android.R.layout.simple_dropdown_item_1line, 
       arrList); 

    autoservice.setAdapter(adapter); 
+0

Vielen Dank. Jetzt zumindest habe ich verstanden, was falsch war. Es funktioniert jetzt gut. @ ρяσѕρєя K. –

+0

Wenn es geholfen hat, bitte akzeptieren Sie die Antwort, um es geschlossen zu machen. –