我正在尝试将一组获取结果显示为列表。每当我尝试使用虚拟数据时,它都会正确显示,但当我将其更改为从服务器检索到的数据时,没有任何反应。我没有任何错误,因此非常令人困惑
import java.util.ArrayList;
import org.json.JSONArray;
import org.json.JSONException;
import android.app.ListFragment;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
public class BlogFragment extends ListFragment {
String[] countries = new String[] {
"India",
"Pakistan",
"Sri Lanka",
"China",
"Bangladesh",
"Nepal",
"Afghanistan",
"North Korea",
"South Korea",
"Japan"
};
String [] titles ={};
ArrayAdapter<String> adapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
/** Creating an array adapter to store the list of countries **/
new AsyncFetchData().execute();
adapter = new ArrayAdapter<String>(inflater.getContext(), android.R.layout.simple_list_item_1,titles);
return super.onCreateView(inflater, container, savedInstanceState);
}
private class AsyncFetchData extends AsyncTask
{
@Override
protected Object doInBackground(Object... arg0) {
JSONArray a = new JSONArray();
ArrayList<String> aList = new ArrayList<String>();
a = ServerAPI.getData();
for (int i = 0; i < a.length(); i++) {
String title = null;
String content = null;
try {
title = a.getJSONObject(i).getString("title");
content = a.getJSONObject(i).getString("content");
aList.add(title);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(title);
// System.out.println(content);
}
titles = aList.toArray(new String[aList.size()]);
/** Setting the list adapter for the ListFragment */
return null;
}
protected void onPostExecute(Object result) {
// TODO Auto-generated method stub
ArrayAdapter aa = new ArrayAdapter(getActivity().getBaseContext(), android.R.layout.simple_list_item_1, titles);
aa.notifyDataSetChanged();
setListAdapter(aa);
}
}
}
字符串数组countries
在runOnUiThread
方法中正确显示,而标题则没有。我检查置于标题字符串数组中的数据,它是否有效。
知道为什么会这样吗?
答案 0 :(得分:0)
问题是:
您的适配器已使用旧数据集初始化。因此,您正在更新基础数据,但适配器仍保留旧数据。
您需要使用新数据更新适配器。
为此,
致电
adapter.notifyDatasetChanged();
之前
setListAdapter(adapter);
notifyDataSetChanged: 通知附加的观察者基础数据已经存在 已更改,任何反映数据集的视图都应自行刷新。
答案 1 :(得分:0)
首先为新标题创建一个新适配器,然后设置该适配器。
答案 2 :(得分:0)
我在代码中看到的一些奇怪的东西:
在 onCreateView 中,您启动新的 AsyncFetchData()。execute()。如果想要下载当前列表项的数据可能很有用,对于整个列表,它是以其他方式制作的(不在onCreateView中)
我希望onCreateView能够创建一个新视图而不是调用 super.onCreateView 来访问视图元素(并用下载的数据填充它们)
ListFragment用法的标准模式是:
public class MyListFragment extends ListFragment {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
"Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
"Linux", "OS/2" };
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, values);
setListAdapter(adapter);
}
}
如果要使用 AsyncTask 中的下载数据更新列表,则应更新适配器引用的数组中的数据,而无需重新创建适配器本身。在UI线程上准备好新数据后立即调用 adapter.notifyDataChanged()(就像你想要做的那样,但通常是在 AsyncTask.postExecute()这是专为此案例设计的。
我猜你在下载之前没有任何数据要显示。然后你不需要显示空列表,可能是某种进度条。它可能是 TextView “请稍候,下载...”下载完成后,您将用 ListView (或片段)替换TextView,可能是动画。通过这种方式,ListView将立即创建,您无需关心其异步下载。
ADDED:关于进度条 - 最好使用标准的:
ProgressDialog progress = new ProgressDialog(this);
progress.setMessage("Please wait, downloading...");
progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progress.setIndeterminate(true);
AsyncTask.onPreExecute()是个好地方。不要忘记在 onPostExecute()
中将其关闭