2010-04-21 4 views
1

목록보기를 사용하려고하는데 ListAdapter의 ArrayList에 항목을 추가하고 notifyDataSetChanged를 호출하면 예외가 발생합니다. 아래 addItem 루틴을 호출하면 예외가 발생합니다.ListAdapter에 항목을 추가하면 예외가 발생합니다.

메시지는 소스가 발견되지 말한다 다음이 : DataSetObservable.java (버전 1.5 : 49.0, 슈퍼 비트)에서 컴파일 // // 서명 : Landroid/데이터베이스/관찰 가능한; 3, 주민 : 공용 클래스 android.database.DataSetObservable는 android.database.Observable {

// 메소드 디스크립터 # 8() // V 스택을 확장 한 공개 DataSetObservable(); 0 aload_0 android.database.Observable (invokespecial [이] 1) [1] 4 새로운 java.lang.RuntimeException가 [2] DUP 7 [3] 10 invokespecial java.lang.RuntimeException가 (자바 8 LDC. [pc : 0, line : 5] 로컬 변수 표 : 로컬 :이 색인 : 0 유형 : 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; 
} 
+0

는 mInflater.inflate '에 두 번째 인수()'로'tickerList'을 전달하려고합니다. 정말 이상한 예외입니다. 더 쉽게 읽을 수 있도록 4 개의 들여 쓰기로 붙일 수 있습니까? – synic

+1

스택 추적이라고 생각하지 않습니다. 정지 된 스레드를 보여주는 이클립스 창처럼 보입니다. Eclipse에서'adb logcat', DDMS 또는 DDMS 퍼스펙티브를 사용하여 예외 정보를 얻으십시오. – CommonsWare

+0

ArrayAdapter 대신 BaseAdapter를 사용하는 이유는 무엇입니까? – Macarse

답변

1

문제점은 UI 스레드 외부에서 notifyDataSetChanged를 호출하고 있다는 것이 었습니다.

이 문제가 해결되었습니다.

runOnUiThread (새의 Runnable() { 공공 무효 실행() { tickerModel.notifyDataSetChanged(); } });

감사합니다, 게리

관련 문제