Android列表视图项目不会出现

时间:2009-10-20 13:38:50

标签: android listview

我应该在标题中写,而不是'不工作'之类的东西,比如'我 不知道该怎么做'但是第一个版本感觉更好:)。 我想要做的是以下几点:

  1. 从Web下载xml,解析它并创建一些ArrayList 对象(完成和工作)
  2. 使用自定义适配器显示对象(不起作用)
  3. 如果我在添加项目之前将项目添加到我的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线程上。所以有什么问题 ? 任何帮助高度赞赏,或者只是一个很好的教程的链接 网络解释了如何在运行时更新列表视图的问题?

1 个答案:

答案 0 :(得分:0)

嘿Arutha - 为什么你不看我的answer for this post - 我认为这就是你需要的。

或者让我在这里重新发布

您可以扩展ArrayAdapter。这是你的代码示例。在此示例中 - SearchItem是一些自定义POJO。基本上你需要覆盖getView()方法来通过膨胀行布局然后根据项目列表和当前位置填充值来构建你的行

class SearchItemsAdapter extends ArrayAdapter<SearchItem> {
Activity context;
List<SearchItem> items;
SearchHeader header;

@SuppressWarnings("unchecked")
public SearchItemsAdapter(final Activity context,
        final Map<SearchHeader, List<SearchItem>> result) {
    super(context, R.layout.item, (List) ((Object[]) result.values()
            .toArray())[0]);
    this.context = context;
    this.header = result.keySet().iterator().next();
    this.items = result.get(this.header);
}

@Override
public View getView(final int position, final View convertView,
        final ViewGroup parent) {
    final View view = this.context.getLayoutInflater().inflate(
            R.layout.item, null);
    final SearchItem item = this.items.get(position);
    ((TextView) view.findViewById(R.id.jt)).setText(item.jt);
    ((TextView) view.findViewById(R.id.dp)).setText(item.dp);
    ((TextView) view.findViewById(R.id.cn)).setText(item.cn);
    ((TextView) view.findViewById(R.id.loc)).setText(item.loc.name);
    final TextView body = ((TextView) view.findViewById(R.id.e));
    body.setText(item.e);
    body.setTag(item.src[0]);
    ((TextView) view.findViewById(R.id.src)).setText(item.src[1]);
    return view;
}
}