【问题标题】:Adding item to ListAdapter causes exception将项目添加到 ListAdapter 会导致异常
【发布时间】:2011-02-10 17:37:43
【问题描述】:

我正在尝试使用列表视图,当我将一个项目添加到其 ListAdapter 的 ArrayList 并调用 notifyDataSetChanged 时,它会引发异常。调用下面的 addItem 例程会抛出异常。

消息显示未找到源,然后是: // 编译自 DataSetObservable.java(版本 1.5 : 49.0,超级位) // 签名:Landroid/database/Observable; 公共类 android.database.DataSetObservable 扩展 android.database.Observable {

// 方法描述符#8 ()V // 堆栈:3,本地:1 公共 DataSetObservable(); 0 aload_0 [这个] 1 调用特殊的 android.database.Observable() [1] 4 新的 java.lang.RuntimeException [2] 7重复 8 最不发达国家 [3] 10 调用特殊 java.lang.RuntimeException(java.lang.String) [4] 13 投掷 行号: [个人电脑:0,行:5] 局部变量表: [pc: 0, pc: 14] local: this index: 0 type: android.database.DataSetObservable

我的初始化代码:

    tickerList = (ListView)findViewById(R.id.ListView01);
    tickerModel = new StockAdapter(stocks);
    tickerList.setAdapter(tickerModel);

我已经包含了我的自定义适配器类。 (根据网上例子修改)

private class StockAdapter extends BaseAdapter {

    private ArrayList <Stockdata>mData = new ArrayList<Stockdata>();
    private LayoutInflater mInflater;

    public StockAdapter(ArrayList<Stockdata>rows) {
        mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mData = rows;
    }

    public void addItem(Stockdata item) {
        mData.add(item);
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public Stockdata getItem(int position) {
        return mData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        System.out.println("getView " + position + " " + convertView);
        ViewHolder holder = null;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.row, null);
            holder = new ViewHolder();
            holder.textView = (TextView)convertView.findViewById(R.id.SYMBOL_CELL);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder)convertView.getTag();
        }
        holder.textView.setText(mData.get(position).getSymbol());
        return convertView;
    }

}

public static class ViewHolder {
    public TextView textView;
}

【问题讨论】:

  • 尝试将tickerList 作为第二个参数传递给mInflater.inflate()。这是一个非常奇怪的例外。您可以尝试粘贴四个空格缩进,以便更容易阅读吗?
  • 我不相信这是一个堆栈跟踪。这看起来有点像显示已停止线程的 Eclipse 窗口。尝试在 Eclipse 中使用adb logcat、DDMS 或 DDMS 透视图来获取异常信息。
  • 为什么使用 BaseAdapter 而不是 ArrayAdapter?

标签: android exception listview


【解决方案1】:

问题是我从 UI 线程外部调用 notifyDataSetChanged。

这解决了问题。

runOnUiThread (new Runnable() { 公共无效运行(){ tickerModel.notifyDataSetChanged(); } });

谢谢, 格里

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    相关资源
    最近更新 更多