Android ListView等列表点击item设为被选中


SelectItemManger##

几年前写的,不咋地。2022/3/26

package com.nevermore.util;

/**
 * Created by Administrator on 2017/3/26.
 */

import android.util.SparseBooleanArray;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @ClassName:SelectItemManger
 * @PackageName:com.nevermore.util
 * @Create On 2017/3/26   0:39
 * @author:xuchuanting
 * @Copyrights 2017/3/26 nevermore All rights reserved.
 */
public class SelectItemManger {

    public enum Mode {
        MODE_SINGLE_SELECTION, MODE_MULTI_SELECTION;
    }

    //用于监听多选模式达到上限
    public interface OnReachToMaxListener {
        void reachToMax();
    }

    //单选模式 item 变化
    public interface OnItemChangeListener {
        void itemChange(int position, Object item);
    }

    public interface OnGetItem {
        Object getItem(int positon);
    }

    /**
     * 单选模式
     */

    public static int MODE_SINGLE_SELECTION = 0;

    //最近一次点击的条目位置
    private int lastposition = -1;

    private OnGetItem getItem;

    private OnItemChangeListener itemChangeListener;
    private Mode mode;

    private int mMax = -1;//多选模式,上限,-1无上限

    private int selectedItemCount = 0;//已经选择的条目数量

    private OnReachToMaxListener maxListener;

    /**
     * 多选模式
     */

    public static int MODE_MULTI_SELECTION = 1;

    private int size;
    private final SparseBooleanArray booleanArray;


    public SelectItemManger(int size, Mode mode) {

        this.size = size;
        this.mode = mode;
        booleanArray = new SparseBooleanArray();
    }

    public int getItemCount() {
        return size;
    }


    public void setReachToMaxListener(OnReachToMaxListener maxListener) {
        this.maxListener = maxListener;
    }

    /**
     * 切换模式
     *
     * @param mode
     */
    public void changeMode(Mode mode) {
        this.mode = mode;
    }


    public OnItemChangeListener getItemChangeListener() {
        return itemChangeListener;
    }

    public void setItemChangeListener(OnItemChangeListener itemChangeListener, OnGetItem getItem) {
        this.itemChangeListener = itemChangeListener;
        this.getItem = getItem;
    }

    /**
     * 设置多选上限
     *
     * @param max
     */
    public void setMaxItem(int max) {
        mMax = max;
    }


    /**
     * 选中条目
     *
     * @param position
     */
    public void selectItem(int position) {
        if (this.mode.equals(Mode.MODE_SINGLE_SELECTION)) {
            if (lastposition != position) {
                booleanArray.put(lastposition, false);
                if (itemChangeListener != null && getItem != null) {
                    itemChangeListener.itemChange(position, getItem.getItem(position));
                }
            }

            booleanArray.put(position, true);

        } else {//多选模式,第一次选种,第二次取消
            boolean b = booleanArray.get(position);
            if (b) {
                booleanArray.put(position, false);
                selectedItemCount--;
            } else {


                if (maxListener != null && mMax != -1 && selectedItemCount == mMax) {//达到上限
                    maxListener.reachToMax();//上限到达后,再次选择调用
                } else {
                    booleanArray.put(position, true);
                    selectedItemCount++;
                }

            }
        }

        lastposition = position;
    }


    /**
     * 适用于多选模式,选择多个条目(一般用于初始化操作,很少有一次性点击选中多个条目的需求吧)
     * 一个一个选就用{@link #selectItem}好了
     *
     * @param positions
     */
    public void selectItems(List positions) {
        if (this.mode.equals(Mode.MODE_MULTI_SELECTION)) {
            selectedItemCount += positions.size();
            for (int i = 0; i < positions.size(); i++) {
                Integer integer = positions.get(i);
                booleanArray.put(integer, true);
            }


        } else {
            throw new IllegalStateException("单选模式不能选多个条目!");
        }

    }


    /**
     * 获取被选中条目位置position
     *
     * @return
     */
    public List getSelectedItem() {
        ArrayList list = new ArrayList<>();
        for (int i = 0; i < booleanArray.size(); i++) {
            if (booleanArray.get(booleanArray.keyAt(i))) {
                list.add(booleanArray.keyAt(i));
            }
        }
        return list;
    }

    /**
     * 判断条目是否被选中
     *
     * @param position
     * @return
     */
    public boolean isItemSelected(int position) {

        return booleanArray.get(position);
    }

    /**
     * 添加新条目,如上拉加载场景
     *
     * @param size
     */
    public void addNewItems(int size) {

        this.size += size;
    }

    /**
     * 删除已选中条目
     */
    public void delectSelectedItem() {
        List selectItem = getSelectedItem();
        for (int i = 0; i < selectItem.size(); i++) {
            Integer key = selectItem.get(i);
            booleanArray.delete(key);
        }
        size -= selectItem.size();
    }


}