web-dev-qa-db-ja.com

コンテキストアクションバーのあるカスタムリストビューで選択されたアイテム

最近、Android actionbars および contextual action bars (CAB)を使用し始めました。

ListActivityというアクティビティが1つだけあります。基本的に、次のコードを使用してCABを「アクティブ化」します。

ListView listView = getListView();
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listView.setMultiChoiceModeListener(new MultiChoiceModeListener() {

    @Override
    public void onItemCheckedStateChanged(ActionMode mode, int position,
                                      long id, boolean checked) {
        // Here you can do something when items are selected/de-selected,
        // such as update the title in the CAB
    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        // Respond to clicks on the actions in the CAB
        switch (item.getItemId()) {
            case R.id.menu_delete:
                deleteSelectedItems();
                mode.finish(); // Action picked, so close the CAB
                return true;
            default:
                return false;
        }
    }

    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        // Inflate the menu for the CAB
        MenuInflater inflater = mode.getMenuInflater();
        inflater.inflate(R.menu.context, menu);
        return true;
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {
        // Here you can make any necessary updates to the activity when
        // the CAB is removed. By default, selected items are deselected/unchecked.
    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        // Here you can perform updates to the CAB due to
        // an invalidate() request
        return false;
    }
});

リストのレイアウト:

<ImageView
    Android:id="@+id/message_on_clipboard_icon"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_gravity="center_vertical"
    Android:minWidth="30dp"
    Android:padding="7sp"
    Android:src="@Android:drawable/presence_online" >
</ImageView>

<LinearLayout
    Android:id="@+id/linearLayout2"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:background="@drawable/listitem_background"
    Android:orientation="vertical" >

    <TextView
        Android:id="@+id/message"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_marginRight="5sp"
        Android:fadingEdge="horizontal"
        Android:singleLine="true"
        Android:text="TextView"
        Android:textAppearance="?android:attr/textAppearanceLarge" >
    </TextView>

    <LinearLayout
        Android:id="@+id/linearLayout1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:background="@drawable/listitem_background"
        Android:orientation="horizontal" >

        <TextView
            Android:id="@+id/message_length"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_marginRight="5sp"
            Android:text="@string/message_length"
            Android:textAppearance="?android:attr/textAppearanceSmall" >
        </TextView>

        <TextView
            Android:id="@+id/message_count"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_marginRight="5sp"
            Android:text="TextView"
            Android:textAppearance="?android:attr/textAppearanceSmall" >
        </TextView>

        <TextView
            Android:id="@+id/date_label"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_marginRight="5sp"
            Android:text="@string/date_label" >
        </TextView>

        <TextView
            Android:id="@+id/date_message"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="TextView" >
        </TextView>
    </LinearLayout>
</LinearLayout>

そして、main.xml内で:

<ListView
    Android:id="@+Android:id/list"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
>
</ListView>

ここで、リストアイテムを長押しすると、CABが期待どおりに表示されます。

cab

MultiChoiceModeListenerを使用しますが、残念ながら、選択したリストアイテムはここの例のように背景を変更しません(アイテムが選択された後の水色の背景):

enter image description here

カスタムセレクターを使用する必要がありますか?または、Androidがこれをどのように処理し、LinearLayoutsを透明にする必要があるだけですか?

カスタムセレクターを使用したListViewアイテムの背景

誰かが私を正しい方向に向けることができたら素晴らしいですね。さらにアプリケーションコードまたはxmlファイルが必要な場合はお知らせください。

41
domi

私はこれをCHOICE_MODE_SINGLEでのみテストしたことがありますが、その状況では以下を実行することで機能します。

  • コードでリストアイテムを選択するときは、リスト内のそのアイテムに対して(ListViewインスタンスで)「setItemChecked(position、checked)」メソッドを呼び出します。

  • これを個々のListViewアイテムのXMLに追加します。
    Android:background="?android:attr/activatedBackgroundIndicator"

52
Alexander Lucas

途中でcustom_backgroundと呼ばれるドロアブルを作成するだけです:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@color/highlight" Android:state_activated="true"/>
    <item Android:drawable="@color/normal"/>
</selector>

親レイアウトの背景として設定します。

Android:background="@drawable/custom_background"
12
Juan M. Rivero

ICSデバイス以上をサポートしようとしていますが、この新しいレイアウトは、選択した行を強調表示したまま、達成しようとしていることを実行します。

adapter = new SimpleCursorAdapter(getActivity(),
     Android.R.layout.simple_list_item_activated_1, 
     null, 
     from, 
     to,
     0);
0
jimsis

この問題が解決しない場合は、Android:minSdkVersionを確認してください。低すぎると、セレクタの背景色が機能しない場合があります。

0
pengguang001