【发布时间】:2009-10-20 13:38:50
【问题描述】:
我应该在标题中写下“不起作用”之类的“我” 不知道怎么做'但第一个版本感觉更好:)。 我想做的是以下几点:
- 从网上下载xml,解析并创建一些ArrayList 对象(完成和工作)
- 使用自定义适配器显示对象(不起作用)
如果我在将项目添加到 ArrayList 之前将其添加到,则第二个有效 视图使用
m_orderAdapter = new OrderAdapter(this,m_orders); //code for orderadapter
below
setListAdapter(m_orderAdapter);
我在网上找到了这样的东西:(在我的 onCreate 方法中)
handler = new Handler();
viewOrders = new Runnable(){
@Override
public void run() {
getOrders();
}
};
new Thread(){
@Override
public void run(){
handler.post(viewOrders);
}
}.start();
然后,方法的以下代码:
private void getOrders(){
try{
OrderManager om = new OrderManager();
m_orders = om.getOrdersFromWeb();
Log.i("ARRAY", ""+ m_orders.size());
} catch (Exception e) {
Log.e("BACKGROUND_PROC", e.getMessage());
}
runOnUiThread(returnRes);
}
OrderManager 下载 xml 并将其解析为 Order 对象并返回
数组列表。然后我将此列表设置为我的成员数组列表 m_orders。
下载和解析完成后,我在 ui 线程上运行 returnRes 方法
使用runOnUiThread方法
private Runnable returnRes = new Runnable() {
@Override
public void run() {
if(m_orders != null && m_orders.size() > 0){
Log.i("ORDER",m_orders.get(0).getOrder_id());
setListAdapter(m_orderAdapter);
m_orderAdapter.notifyDataSetChanged();
}
m_orderAdapter.notifyDataSetChanged();
}
};
然后我在我的适配器上调用 notifyDataSetChanged()。
我做所有这些事情的视图扩展了 ListView 和适配器的代码 其本身如下所列:
public class OrderAdapter extends BaseAdapter{
private Context ctx;
private List<Order> orders;
public OrderAdapter(Context ctx, List<Order> orderLst){
this.ctx = ctx;
this.orders = orderLst;
}
@Override
public int getCount() {
return orders.size();
}
@Override
public Object getItem(int pos) {
return orders.get(pos);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Order o = orders.get(position);
return new OrderListAdapterView(this.ctx,o);
}
}
当我调试时,我的 m_orders 列表中有数据,但是当我调用时 notifyDataSetChanged 没有任何反应,我读过我必须执行 在我认为我做的 UI 线程上。所以有什么问题 ? 任何帮助都非常感谢,或者可能只是一个不错的教程的链接 网络解释了如何在运行时更新列表视图?
【问题讨论】: