2015-10-06 215 views
1

我在列表視圖中選擇多個項目進行刪除。我可以刪除多個項目。代碼如下:如何更改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(); 
    } 

} 

回答

2

編輯:

步驟無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,選擇顏色爲無。 –

相關問題