当前位置: 首页 > 知识库问答 >
问题:

如何根据JSON对象的结果填充ListView?

刘博雅
2023-03-14

私有ListView ListViewGoogle;

private String[] resultArray;

private EditText searchBox;

private Button searchBtn;

private String search_url = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=";

private String search_query;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my);

    listViewGoogle = (ListView)findViewById(R.id.listviewgoogle);

    searchBox = (EditText)findViewById(R.id.searchBox);
    searchBtn = (Button)findViewById(R.id.searchBtn);

    searchBtn.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            new JsonSearchTask().execute();

            try
            {
                search_query = search_url + searchBox.getText().toString();

                new JsonSearchTask().execute();

                ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.activity_listviewgoogle, resultArray);
                listViewGoogle.setAdapter(adapter);

            }
            catch (Exception e)
            {
                // TODO: handle exception
            }
        }
    });
}

private class JsonSearchTask extends AsyncTask<Void, Void, Void>
{
    @Override
    protected Void doInBackground(Void... arg0)
    {
        try
        {
            parseResult(sendQuery(search_query));
        }
        catch (JSONException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return null;
    }
}

private String sendQuery(String query) throws IOException
{
    String queryResult = "";

    URL searchURL = new URL(query);

    HttpURLConnection httpURLConnection = (HttpURLConnection) searchURL.openConnection();

    if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK)
    {
        InputStreamReader inputStreamReader = new InputStreamReader(httpURLConnection.getInputStream());
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader, 8192);

        String line = null;

        while ((line = bufferedReader.readLine()) != null)
        {
            queryResult += line;
        }

        bufferedReader.close();
    }

    return queryResult;
}

private void parseResult(String json) throws JSONException
{
    String parsedResult = "";

    JSONObject jsonObject = new JSONObject(json);

    JSONObject jsonObject_responseData = jsonObject.getJSONObject("responseData");

    JSONArray jsonArray_results = jsonObject_responseData.getJSONArray("results");

    resultArray = new String[jsonArray_results.length()];

    for(int i = 0; i < jsonArray_results.length(); i++)
    {
        JSONObject jsonObject_i = jsonArray_results.getJSONObject(i);
        parsedResult = "title: " + jsonObject_i.getString("title") + "\n";
        parsedResult += "url: " + jsonObject_i.getString("url") + "\n";
        //parsedResult += "\n";
        resultArray[i] = parsedResult;
    }
}

activity_listviewgoogle.xml:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/label"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dip"
    android:textSize="16dip"
    android:textStyle="bold"
    android:gravity="center" >
</TextView>

activity_my.xml:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal"
    android:id="@+id/parentOuter" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <EditText
            android:layout_width="fill_parent"
            android:layout_height="match_parent"
            android:hint="type to search..."
            android:layout_weight="2"
            android:id="@+id/searchBox" />

        <Button
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="Search Me!"
            android:layout_weight="2"
            android:id="@+id/searchBtn" />

        <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/listviewgoogle"
            android:layout_weight="1" />

    </LinearLayout>

</LinearLayout>

共有1个答案

柳逸春
2023-03-14

你做错了。您调用了AsyncTsk并设置了适配器,如下所示:

new JsonSearchTask().execute();
ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.activity_listviewgoogle, resultArray);
listViewGoogle.setAdapter(adapter);

JSONSearchTask在seperate线程中运行,而ListViewGoogle.setAdapter(适配器);在获得JSONSearchTask的结果之前在主线程中调用。因此,必须在JSONSearchTaskonPostExecute()方法中调用此方法。

错误:

ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.activity_listviewgoogle, resultArray);

在您的SetonClickListener中。因此,在这个引用OnClickListener的上下文引用,而不是活动的引用。

所以试试

ArrayAdapter adapter = new ArrayAdapter<String>(MainActivity.this, R.layout.activity_listviewgoogle, resultArray);

而不是

ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.activity_listviewgoogle, resultArray);
 类似资料:
  • 我有一个要填充信息的对象。我从许多不同的服务中检索信息。我做了一个助手类,它有一个公共方法,然后有许多私有方法来调用服务。我写的东西很好,但我不确定这是否是正确的方法。 您可能想知道为什么我需要一个包含所有这些信息的对象。我需要它全部在一个对象中,因为我从这个java对象创建了一个json对象并将其传递给javascript层。 我的方法有什么问题?我是否应该遵循一种编程范式来做这样的事情? 例子

  • 所以我用Java处理这些数据: 我需要将其转换为JSON: 但是我不知道怎么做。 目前我认为这是最好的方法: 但我不确定如何使用Hashmap实现这一点。我知道是这样的: 但确切的语法,以及如何将其与其他数据一起添加,我无法计算。有什么想法吗?

  • 问题内容: 我使用Json.Net这样填充一个类: 上面的结果JSON字符串填充了我的类中的几个属性。稍后我有一个新的JSON字符串,并希望使用其余属性填充相同的类。是否可以使用JSON.NET或方法?我基本上想在上面的代码行中添加/添加到我填充的帐户对象中。 我的课: 问题答案: 是的,您可以使用第二个JSON字符串来填充现有对象的属性。 这是一个例子: 输出: 小提琴:https : //do

  • 问题内容: 我设法用json对象填充下拉菜单,效果很好。目前,我正在尝试根据从下拉菜单中选择的选项显示隐藏div中的图像。当下拉列表由json对象填充时,我将如何检索图像数据。 HTML JSON文件 这就是我使用jquery填充下拉菜单的方式。 jfiddle中任何有效的示例,将不胜感激!谢谢。 问题答案: 现场演示

  • 问题内容: 希望有人可以帮助我编写SQL脚本或函数。 我有一个数据源,我希望该功能通过并基于2个指定的列填充相关列。 因此,名称和值列。 例如 因此,脚本/函数应该为数据源的每一行分别在a,b,c,d列中填充值2,1、3、5。 这可能吗?如果是这样,有人可以教我如何做。 问题答案: Oracle安装程序 : 更新声明 : 输出 : Oracle安装程序 : 插入语句 : 输出 :

  • 问题内容: 我有一个JSON请求,该请求从youtube返回一个响应,其中包含对特定视频的评论。我目前有3种文本视图:一种用于名称/上载器,一种用于内容,一种用于发布日期- 然后用我的JSON响应中的数据填充。 我的问题是-仅出现第一个评论,发布日期和上传者。 我相信我将需要用列表视图替换我的textviews并将其解析为3个字段-我只是不知道如何。 爪哇 公共类Player扩展了YouTubeB