如何从 JSON 对象的结果填充 ListView?
How to populate a ListView from results of a JSON object?
我正在使用 google 搜索实现来搜索用户在单击按钮时输入的结果。
我听到那个按钮点击和 fetch/parse JSON 结果。
我已经解析了 JSON 的 "title" 和 "url" 并想将其填充到 ListView
.
但是,我认为我没有正确使用 ArrayAdapter
class。
MyActivity.java:
私有 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>
我似乎遇到了这个错误:
Error:(71, 44) error: no suitable constructor found for
ArrayAdapter(,int,String[]) constructor
ArrayAdapter.ArrayAdapter(Context,int,int) is not applicable (argument
mismatch; cannot be converted to Context)
constructor ArrayAdapter.ArrayAdapter(Context,int,String[]) is not
applicable (argument mismatch; cannot be
converted to Context) constructor
ArrayAdapter.ArrayAdapter(Context,int,List) is not applicable
(argument mismatch; cannot be converted to
Context)
有没有办法使用 ArrayAdapter 用数据填充 ListView
,或者有其他方法吗?
抱歉,我是 android 的新手。
ArrayAdapter 的第一个参数应该是您的 Context ...尝试使用 ActivityName.this 其中 ActivityName 是您的 Activity 名称....
对于你的键盘,我认为问题出在你的 xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/parentOuter"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/searchBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="type to search..." />
<Button
android:id="@+id/searchBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Search Me!" />
<ListView
android:id="@+id/listviewgoogle"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
你做错了。您已调用 AsyncTsk 并将适配器设置为:
new JsonSearchTask().execute();
ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.activity_listviewgoogle, resultArray);
listViewGoogle.setAdapter(adapter);
JsonSearchTask
运行 在单独的线程中,而 listViewGoogle.setAdapter(adapter);
在获得 JsonSearchTask
的结果之前在主线程中调用。所以你必须在 JsonSearchTask
.
的 onPostExecute()
方法中调用这个方法
错误:
Error:(71, 44) error: no suitable constructor found for
ArrayAdapter(,int,String[]) constructor
ArrayAdapter.ArrayAdapter(Context,int,int) is not applicable (argument
mismatch; cannot be converted to Context) constructor
ArrayAdapter.ArrayAdapter(Context,int,String[]) is not applicable
(argument mismatch; cannot be converted to Context) constructor
ArrayAdapter.ArrayAdapter(Context,int,List) is not applicable
(argument mismatch; cannot be converted to Context)
您曾这样打过电话:
ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.activity_listviewgoogle, resultArray);
在您的 setOnClickListener 中。所以那时 this
引用 OnClickListener 的上下文引用而不是你的 Activity 的引用。
所以试试
ArrayAdapter adapter = new ArrayAdapter<String>(MainActivity.this, R.layout.activity_listviewgoogle, resultArray);
而不是
ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.activity_listviewgoogle, resultArray);
希望对您有所帮助!
我正在使用 google 搜索实现来搜索用户在单击按钮时输入的结果。
我听到那个按钮点击和 fetch/parse JSON 结果。
我已经解析了 JSON 的 "title" 和 "url" 并想将其填充到 ListView
.
但是,我认为我没有正确使用 ArrayAdapter
class。
MyActivity.java:
私有 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>
我似乎遇到了这个错误:
Error:(71, 44) error: no suitable constructor found for ArrayAdapter(,int,String[]) constructor ArrayAdapter.ArrayAdapter(Context,int,int) is not applicable (argument mismatch; cannot be converted to Context) constructor ArrayAdapter.ArrayAdapter(Context,int,String[]) is not applicable (argument mismatch; cannot be converted to Context) constructor ArrayAdapter.ArrayAdapter(Context,int,List) is not applicable (argument mismatch; cannot be converted to Context)
有没有办法使用 ArrayAdapter 用数据填充 ListView
,或者有其他方法吗?
抱歉,我是 android 的新手。
ArrayAdapter 的第一个参数应该是您的 Context ...尝试使用 ActivityName.this 其中 ActivityName 是您的 Activity 名称....
对于你的键盘,我认为问题出在你的 xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/parentOuter"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/searchBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="type to search..." />
<Button
android:id="@+id/searchBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Search Me!" />
<ListView
android:id="@+id/listviewgoogle"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
你做错了。您已调用 AsyncTsk 并将适配器设置为:
new JsonSearchTask().execute();
ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.activity_listviewgoogle, resultArray);
listViewGoogle.setAdapter(adapter);
JsonSearchTask
运行 在单独的线程中,而 listViewGoogle.setAdapter(adapter);
在获得 JsonSearchTask
的结果之前在主线程中调用。所以你必须在 JsonSearchTask
.
onPostExecute()
方法中调用这个方法
错误:
Error:(71, 44) error: no suitable constructor found for ArrayAdapter(,int,String[]) constructor ArrayAdapter.ArrayAdapter(Context,int,int) is not applicable (argument mismatch; cannot be converted to Context) constructor ArrayAdapter.ArrayAdapter(Context,int,String[]) is not applicable (argument mismatch; cannot be converted to Context) constructor ArrayAdapter.ArrayAdapter(Context,int,List) is not applicable (argument mismatch; cannot be converted to Context)
您曾这样打过电话:
ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.activity_listviewgoogle, resultArray);
在您的 setOnClickListener 中。所以那时 this
引用 OnClickListener 的上下文引用而不是你的 Activity 的引用。
所以试试
ArrayAdapter adapter = new ArrayAdapter<String>(MainActivity.this, R.layout.activity_listviewgoogle, resultArray);
而不是
ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.activity_listviewgoogle, resultArray);
希望对您有所帮助!