Java 如何在Android中使用API调用填充AutoCompleteTextView?

Java 如何在Android中使用API调用填充AutoCompleteTextView?,java,android,autocompletetextview,asynchttpclient,Java,Android,Autocompletetextview,Asynchttpclient,我想尝试从API中获取食品列表,并基于此更新AutoCompleteTextView 我在这里尝试了以下答案,但没有成功: 这是我目前的代码: //Outside onCreate List<String> apiFoods = new ArrayList<>(); //外部onCreate List=new ArrayList(); //在onCreate中 AutoCompleteTextView autocomplete=(AutoCompleteTextVi

我想尝试从API中获取食品列表,并基于此更新AutoCompleteTextView

我在这里尝试了以下答案,但没有成功:

这是我目前的代码:

//Outside onCreate
List<String> apiFoods = new ArrayList<>();
//外部onCreate
List=new ArrayList();
//在onCreate中
AutoCompleteTextView autocomplete=(AutoCompleteTextView)findViewById(R.id.foodActv);
最终ArrayAdapter autoAdapter=新的ArrayAdapter(这是android.R.layout.simple\u下拉列表\u item\u 1line,apiFoods);
自动完成。设置适配器(自动适配器);
autocomplete.addTextChangedListener(新的TextWatcher(){
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
//检索数据
}
@凌驾
公共无效后文本已更改(可编辑){
检索数据(s);
autoAdapter.notifyDataSetChanged();
Log.d(“标签”,“食品API为”+apiFoods);
}
});
//下面是onCreate
私有void retrieveData(可编辑的)
{
字符串text=s.toString();
if(text.contains(“”)
{
文本。替换(“,“%20”);
}
字符串url=”https://api.edamam.com/api/food-database/parser?ingr=“+text+”&app_id=8ff4be18&app_key=f2bf020e6d3cf1a9989c2a2163fb720f”;
新建AsyncHttpClient().get(url,新建AsyncHttpResponseHandler()){
@凌驾
成功时的公共void(int statusCode,Header[]headers,byte[]responseBody)
{
尝试
{
JSONObject foodNames=新JSONObject(新字符串(responseBody));
JSONArray jArray=foodNames.getJSONArray(“提示”);
for(int i=0;i
您可以在此处看到一个示例API响应:


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

请注意,在进行api调用之前很久,您就已经初始化了适配器,因此我建议,当您的api返回
public void中的数据时,请成功(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();
        }
    });
}
private void retrieveData(最终自动完成文本视图)
{
字符串text=s.toString();
if(text.contains(“”)
{
文本。替换(“,“%20”);
}
字符串url=”https://api.edamam.com/api/food-database/parser?ingr=“+text+”&app_id=8ff4be18&app_key=f2bf020e6d3cf1a9989c2a2163fb720f”;
新建AsyncHttpClient().get(url,新建AsyncHttpResponseHandler()){
@凌驾
成功时的公共void(int statusCode,Header[]headers,byte[]responseBody)
{
尝试
{
JSONObject foodNames=新JSONObject(新字符串(responseBody));
JSONArray jArray=foodNames.getJSONArray(“提示”);
for(int i=0;i
这是否回答了您的问题?@RajenRaiyarela恐怕没有帮助。我尝试在.setAdapater之后添加,但请注意,在后TextChanged覆盖方法中,我还有notifyDataSetChanged();这是您在
retrieveData()中执行的
AsyncHttpClient
操作
是异步的。您的代码不会暂停并在那里等待响应,而是继续立即从该方法返回,然后进入
自动适配器。notifyDataSetChanged()
调用,此时,
onSuccess()
尚未运行,因此您的
apiFoods
尚未更新。您需要执行该操作
autoAdapter.notifyDataSetChanged()
在您的notifyDataSetChanged()上的
onSuccess()调用的末尾执行该操作应该在for循环之后进入onSuccess方法,在该循环中,您将值设置为apiFoods。@MikeM。我已将检索数据方法更改为采用
ArrayAdapter
,并在方法调用
retrieveData(s,autoAdapter)中传入我的autoAdapter;
我放置了
autoAdapter.notifyDataSanged()
在UCSC的
末尾
//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();
        }
    });
}
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();
        }
    });
}