在我的应用中,我正在显示从互联网下载的项目列表(pItem
类型)。我正在使用扩展ArrayAdapter<pItem>
的自定义ArrayAdapter,基本上是这样的:
public class PArrayAdapter extends ArrayAdapter<pItem> {
private List<pItem> pList = new ArrayList<pItem>();
public PArrayAdapter(Context context) {
super(context, R.layout.p_row);
this.context = context;
}
public void SetList(List<PItem> pl){
pList = pl;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = convertView;
if (rowView == null) {
LayoutInflater vi;
vi = LayoutInflater.from(getContext());
rowView = vi.inflate(R.layout.p_row, null);
}
// ...
return rowView;
}
}
现在,通常在创建自定义ArrayAdapter时,会在构造函数中设置项列表。但在我的情况下,当我动态获取AsyncTask
中的项目(列表不断变化)时,我将项目的设置与适配器的创建分开。
在我的主要活动中,这就是我所做的:(只是代码的主要部分)
public class MainPageActivity extends SherlockFragmentActivity implements
OnScrollListener {
// List of items
private List<pItem> pList = new ArrayList<pItem>();
// Adapter
private arrayAdapter pAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_page);
//...
listView = (ListView) findViewById(R.id.p_list);
adpater = new PArrayAdapter(getApplicationContext());
new ASTask().execute("");
}
private class ASTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... args) {
// Add the downloaded items to list
pList.addAll(Downloader.GetItems());
return "";
}
@Override
protected void onPostExecute(String result) {
Log.d("Main", String.valueOf(pList.size())); // Shows the right number
// Show Items
pAdapter.setList(pList);
listView.setAdapter(pAdapter);
Handler mHandler = new Handler(Looper.getMainLooper());
Runnable rn = new Runnable() {
@Override
public void run() {
pAdapter.notifyDataSetChanged();
}
};
mHandler.post(rn);
}
@Override
protected void onPreExecute() {}
@Override
protected void onProgressUpdate(Void... values) {}
}
}
问题在于:当我运行它时, listView 中没有显示任何内容。它没有任何错误。
但是如果我在PArrayAdapter
的构造函数中设置列表,一切正常,我会看到这些项目。
我在这里做错了什么?
答案 0 :(得分:0)
添加
pAdapter.notifyDataSetChanged();
在onPostExecute()方法结束时。
试试这样:
@Override
protected void onPostExecute(String result) {
Log.d("Main", String.valueOf(pList.size())); // Shows the right number
// Show Items
pAdapter.setList(pList);
listView.setAdapter(pAdapter);
pAdapter.notifyDataSetChanged();
}
答案 1 :(得分:0)
删除此代码
Handler mHandler = new Handler(Looper.getMainLooper());
Runnable rn = new Runnable() {
@Override
public void run() {
pAdapter.notifyDataSetChanged();
}
};
mHandler.post(rn);
仅添加此行
pAdapter.notifyDataSetChanged();
答案 2 :(得分:0)
行。我发现了什么是我的问题。这实际上是一个新手的错误:
而不是将输入列表分配给适配器内的列表:
pList = pl;
我应该添加所有这样的项目:
pList.addAll(pl);
这解决了这个问题。