Android フラグメントの ArrayAdapter を介して ListView を更新しているときに問題に直面しています。
サーバーから取得した .csv を処理するメソッドがあります。.csv を解析し、次のことを行います。
for(int i =0; i< lines.length; i++){
String[] words = lines[i].split(",");
for(int j = 0;j<words.length; j++)
if ( j%6 == 1 || j%6 == 2)
getArrayAdapter().add(words[j]);
ブレークポイントを使用すると、「words[j]」が有効な文字列であることがわかります。メソッド getArrayAdapter は次のとおりです。
private ArrayAdapter<String> getArrayAdapter(){
if (aa == null){
ListView lv = (ListView) getCurrentActivity().findViewById(R.id.list);
aa = new ArrayAdapter<String>(
getCurrentActivity(),
android.R.layout.simple_list_item_1);
aa.setNotifyOnChange(true);
lv.setAdapter(aa);
}
return aa;
}
「getArrayAdapter().add(words[j]);」の場合 呼び出されると、ArrayAdapter のメソッド「notifyDataSetChanged()」が呼び出されます。
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
mNotifyOnChange = true;
}
親を介して、これを行う DataBaseObservable に到達します。
public void notifyChanged() {
synchronized(mObservers) {
// since onChanged() is implemented by the app, it could do anything, including
// removing itself from {@link mObservers} - and that could cause problems if
// an iterator is used on the ArrayList {@link mObservers}.
// to avoid such problems, just march thru the list in the reverse order.
for (int i = mObservers.size() - 1; i >= 0; i--) {
mObservers.get(i).onChanged();
}
}
}
オブザーバーの配列には、アダプターと ListView へのあらゆる種類の参照を含む "AdapterDataSetObserver" がありました。AdapterDataSetObserver の onChanged() で何が起こっているのかを見ましたが、何を見ればよいのかよくわかりません。
私の table_fragment.xml は次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/top">
<ListView android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="2"
android:numColumns="2"
android:columnWidth="30dp"
android:id="@+id/list">
</ListView>
</LinearLayout>
フラグメントを含むアクティビティの xml は次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<fragment android:name="com.example.TableFragment"
android:id="@+id/table_fragment"
android:layout_weight="0"
android:layout_width="match_parent"
android:layout_height="0dip" />
</LinearLayout>
ログを見てみると、変なものはありません。すべてうまくいっているように見えますが、画面には文字列が表示されません。
ここで何が欠けていますか?私はAndroidの初心者なので、おそらく些細なことを見逃しています。