0

実際、私の問題はこの男のものと同じです。しかし、解決方法がわかりません。これが私のリストビューxmlファイルです。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFFFFF">

<LinearLayout     android:orientation="horizontal"
                  android:layout_width="fill_parent"
                  android:layout_height="wrap_content"
                  android:weightSum="3"
                  android:background="#CCCCCC"
                  android:id="@+id/tabs">

    <Button 
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:layout_weight="1"
           android:background="#CCCCCC"
           android:textSize="20sp"
           android:textColor="#000000"
           android:text="@string/NewTask"
           android:id="@+id/tab1"
        />

    <Button 
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:background="#CCCCCC"
           android:layout_weight="1"
           android:textSize="20sp"
           android:textColor="#000000"
           android:text="@string/Friends"
           android:id="@+id/tab2"
        />
    <Button 
           android:layout_width="fill_parent"
           android:background="#CCCCCC"
           android:layout_height="wrap_content"
           android:textColor="#000000"
           android:layout_weight="1"
           android:text="@string/AddPeople"
           android:textSize="20sp"
           android:id="@+id/tab3"
        />
    </LinearLayout>

<ListView
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:cacheColorHint="#000000"
    android:layout_below="@+id/tabs"
/>

</RelativeLayout>

私は自分の listactivity から関数を呼び出そうとしてonpostExecuteAsyncTask classます。これが私のリストアクティビティの機能です。

public void SetImage(Bitmap bmp,int index)
{
    View v = this.ls.getChildAt(index);
    ImageView img = (ImageView)v.findViewById(R.id.tasks_userimg);
    img.setImageBitmap(bmp);
}

この bmp はasynctaskクラスでダウンロードされたビットマップでlsあり、リストビューであり、リストindexビュー内のアイテムのインデックスです。postexecute が実行されると、リストビュー アイテム イメージを更新する引数を指定してこの関数を呼び出します。

問題はリンクで述べたのとまったく同じです。つまり、スクロールするとエラーが発生します。しかし、リストビューのレイアウト幅を変更することで問題を解決しましたが、ここでは機能しません。

4

2 に答える 2

0

他の多くの人と同じように、この特別なビューにはいくつかの問題があるようです。

「 listViewの世界」の講演をご覧になることを強くお勧めします。

同じビューでgetViewを複数回呼び出すトピックなど、listViewに関連する多くのトピックについて話します。つまり、これが発生する理由は、listViewアイテムを測定するためにgetViewも呼び出されるためです。不要なデータの膨張とフェッチを回避するために、convertViewを使用できます(使用する必要があります)。

質問自体については、listViewアイテムでfindViewByIdを使用しないでください。再利用されるためです。たとえば、ユーザーが下にスクロールした場合、0番目の位置に設定されたビューを7番目の位置に設定できます。

listViewから単一のアイテムを更新する場合は、次のようなものを使用できます。

// itemIndex is the index of the item to update
final View v=listView.getChildAt(itemIndex-listView.getFirstVisiblePosition());
//now you update your view according to what you wish . 
//you must of course handle the cases that you can't get the view .

もちろん、一度実行すると、アダプタの背後にあるデータも更新する必要があります。これにより、次にユーザーがこのアイテムにスクロールしたときに、ビットマップが表示されます。

何をすべきかは、使用したasyncTaskによって異なります。

リストビューがそのアイテムを埋めている間に、複数のビットマップをダウンロードすると仮定します。その場合は、このサンプルを確認するか、私の提案を使用してください:お持ちのviewHolderごとにasyncTaskを用意してください。getViewが呼び出されるたびに、古いものをキャンセルして、現在のアイテム用に新しいものを作成します。

于 2013-02-07T20:49:36.337 に答える
0

1) カスタム アダプターを定義する

2) ホルダーパターンを適用

3)いくつかの画像アップローダーを使用します(たとえば、これ

簡単な例を見てみましょう

于 2013-02-07T20:59:41.547 に答える