简体   繁体   中英

How to change background color in multiple item delete in ListView

I am selecting multiple item in listview for delete . I can delete multiple item . The code is as follows :

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


            });

But I want to change color of the rows that I have selected . Currently there are no color on selection item in the list .

在此处输入图片说明

How can I change selected item rows color ?

The code of arrayadapter is as follows :

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();
    }

}

EDIT:

Step no 1: write below line to to your listview item layout

    android:background="?android:attr/activatedBackgroundIndicator"

Step no 2: write below line to style.xml file

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

Step no 3: Create muliple_selected_item.xml into Drawable folder and write below code.

    <?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>

here instead of @color/lvMultipleSelectionColor you can write your own color

Hope it helps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM