1

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の初心者なので、おそらく些細なことを見逃しています。

4

3 に答える 3

2
android:layout_height="0dip"

これは間違っています。ListView利用可能なすべてのスペースを取得する必要があります。に変更しますfill_parent

それから:

aa = new ArrayAdapter<String>(
                getCurrentActivity(),
                android.R.layout.simple_list_item_1);

表示したいデータセットをApdaterに送信する必要があります。この目的のために、このコンストラクターを使用する必要があります

于 2012-09-25T11:46:22.060 に答える
0

ListView の layout_height を 0 にすることができます (自動展開)。ただし、フラグメントを含むアクティビティの xml では、layout_height を 0 に設定できませんでした (自動展開されません)。私はそれを0dipにも入れていました(Eclipseの提案の後)。「match_parent」に変更すると、うまくいきました(Eclipseの警告にもかかわらず)。

于 2012-09-25T13:44:20.193 に答える
0

@Jos、あなたが選択した答えは正解ではありません。ListView高さは 0 dp にすることができます。to がデフォルトの方法で機能するためには、ListViewto の IdListViewを正確に変更する必要があります。また、リストが空の場合に表示するまたはをandroid:id="@id/android:list"追加することもできます。TextViewProgressBarListView

<TextView
android:id="@id/android:empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal|center_vertical"
android:text="@+string/empty_list_message" />

この場合も、ID は正確に一致する必要があります。それ以外はすべて、ニーズに合わせて変更できます。完全な xml は次のようになります。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ListView
        android:id="@id/android:list"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:drawSelectorOnTop="false" 
        android:listSelector="@drawable/list_selector"/>

    <TextView
        android:id="@id/android:empty"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_horizontal|center_vertical"
        android:text="@string/empty_list_message" />

</LinearLayout>

layout_weightとは私のプログラムに特有のlistSelectorものです。これらは必要な場合と必要でない場合があります。

于 2013-01-25T21:48:39.950 に答える