java - 如何通过 API 调用填充 Android 中的 AutoCompleteTextView?

标签 java android autocompletetextview asynchttpclient

我想尝试从 API 获取食品列表,并据此更新 AutoCompleteTextView。

我尝试按照这里的答案但无济于事: https://stackoverflow.com/a/36799955/7429535

这是我到目前为止的代码:

//Outside onCreate
List<String> apiFoods = new ArrayList<>();
//In onCreate
 AutoCompleteTextView autocomplete = (AutoCompleteTextView) findViewById(R.id.foodActv);
 final ArrayAdapter<String> autoAdapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, apiFoods);
 autocomplete.setAdapter(autoAdapter);

 autocomplete.addTextChangedListener(new TextWatcher() {
     @Override
     public void beforeTextChanged(CharSequence s, int start, int count, int after) {

     }

     @Override
     public void onTextChanged(CharSequence s, int start, int before, int count) {
         //retrieve data s
     }

     @Override
     public void afterTextChanged(Editable s) {
         retrieveData(s);
         autoAdapter.notifyDataSetChanged();
         Log.d("TAG", "foodsApi is " + apiFoods);
     }
});
//Below onCreate
private void retrieveData(Editable s)
{
    String text = s.toString();
    if(text.contains(" "))
    {
        text.replace(" ", "%20");
    }
    String url = "https://api.edamam.com/api/food-database/parser?ingr="+text+"&app_id=8ff4be18&app_key=f2bf020e6d3cf1a9989c2a2163fb720f";
    new AsyncHttpClient().get(url, new AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(int statusCode, Header[] headers, byte[] responseBody)
        {
            try
            {
                JSONObject foodNames=new JSONObject(new String(responseBody));
                JSONArray jArray = foodNames.getJSONArray("hints");
                for(int i = 0; i < jArray.length(); i++)
                {
                    try
                    {
                        JSONObject hintItem = jArray.getJSONObject(i);
                        JSONObject foodItem = hintItem.getJSONObject("food");
                        String foodLabel = foodItem.getString("label");
                        apiFoods.add(foodLabel);
                    }
                    catch(JSONException e)
                    {

                    }
                }
            } catch (JSONException e)
            {
                e.printStackTrace();
            }
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
            Toast.makeText(getApplicationContext(), "API call failed", Toast.LENGTH_SHORT).show();
        }
    });
}

您可以在此处查看 API 响应示例:https://api.edamam.com/api/food-database/parser?ingr=red&app_id=8ff4be18&app_key=f2bf020e6d3cf1a9989c2a2163fb720f

目前,此代码正在将正确的食物名称输入到 apiFoods ArrayList 中,但它没有向我显示在应用程序中选择的选项。

最佳答案

请注意,您在进行 api 调用之前就已经初始化了 adataapter,因此我建议当您的 api 在 public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) 内返回数据时 函数,请按如下方式重新初始化您的适配器。

private void retrieveData(final AutoCompleteTextView s)
{
    String text = s.toString();
    if(text.contains(" "))
    {
        text.replace(" ", "%20");
    }
    String url = "https://api.edamam.com/api/food-database/parser?ingr="+text+"&app_id=8ff4be18&app_key=f2bf020e6d3cf1a9989c2a2163fb720f";
    new AsyncHttpClient().get(url, new AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(int statusCode, Header[] headers, byte[] responseBody)
        {
            try
            {
                JSONObject foodNames=new JSONObject(new String(responseBody));
                JSONArray jArray = foodNames.getJSONArray("hints");
                for(int i = 0; i < jArray.length(); i++)
                {
                    try
                    {
                        JSONObject hintItem = jArray.getJSONObject(i);
                        JSONObject foodItem = hintItem.getJSONObject("food");
                        String foodLabel = foodItem.getString("label");
                        apiFoods.add(foodLabel);
                    }
                    catch(JSONException e)
                    {

                    }
                }

                autoAdapter = new ArrayAdapter<>(ActivityName.this, android.R.layout.simple_dropdown_item_1line, apiFoods);

 s.setAdapter(autoAdapter);

s.setThreshold(1);

        s.setAdapter(adapter);

            } catch (JSONException e)
            {
                e.printStackTrace();
            }
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
            Toast.makeText(getApplicationContext(), "API call failed", Toast.LENGTH_SHORT).show();
        }
    });
}

关于java - 如何通过 API 调用填充 Android 中的 AutoCompleteTextView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61171593/

相关文章:

android - 无法使用 intellij IDEA 12.04 CE 编译引用 AndEngine GLES2 的 android 应用程序

android - 图像未加载到 baseadapter 中

java - 使用 Java/sql 存储和检索数据时遇到问题

java - 将 HashMap 键与另一个随机 HashMap 键匹配的算法,从不复制值或匹配自身

java - Javamail-android商用

android - MultiAutoCompleteTextView 限制为一个条目

android - 使用 arraylist<string> 为 android 中的自动完成 TextView 设置适配器

java - 如何在 Java 中标记化时处理运算符(StreamTokenizer)

java - 获取 HTTP 状态 400-Bad 请求 REST

android - 我想在应用程序进入后台时启动服务并在应用程序处于前台时停止服务