3

ListViewとlistselector.xmlがあります。最初に、setSeletion(position)を使用してアイテムを設定しました。ただし、このコードでは、アイテムは強調表示されません。アイテムをクリックしたときにのみ強調表示されます。

        ArrayAdapter<String> ad = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listItems);
    timeListView = (ListView) findViewById(R.id.listList);
    timeListView.setAdapter(ad);
    timeListView.setOnItemClickListener(this);      
    timeListView.setSelector(R.drawable.listselector);
    timeListView.setSelection(toSelectPos);

     ============================= 
     XML      
     <ListView android:id="@+id/listList" android:layout_width="match_parent"    android:layout_height="wrap_content"  android:dividerHeight="1dp" >

listselector.xmlコード

     <?xml version="1.0" encoding="UTF-8"?>
     <!-- listselector.xml  -->
     <selector xmlns:android="http://schemas.android.com/apk/res/android">  
<!-- Selected -->
<item android:state_focused="true" android:state_selected="false"
        android:drawable="@drawable/focused"/>

<!-- Pressed -->
<item android:state_selected="true" android:state_focused="false"
        android:drawable="@drawable/selected" />     
      </selector>

上記のコードは完全なリストビューを強調表示します。アイテムの強調表示(bgの色の変更)のみを行います。そのためには、アイテム用に別のxmlを作成し、上記のようにリストではなく、アイテム用のセレクタープロパティを設定する必要があると思います。間違っている場合は私を訂正してください。

ポイントは、とにかくクリックとsetSelectionで選択されたアイテムのみを変更する必要があるということです。上記のコードでは、setSelectionでそれを実現する方法は変わりません。

他のQを調べましたが、探しているポイントが見つからなかったため、plsは他のQの重複としてマークしません。

ありがとう

4

2 に答える 2

1

これが正しい方法であるかどうかはわかりませんが、解決策の下に support-v4 の例のフラグメントデモから見つけました。

チェック可能なカスタム レイアウトを作成し、このレイアウトをリストの行に使用します

public class CheckableLayout extends LinearLayout implements Checkable {
    private boolean mChecked;

    public CheckableLayout (Context context) {
        super(context);
    }

    public CheckableLayout (Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setChecked(boolean checked) {
        mChecked = checked;
        // set the custom background image/color
        setBackgroundResource(checked ? R.drawable.category_item_row_selected
                : R.drawable.custom_category_item_row);
    }

    public boolean isChecked() {
        return mChecked;
    }

    public void toggle() {
        setChecked(!mChecked);
    }

}

次のような単一選択モードとしてリストビューを定義しますYOUR_LISTVIEW.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

行(inside OnItemClickListener)をクリックすると、その行を次のようにチェック済みとして設定する必要があります YOUR_LISTVIEW.setItemChecked(index, true);

それでおしまい

于 2012-08-07T09:37:12.350 に答える
0

おそらくスタックオーバーフローに関するいくつかの回答ですでに見たように、ビューを選択することはできません。これは、ここでわかるように、ユーザーインターフェイスを常にタッチモードにする必要があるように実装されているためです。 ただし、いくつかの回避策があります。できるよ。

次のリスナーを使用して ListView onItemClick を設定できます。

    OnItemClickListener itemClickListener = new OnItemClickListener() {

public void onItemClick(AdapterView<?> arg0, View v, int pos, long id) {

    if (v == lastSelectedView) {

    v.setBackgroundResource(0);
    lastSelectedView = null;

    } else if (v != lastSelectedView) {

    

    if (lastSelectedView != null)

        lastSelectedView
            .setBackgroundColor(android.R.color.transparent);

    lastSelectedView = v;

    v.setBackgroundDrawable(v.getContext().getResources()
        .getDrawable(R.drawable.some_row_background));
    }
}

};

これで、リスビュー項目を必要に応じて色付けします。ただし、落とし穴があります。ビューをリサイクルすると、下または上にスクロールすると別のビューがマークされます。スクロール時にビューを「選択解除」するか、ビューにタグを付ける方法を見つけることができます。

よろしくお願いします

于 2012-08-08T08:30:12.713 に答える