如何更改ListView中多个项目的背景颜色

问题描述:

我在列表视图中选择多个项目进行删除。我可以删除多个项目。代码如下:如何更改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"); 
        // Calls toggleSelection method from ListViewAdapter Class 
        ((SmsArrayAdapter) arrayAdapter).toggleSelection(position); 

       } 

       @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; 
       } 


      }); 

但是我想改变我选择的行的颜色。目前,列表中的选择项目没有颜色。

enter image description here

我怎样才能改变所选项目的行颜色?

arrayadapter的代码如下:

public class SmsArrayAdapter extends ArrayAdapter<SMSItem> { 

    List<SMSItem> smsBody; 
    Context context; 
    private static LayoutInflater inflater = null; 
    String fromNumber; 
    private SparseBooleanArray mSelectedItemsIds; 

    public SmsArrayAdapter(Context context, int resource, 
      List<SMSItem> smsBody, String fromNumber) { 
     super(context, resource, smsBody); 
     this.smsBody = smsBody; 
     this.context = context; 
     inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     this.fromNumber = fromNumber; 
     mSelectedItemsIds = new SparseBooleanArray(); 
    } 

    public SMSItem getStr(int position) { 
     return smsBody.get(position); 
    } 

    public void setRead(int position, String smsMessageId) { 
     smsBody.get(position).status = true; 
     SMSItem smsItem = smsBody.get(position); 
     smsItem.status = true; 
     //smsBody.set(position, smsItem); 
     ContentValues values = new ContentValues(); 
     values.put("read",true); 
     int flag = context.getContentResolver().update(Uri.parse("content://sms/inbox"), 
       values, "_id=" + smsMessageId, null); 
     Toast.makeText(context, "The result is "+flag, Toast.LENGTH_LONG).show();  

    /* Uri uri = Uri.parse("content://sms/inbox"); 
     String selection = "address = ? AND body = ? AND read = ?"; 
     String from = "03590000004"; 
     String body =smsItem.sms; 
     String[] selectionArgs = {from, body, "0"}; 

     ContentValues values = new ContentValues(); 
     values.put("read", true); 

     int flag = context.getContentResolver().update(uri, values, selection, selectionArgs); 
     Toast.makeText(context, "The result is "+flag, Toast.LENGTH_LONG).show(); */ 

    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return super.getCount(); 
    } 

    @Override 
    public SMSItem getItem(int position) { 
     // TODO Auto-generated method stub 
     return smsBody.get(position); 
    } 

    public static class ViewHolder { 
     public TextView textfrom; 
     public TextView text_sms; 
     public TextView text_time; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    // Toast.makeText(context, "The index is "+position, Toast.LENGTH_LONG).show(); 
     ViewHolder holder; 
     if (convertView == null) { 

      /****** Inflate tabitem.xml file for each row (Defined below) *******/ 
      convertView = inflater.inflate(R.layout.row_item, null); 

      /****** View Holder Object to contain tabitem.xml file elements ******/ 

      holder = new ViewHolder(); 

      holder.textfrom = (TextView) convertView 
        .findViewById(R.id.textView_from); 
      holder.text_sms = (TextView) convertView 
        .findViewById(R.id.textView_sms); 
      holder.text_time = (TextView) convertView 
        .findViewById(R.id.textView_time); 

      /************ Set holder with LayoutInflater ************/ 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.textfrom.setText(" " + fromNumber); 
     SMSItem smsItem = smsBody.get(position); 
     String smsTextToDisplay = smsItem.sms; 
     if (smsTextToDisplay.length() > 100) 
      smsTextToDisplay = smsTextToDisplay.substring(0, 99) + " ..."; 

     holder.text_sms.setText(smsTextToDisplay); 
     //View.setBackground(selectedIds.contains(position) ? R.color.result_image_border : android.R.color.transparent); 
     holder.text_time.setText(smsItem.time); 
     if (smsItem.status == false) { 
      convertView.setBackgroundColor(context.getResources().getColor(
        R.color.light_blue_overlay)); 
     } 
     else 
     { 
      convertView.setBackgroundColor(Color.WHITE);  
     } 
     return convertView; 
    } 

    public SparseBooleanArray getSelectedIds() { 
     // TODO Auto-generated method stub 
     return mSelectedItemsIds; 
    } 

    public void removeSelection() 
    { 
     // TODO Auto-generated method stub 
     mSelectedItemsIds = new SparseBooleanArray(); 
     notifyDataSetChanged(); 
    } 

    public void toggleSelection(int position) { 
     // TODO Auto-generated method stub 
     selectView(position, !mSelectedItemsIds.get(position)); 
    } 

    public void selectView(int position, boolean value) { 
     if (value) 
      mSelectedItemsIds.put(position, value); 
     else 
      mSelectedItemsIds.delete(position); 
     notifyDataSetChanged(); 
    } 

} 

编辑:

步骤无1:写入下面一行到您的列表视图项布局

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> 

步骤没有3:创建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> 

在这里,而不是@色/ lvMultipleSelectionColor你可以写自己喜欢的颜色

希望它能帮助。

+0

什么是selectedIds变量? –

+0

http://www.androidbegin.com/tutorial/android-delete-multiple-selected-items-listview-tutorial/您必须阅读本教程。这一切你需要的。 –

+0

我遵循本教程,但我的选择颜色不是蓝色。 Infact,选择颜色为无。 –