0

すでにテキストとチェックボックスがある ListView のアイテムにアイコンを追加することを考えていました: simple_list_item_multiple_choice.xml は、いくつかの属性を持つ < CheckedTextView > タグにすぎません

私はカスタム アダプター ソリューションを認識していますが、より直感的なソリューションが本当に必要です。ソースコードをいじるのは直感的ではないことはわかっていますが、私が言いたかったのは、これを行うだけの簡単さです:

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, // context
                android.R.layout.simple_list_item_multiple_choice,  // view for an item in the list
                myCursor,                                           // cursor used for populating list items
                new String[] {dBHelper.CONTACT_NAME},               // column in cursor we are getting data from
                new int[] {android.R.id.text1});                    // where to put this data in the item's view

結果は次のようなもので取得できます。

SparseBooleanArray checkedPositions = lv.getCheckedItemPositions();

別のファイルに書かれたコード


ソースコードの使用: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.3_r1/android/widget/CheckedTextView.java/

私の問題は、Eclipseが解決できないことです: R.styleable.CheckedTextViewmPaddingRight :

TypedArray a = context.obtainStyledAttributes(attrs,
                R.styleable.CheckedTextView, defStyle, 0);

Drawable d = a.getDrawable(R.styleable.CheckedTextView_checkMark);

boolean checked = a.getBoolean(R.styleable.CheckedTextView_checked, false);

mPaddingRight = mCheckMarkWidth + mBasePaddingRight;
            d.setState(getDrawableState());
        } else {
            mPaddingRight = mBasePaddingRight;
        }

@Override
    public void setPadding(int left, int top, int right, int bottom) {
        super.setPadding(left, top, right, bottom);
        mBasePaddingRight = mPaddingRight;
    }

ありがとうございました... :)

4

1 に答える 1

1

上記のコメントで述べたように、ListView アイテムにアイコンを追加するだけであれば、ソースに移動する必要はありません。必要なものを記述した新しいレイアウトを作成するだけです。以下に例を示しますが、これは 1 つの方法にすぎません。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:paddingLeft="6dp"
    android:paddingRight="6dp">

    <ImageView
        android:id="@+id/icon1"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:src="@drawable/ic_launcher" />

    <CheckedTextView
        android:id="@android:id/text1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:gravity="center_vertical"
        android:checkMark="?android:attr/listChoiceIndicatorMultiple"
        android:layout_toRightOf="@id/icon1"
    />
</RelativeLayout>

次に、Activity コードで次のようにします。

ListView listView = (ListView) findViewById(R.id.listView1);
// I'm just going to use an ArraySdapter, for simplicity...

listView.setAdapter(new ArrayAdapter<String>(this, R.layout.item, android.R.id.text1, getResources().getStringArray(R.array.items)));

// or, for the sake of example (note, not optimized at all)

listView.setAdapter(new ArrayAdapter<String>(this, R.layout.item, android.R.id.text1, getResources().getStringArray(R.array.items)) {
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);
        if (position % 2 == 0) {
            ((ImageView) view.findViewById(R.id.icon1)).setImageResource(R.drawable.ic_launcher);
        } else {
            ((ImageView) view.findViewById(R.id.icon1)).setImageResource(R.drawable.ic_launcher);
        }
        return view;
    }
});

上記は柔軟性を高めますが、RelativeLayout と ImageView を追加する代わりに、CheckedTextView に android:drawableLeft 属性を追加することもできます。

于 2012-07-30T15:10:03.430 に答える