自动完成文本视图不更新
autocompletetextview not updating
我有一个自动完成文本,我使用 volley stringrequest 从 Web 服务获得建议。现在的问题是 ArrayList 没有被清除,所以每次我发出请求时,旧项目都会添加到列表中。我试过 adapter.clear()
但它给了我 NullPointerException。因此,我们将不胜感激任何有助于清除此问题以使列表不包含旧项目的帮助。
LogCat:
FATAL EXCEPTION: main
Process: com.sam.ubooktoday, PID: 24983
java.lang.NullPointerException
at com.sam.ubooktoday.view.fragments.HomeOptionTwo.onResponse(HomeOptionTwo.java:88)
at com.sam.ubooktoday.view.fragments.HomeOptionTwo.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) {
}
}
您不需要清除您的适配器,因为您每次都设置新的适配器,但您需要清除您的列表以便从列表中获取和显示新数据。
所以在 prepareMyList() 方法中,在 try catch 方法中,先在 JSONArray jsonarray = new JSONArray(response) 之前写下下面一行;线.
所以它看起来像,
arrList = new ArrayList<String>();
JSONArray jsonarray = new JSONArray(response);
然后检查它是否会解决您的问题。
最近我遇到了同样的事情,我的问题是过滤器正在过滤我的结果,因为我的结果不是与键入的文本匹配的字符串。也可能是你的情况。
尝试在您的阵列适配器上 @Override
ing getFilter()
和 return 什么都不做的 new Filter()
。喜欢 :
public Filter getFilter() {
return new Filter() {
@Override
protected void publishResults(CharSequence constraint,FilterResults results) {
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
return null;
}
};
}
我有一个自动完成文本,我使用 volley stringrequest 从 Web 服务获得建议。现在的问题是 ArrayList 没有被清除,所以每次我发出请求时,旧项目都会添加到列表中。我试过 adapter.clear()
但它给了我 NullPointerException。因此,我们将不胜感激任何有助于清除此问题以使列表不包含旧项目的帮助。
LogCat:
FATAL EXCEPTION: main
Process: com.sam.ubooktoday, PID: 24983
java.lang.NullPointerException
at com.sam.ubooktoday.view.fragments.HomeOptionTwo.onResponse(HomeOptionTwo.java:88)
at com.sam.ubooktoday.view.fragments.HomeOptionTwo.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) {
}
}
您不需要清除您的适配器,因为您每次都设置新的适配器,但您需要清除您的列表以便从列表中获取和显示新数据。
所以在 prepareMyList() 方法中,在 try catch 方法中,先在 JSONArray jsonarray = new JSONArray(response) 之前写下下面一行;线.
所以它看起来像,
arrList = new ArrayList<String>();
JSONArray jsonarray = new JSONArray(response);
然后检查它是否会解决您的问题。
最近我遇到了同样的事情,我的问题是过滤器正在过滤我的结果,因为我的结果不是与键入的文本匹配的字符串。也可能是你的情况。
尝试在您的阵列适配器上 @Override
ing getFilter()
和 return 什么都不做的 new Filter()
。喜欢 :
public Filter getFilter() {
return new Filter() {
@Override
protected void publishResults(CharSequence constraint,FilterResults results) {
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
return null;
}
};
}