1

8つ(4つ表示)のリストアイテムを含むListViewがあります。各ビューには、1つのTextViewと1つのImageView(最初はtransparentに設定)が含まれています。onItemClickメソッドからimgをimageViewに設定しようとしています。それは私にとってはうまく機能していますが、下にスクロールすると他のビューも影響します。たとえば、0番目の位置のアイテムを選択すると、0番目と4番目の位置の両方のビューが同じimgに設定されます。どうすればこれを解決できますか。

Javaコード:

list.setAdapter(new SimpleAdapter(this,
            application.distanceList, R.layout.drop_down_view, from, to));
list.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> arg0, View v, int arg2,
                long arg3) {
            try {
                ((ImageView) temp.findViewById(R.id.ddviv))
                        .setImageResource(android.R.color.transparent);
            } catch (NullPointerException e) {

            }
            ((ImageView) v.findViewById(R.id.ddviv))
                    .setImageResource(R.drawable.drop_sel);
            temp = v;}
    });
4

2 に答える 2

0

の行からこれらの画像を設定する別のオプションListViewは、いくつかのデータ調整を行い、またを使用することSimpleAdapter.ViewBinderです。from行ビューのデータをどのように設定するか(およびto配列に何があるかわかりません)、または何があるかわかりません。そのapplication.distanceListため、ここに小さな例を示します。まず、 (行に対応する)Mapからのそれぞれに、次のようなエントリを追加する必要があります。application.distanceListListView

map.put("position", "x"); // where x is the list row number(for the first Map in application.distanceList x will be 0, for the second Map in application.distanceList x will be 1 etc)

"position"を配列に含め、fromこれに対応して、行レイアウトからの"position"IDを配列に配置します。ImageViewto

SimpleAdapter.ViewBinder次に、行の画像をバインドするためにを追加する必要がありますListView(これはListViewのリサイクルメカニズムを処理します):

mAdapter.setViewBinder(new SimpleAdapter.ViewBinder() {

            @Override
            public boolean setViewValue(View view, Object data,
                    String textRepresentation) {
                            // view is the ImageView from the row layout
                            // data is the x from the position column
                if (view.getId() == R.id.imageView1) {
                    Integer rowNumber = Integer.parseInt((String) data);
                                    // below is the explanation for mImageIds
                    ((ImageView) view).setImageResource(mImageIds[rowNumber]);
                    return true;
                }
                return false;
            }
        });

は、の行のドローアブルのIDを保持するmImageIds配列です。intsListView

// a field in your class
private int[] mImageIds = new int[8]; // you said you had 8 rows

//.. in the onCreate method initialize the mImageIds array

    for (int j = 0; j < 8; j++) {
        mImageIds[j] = R.drawable.ic_launcher;// a default image(you could use android.R.color.transparent for empty)
    }

最後にonItemClickコールバックで:

public void onItemClick(AdapterView<?> arg0, View v, int arg2,
                long arg3) {
       mImageIds[position] = android.R.drawable.btn_minus; // the desired image
       mAdapter.notifyDataSetChanged();
}

これはそれよりも複雑に聞こえますが、原則を理解していただければ幸いです。他の解決策は、他のユーザーがすでに述べたようにカスタムアダプタを構築することです。

于 2012-07-19T12:26:32.330 に答える
0

メソッド内で sを使用してカスタム アダプターを使用する必要があります (拡張BaseAdapterが適切な選択です) 。クリックすると、いくつかの属性を変更して を呼び出します。ViewHoldergetView()notifyDataSetChanged()

カスタム アダプタの実装方法がわからない場合は、Googleにたくさんのヒントがあります =)

于 2012-07-19T10:44:14.603 に答える