2016-05-23 4 views
-1

У меня есть autocompletetext, для которого я получаю предложения от веб-службы, используя volley stringrequest. Теперь проблема в том, что ArrayList не очищается, так как каждый раз, когда я делаю запрос, старые элементы добавляются в список. Я попробовал adapter.clear(), но он дает мне NullPointerException. Поэтому любая помощь, чтобы очистить это, чтобы список не содержал старые элементы, будет очень оценен.autocompletetextview не обновляется

LogCat: 
 

 
FATAL EXCEPTION: main 
 
Process: com.sam.ubooktoday, PID: 24983 
 
java.lang.NullPointerException 
 
at com.sam.ubooktoday.view.fragments.HomeOptionTwo$1.onResponse(HomeOptionTwo.java:88) 
 
at com.sam.ubooktoday.view.fragments.HomeOptionTwo$1.onResponse(HomeOptionTwo.java:69) 
 
at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:60) 
 
at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30) 
 
at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) 
 
at android.os.Handler.handleCallback(Handler.java:808) 
 
at android.os.Handler.dispatchMessage(Handler.java:103) 
 
at android.os.Looper.loop(Looper.java:193) 
 
at android.app.ActivityThread.main(ActivityThread.java:5388) 
 
at java.lang.reflect.Method.invokeNative(Native Method) 
 
at java.lang.reflect.Method.invoke(Method.java:515) 
 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:655) 
 
at dalvik.system.NativeStart.main(Native Method)
// if you press 'na' json response is: 
 

 
[ 
 
    "Manicure and Pedicure ", 
 
    "Manicures", 
 
    "Pedicures", 
 
    "Student Specials Under 18 Years", 
 
    "Hand & Foot Care and Repair", 
 
    "Nail Art Design ", 
 
    "Polish Change", 
 
    "Kids Menu under 12 years", 
 
    "Healthy Nail Dip in powder", 
 
    "Nail Enhancement", 
 
    "Full Set", 
 
    "Fill Ins" 
 
]
public class HomeOptionTwo extends Fragment implements TextWatcher{ 
 

 
    AutoCompleteTextView autoservice; 
 
    ArrayList<String> arrList = new ArrayList<String>(); 
 
    ArrayAdapter<String> adapter; 
 

 
    private static final String SERVICE = "http://example.com/android/services"; 
 

 
    @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 { 
 

 

 

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

 
           String strValue = jsonarray.getString(i); 
 

 

 
           arrList.add(strValue); 
 

 
          } 
 

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

 

 
          autoservice.setThreshold(1); 
 

 
          if(adapter!=null){adapter.clear();} 
 
          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

Вероятно, 'adapter.clear();' строка вызывает проблему. используйте его как 'if (adapter! = null) {adapter.clear();}' –

+0

Должен ли я использовать 'if (adapter! = null) {adapter.clear();}' после 'autoservice.setAdapter (adapter)' ? –

+0

Используйте 'if (adapter! = Null) {adapter.clear();}' строка перед 'autoservice.setAdapter (адаптер);' –

ответ

1

Вам не нужно, чтобы очистить адаптер, как вы устанавливаете новый адаптер каждый раз, но вам необходимо очистить свой список, так что вы можете получать и отображать новые данные из списка.

Так в методе prepareMyList() в методе try catch запишите ниже строки сначала перед JSONArray jsonarray = new JSONArray (response); линия.

Так это будет выглядеть,

 arrList = new ArrayList<String>(); 
    JSONArray jsonarray = new JSONArray(response); 

, а затем проверить это будет решить вашу проблему.

+0

Эта линия творит чудеса для меня. Большое спасибо @Vickyexpert. –

+0

Не проблема ... – Vickyexpert

1

То же самое, что в последнее время heppend для меня. Моя проблема заключалась в том, что фильтр фильтровал мои результаты с тех пор, как мои результаты не совпадали с введенным текстом. Это может быть и ваш случай.

Попробуйте @Override ing getFilter() на вашем адаптере массива и верните new Filter(), который ничего не делает. например:

public Filter getFilter() { 

      return new Filter() { 

       @Override 
       protected void publishResults(CharSequence constraint,FilterResults results) { 


       } 

       @Override 
       protected FilterResults performFiltering(CharSequence constraint) { 

        return null; 
       } 
      }; 
     } 
+1

Большое спасибо Ron Это экономит мой день :) – loop

Смежные вопросы