Android 如何更改ListView中删除多个项目行中的背景色

Android 如何更改ListView中删除多个项目行中的背景色,android,listview,android-listview,Android,Listview,Android Listview,我正在listview中选择要删除的多个项目。我可以删除多个项目。代码如下: smsListView.setMultiChoiceModeListener(new MultiChoiceModeListener() { @Override public void onItemCheckedStateChanged(ActionMode mode, int position, long

我正在listview中选择要删除的多个项目。我可以删除多个项目。代码如下:

smsListView.setMultiChoiceModeListener(new MultiChoiceModeListener() {

                @Override
                public void onItemCheckedStateChanged(ActionMode mode,
                        int position, long id, boolean checked) {
                    // Capture total checked items
                    final int checkedCount = smsListView.getCheckedItemCount();
                    // Set the CAB title according to total checked items
                    mode.setTitle(checkedCount + " Selected");
                    View v = smsListView.getChildAt(position
                            - smsListView.getFirstVisiblePosition());
                    // Calls toggleSelection method from ListViewAdapter Class
                    ((SmsArrayAdapter) arrayAdapter).toggleSelection(position,v);

                }

                @Override
                public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                    switch (item.getItemId()) {
                    case R.id.delete:
                        // Calls getSelectedIds method from ListViewAdapter Class
                        SparseBooleanArray selected = ((SmsArrayAdapter) arrayAdapter)
                                .getSelectedIds();
                        // Captures all selected ids with a loop
                        for (int i = (selected.size() - 1); i >= 0; i--) {
                            if (selected.valueAt(i)) {
                                SMSItem selecteditem = (SMSItem) arrayAdapter.getItem(selected.keyAt(i));
                                // Remove selected items following the ids
                                arrayAdapter.remove(selecteditem);
                            }
                        }
                        // Close CAB
                        mode.finish();
                        return true;
                    default:
                        return false;
                    }
                }

                @Override
                public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                    mode.getMenuInflater().inflate(R.menu.activity_main, menu);
                    return true;
                }

                @Override
                public void onDestroyActionMode(ActionMode mode) {
                    // TODO Auto-generated method stub
                    ((SmsArrayAdapter) arrayAdapter).removeSelection();
                }

                @Override
                public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                    // TODO Auto-generated method stub
                    return false;
                }


            });
但我想更改所选行的颜色。当前列表中的选择项上没有颜色

我试过以下方法

步骤1:在listview项目布局的行下方写入

android:background="?android:attr/activatedBackgroundIndicator"
步骤2:将下面的行写入style.xml文件

 <style name="AppTheme" parent="@style/Theme.AppCompat.Light">
        <item name="actionBarStyle">@style/MyActionBar</item>
        <item name="android:activatedBackgroundIndicator">@drawable/muliple_selected_item</item>
 </style>

@样式/MyActionBar
@可抽取/多个选定项目
步骤3:将muliple_selected_item.xml创建到Drawable文件夹中,并编写以下代码

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_activated="true" android:drawable="@color/lvMultipleSelectionColor" />
    <item android:state_checked="true" android:drawable="@color/lvMultipleSelectionColor" />
    <item android:state_pressed="true" android:drawable="@color/lvMultipleSelectionColor" />
    <item android:drawable="@android:color/transparent" />
</selector>

但根据这段代码,当我选择listview中的任何项目时,列表中的所有项目都会上色。我只想将背景颜色更改为我选择的项目。 我该怎么做

listview布局如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/MainLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <RelativeLayout
        android:id="@+id/smsItemContainerRelativeLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerInParent="true"
            android:layout_gravity="center_horizontal|top"
            android:text="SMS Inbox"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <TextView
            android:id="@+id/unread_count"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="-20dp" 
            android:background="@drawable/notification_bg"
            android:gravity="center"
            android:text="88"
            android:textColor="@android:color/background_light"
            android:textSize="20sp"
            android:textStyle="bold"   
            android:layout_alignParentRight="true"
            android:visibility="invisible" />



    </RelativeLayout>

    <ListView
        android:id="@+id/SMSList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"  />


</LinearLayout>

行布局如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    android:background="@drawable/muliple_selected_item" >>

    <TextView
        android:id="@+id/textView_from"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="SMS From"
        android:textAppearance="?android:attr/textAppearanceLarge" />



    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
         <TextView
        android:id="@+id/textView_sms"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="0.5"
        android:text="SMS : "  />

         <TextView
        android:id="@+id/textView_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="right"
        android:text="Time : "  />

    </LinearLayout>

</LinearLayout>

>
muliple_selected_item.xml如下所示:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_activated="true" android:drawable="@color/lvMultipleSelectionColor" />
    <item android:state_checked="true" android:drawable="@color/lvMultipleSelectionColor" />
    <item android:state_pressed="true" android:drawable="@color/lvMultipleSelectionColor" />
    <item android:drawable="@android:color/transparent" />
</selector>

您可以使用可绘图工具进行如下操作

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

并将其设置为行布局的背景

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/list_item_background_activated" >
</RelativeLayout>

您需要将多选模式设置为您的
列表视图

smsListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
您需要为
列表视图的
行布局创建可绘制文件,并在该布局中使用
可绘制
作为背景

以下是可绘制文件:

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

编辑:

移除
selectView()
中使用的
changeBackgroundColor()
,并检查其是否有效

你可以参考这个。这可能对你有帮助

您可以通过以下方式实现:-

  • 首先将属性(变量)添加到SMSItem类,默认值为false
  • 在onItemCheckedStateChanged方法执行时,选择变量的设置值
  • 在适配器的getView方法上,必须检查isSelected变量的值。然后在此基础上进行决策,如果为false,则设置默认值 背景,如果为true,则将另一个背景设置为相应的行
  • 从OnItemCheckdStateChanged对Adepter调用notifyDataSetChanged()方法
  • 根据您的要求,即时消息发布代码:-

    将此添加到onItemCheckedStateChanged方法

    并自己管理getView


    只需在单行xml文件(定义listview单行布局的xml文件)中添加以下行:-

    无需再编辑任何xml文件。有关更多详细信息,请访问以下链接:-


    希望这有帮助:)

    我正在关注这个链接。你能发布你的xml吗?我必须发布哪种xml?包含ListView的xml请看这个,我已经完成了。但是没有注意到行背景颜色的变化。请发布您的listview布局和listview行布局显示多个选中的项目文件,并设置android:choiceMode=“MultipleChice”您是否已在xml和java文件中设置choicemode?是的,我已在xml和java文件中设置choicemode。我可以选择listview的多个项目。我面临的唯一问题是在所选项目中没有注意到背景色。我已经做到了。但是没有注意到行背景颜色的变化。它可以工作,它会改变颜色,但在我的例子中,它会将颜色更改为黑色,而我看不到视图,如何在不影响初始项颜色的情况下在其中定义特定颜色?
    SMSItem selecteditem = (SMSItem) arrayAdapter.getItem(selected.keyAt(i));
    selecteditem.setSelection(checked);
    notifydatasetChanged();
    
    android:background="?android:attr/activatedBackgroundIndicator"