Android中不一样的多级树

多级树形结构:我前面有过一篇使用多级树形结构的文章Android中多级树形列表,但是我们实际开发中可能会有不同的需求,本文楼主会提供一个思路供大家参考。

多级树

如下图,是楼主需要的多级树
多级树

需求:1、人员有分组的,显示在每一个组的分组下,没有分组的人员跟每一个组名同一级。2、每一个分组继续重复1的操作。

实体类的数据结构,懒得去获取数据,将就着看吧

public class Contact implements Parcelable {
    /**
     * orgId : 2f8c0d8a-86cf-42e3-9566-26a399673f89
     * orgName : 汤坑小学校长室
     * orgCode : E1001
     * parentCode : JG0006
     * parentCodePath : jyj10000,JG0006
     * parentNamePath : null
     * description : null
     * sequence : 1
     * orgType : 2
     * orgTypeName : null
     * child : [{"orgId":"1","orgName":"教育局","orgCode":"jyj10000","parentCode":"0","parentCodePath":null,"parentNamePath":null,"description":null,"sequence":1,"orgType":0,"orgTypeName":null,"child":null,"userInfoDTOS":null,"userIds":null,"childOrgSize":9,"memberSize":0}]
     * userInfoDTOS : [{"userId":"b4adf0c1-5698-4931-9ba4-027152a19113","schoolId":null,"username":"tk_tangqingdong","realName":"汤庆东","avatar":null,"sex":0,"age":null,"hobbies":null,"ethnicity":null,"ethnicityName":null,"nationality":null,"nationalityName":null,"idCardNo":null,"phoneNumber":"13925258648","email":null,"origin":null,"address":null,"isMarried":null,"introduction":null,"officePhone":null,"userType":1,"birthday":null,"politicalstatus":null,"politicalstatusName":null,"sequence":null,"isDelete":null,"creatorId":null,"creatorName":null,"createTime":null,"updateTime":null,"careNum":null,"userPoints":null,"isMarriedStr":null,"orgId":"2f8c0d8a-86cf-42e3-9566-26a399673f89","orgName":"汤坑小学校长室","orgCode":"E1001","positionName":"汤坑小学校长","positionId":"19ff5e5f-57f4-4271-bfe6-cb1f4adfc50b","positionCode":"SJAEH2","employeeNo":"TK10001","employeeId":"9ebcc793-c06e-4c15-97ab-8626b0937438","employeeTypeStr":"管理人员","employeeType":"2355743645568","account":"tk_tangqingdong","password":null,"isCareEach":null},{"userId":"a39943bf-19ba-40cb-8b3a-06c750cf7916","schoolId":null,"username":"tk_zhoujingbin","realName":"周景斌","avatar":null,"sex":0,"age":null,"hobbies":null,"ethnicity":null,"ethnicityName":null,"nationality":null,"nationalityName":null,"idCardNo":null,"phoneNumber":"13609610286","email":null,"origin":null,"address":null,"isMarried":null,"introduction":null,"officePhone":null,"userType":1,"birthday":null,"politicalstatus":null,"politicalstatusName":null,"sequence":null,"isDelete":null,"creatorId":null,"creatorName":null,"createTime":null,"updateTime":null,"careNum":null,"userPoints":null,"isMarriedStr":null,"orgId":"2f8c0d8a-86cf-42e3-9566-26a399673f89","orgName":"汤坑小学校长室","orgCode":"E1001","positionName":"汤坑小学办公室主任","positionId":"aa98e4f5-1ca0-4c05-859f-eb0c23f57174","positionCode":"TKBGSZR1001","employeeNo":"TK10002","employeeId":"4de52939-2578-4cda-a497-98c9b0850aab","employeeTypeStr":"管理人员","employeeType":"2355743645568","account":"tk_zhoujingbin","password":null,"isCareEach":null},{"userId":"71609098-2e04-4f56-b268-768acf79d2bb","schoolId":null,"username":"tk_niuyinggang","realName":"牛颖刚","avatar":null,"sex":0,"age":null,"hobbies":null,"ethnicity":null,"ethnicityName":null,"nationality":null,"nationalityName":null,"idCardNo":null,"phoneNumber":"18676726518","email":null,"origin":null,"address":null,"isMarried":null,"introduction":null,"officePhone":null,"userType":1,"birthday":null,"politicalstatus":null,"politicalstatusName":null,"sequence":null,"isDelete":null,"creatorId":null,"creatorName":null,"createTime":null,"updateTime":null,"careNum":null,"userPoints":null,"isMarriedStr":null,"orgId":"2f8c0d8a-86cf-42e3-9566-26a399673f89","orgName":"汤坑小学校长室","orgCode":"E1001","positionName":"汤坑小学办公室副主任","positionId":"a6ca62bc-8a9a-4bac-87c0-62b325799d93","positionCode":"TKBGSFZR1002","employeeNo":"TK10008","employeeId":"34bc8da4-7278-4691-aa0a-14298cebdce8","employeeTypeStr":"管理人员","employeeType":"2355743645568","account":"tk_niuyinggang","password":null,"isCareEach":null}]
     * userIds : null
     * childOrgSize : null
     * memberSize : null
     */

    private String orgId;
    private String orgName;
    private String orgCode;
    private String parentCode;
    private String parentCodePath;
    private String parentNamePath;
    private String description;
    private int sequence;
    private int orgType;
    private String orgTypeName;
    private String userIds;
    private String childOrgSize;
    private String memberSize;
    private List<Contact> child;
    private List<UserInfoDTOSBean> userInfoDTOS;

    protected Contact(Parcel in) {
        orgId = in.readString();
        orgName = in.readString();
        orgCode = in.readString();
        parentCode = in.readString();
        parentCodePath = in.readString();
        parentNamePath = in.readString();
        description = in.readString();
        sequence = in.readInt();
        orgType = in.readInt();
        orgTypeName = in.readString();
        userIds = in.readString();
        childOrgSize = in.readString();
        memberSize = in.readString();
        child = in.createTypedArrayList(Contact.CREATOR);
        userInfoDTOS = in.createTypedArrayList(UserInfoDTOSBean.CREATOR);
    }

    public static final Creator<Contact> CREATOR = new Creator<Contact>() {
        @Override
        public Contact createFromParcel(Parcel in) {
            return new Contact(in);
        }

        @Override
        public Contact[] newArray(int size) {
            return new Contact[size];
        }
    };

    public void setOrgId(String orgId) {
        this.orgId = orgId;
    }

    public void setOrgName(String orgName) {
        this.orgName = orgName;
    }

    public void setOrgCode(String orgCode) {
        this.orgCode = orgCode;
    }

    public void setParentCode(String parentCode) {
        this.parentCode = parentCode;
    }

    public void setParentCodePath(String parentCodePath) {
        this.parentCodePath = parentCodePath;
    }

    public void setParentNamePath(String parentNamePath) {
        this.parentNamePath = parentNamePath;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public void setSequence(int sequence) {
        this.sequence = sequence;
    }

    public void setOrgType(int orgType) {
        this.orgType = orgType;
    }

    public void setOrgTypeName(String orgTypeName) {
        this.orgTypeName = orgTypeName;
    }

    public void setUserIds(String userIds) {
        this.userIds = userIds;
    }

    public void setChildOrgSize(String childOrgSize) {
        this.childOrgSize = childOrgSize;
    }

    public void setMemberSize(String memberSize) {
        this.memberSize = memberSize;
    }

    public void setChild(List<Contact> child) {
        this.child = child;
    }

    public void setUserInfoDTOS(List<UserInfoDTOSBean> userInfoDTOS) {
        this.userInfoDTOS = userInfoDTOS;
    }

    public String getOrgId() {
        return orgId;
    }

    public String getOrgName() {
        return orgName;
    }

    public String getOrgCode() {
        return orgCode;
    }

    public String getParentCode() {
        return parentCode;
    }

    public String getParentCodePath() {
        return parentCodePath;
    }

    public String getParentNamePath() {
        return parentNamePath;
    }

    public String getDescription() {
        return description;
    }

    public int getSequence() {
        return sequence;
    }

    public int getOrgType() {
        return orgType;
    }

    public String getOrgTypeName() {
        return orgTypeName;
    }

    public String getUserIds() {
        return userIds;
    }

    public String getChildOrgSize() {
        return childOrgSize;
    }

    public String getMemberSize() {
        return memberSize;
    }

    public List<Contact> getChild() {
        return child;
    }

    public List<UserInfoDTOSBean> getUserInfoDTOS() {
        return userInfoDTOS;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(orgId);
        parcel.writeString(orgName);
        parcel.writeString(orgCode);
        parcel.writeString(parentCode);
        parcel.writeString(parentCodePath);
        parcel.writeString(parentNamePath);
        parcel.writeString(description);
        parcel.writeInt(sequence);
        parcel.writeInt(orgType);
        parcel.writeString(orgTypeName);
        parcel.writeString(userIds);
        parcel.writeString(childOrgSize);
        parcel.writeString(memberSize);
        parcel.writeTypedList(child);
        parcel.writeTypedList(userInfoDTOS);
    }

    public static class UserInfoDTOSBean implements Parcelable {
        /**
         * userId : b4adf0c1-5698-4931-9ba4-027152a19113
         * schoolId : null
         * username : tk_tangqingdong
         * realName : 汤庆东
         * avatar : null
         * sex : 0
         * age : null
         * hobbies : null
         * ethnicity : null
         * ethnicityName : null
         * nationality : null
         * nationalityName : null
         * idCardNo : null
         * phoneNumber : 13925258648
         * email : null
         * origin : null
         * address : null
         * isMarried : null
         * introduction : null
         * officePhone : null
         * userType : 1
         * birthday : null
         * politicalstatus : null
         * politicalstatusName : null
         * sequence : null
         * isDelete : null
         * creatorId : null
         * creatorName : null
         * createTime : null
         * updateTime : null
         * careNum : null
         * userPoints : null
         * isMarriedStr : null
         * orgId : 2f8c0d8a-86cf-42e3-9566-26a399673f89
         * orgName : 汤坑小学校长室
         * orgCode : E1001
         * positionName : 汤坑小学校长
         * positionId : 19ff5e5f-57f4-4271-bfe6-cb1f4adfc50b
         * positionCode : SJAEH2
         * employeeNo : TK10001
         * employeeId : 9ebcc793-c06e-4c15-97ab-8626b0937438
         * employeeTypeStr : 管理人员
         * employeeType : 2355743645568
         * account : tk_tangqingdong
         * password : null
         * isCareEach : null
         */

        private String userId;
        private String schoolId;
        private String username;
        private String realName;
        private String avatar;
        private int sex;
        private String age;
        private String hobbies;
        private String ethnicity;
        private String ethnicityName;
        private String nationality;
        private String nationalityName;
        private String idCardNo;
        private String phoneNumber;
        private String email;
        private String origin;
        private String address;
        private String isMarried;
        private String introduction;
        private String officePhone;
        private int userType;
        private String birthday;
        private String politicalstatus;
        private String politicalstatusName;
        private String sequence;
        private String isDelete;
        private String creatorId;
        private String creatorName;
        private String createTime;
        private String updateTime;
        private String careNum;
        private String userPoints;
        private String isMarriedStr;
        private String orgId;
        private String orgName;
        private String orgCode;
        private String positionName;
        private String positionId;
        private String positionCode;
        private String employeeNo;
        private String employeeId;
        private String employeeTypeStr;
        private String employeeType;
        private String account;
        private String password;
        private String isCareEach;
        private boolean select;

        protected UserInfoDTOSBean(Parcel in) {
            userId = in.readString();
            schoolId = in.readString();
            username = in.readString();
            realName = in.readString();
            avatar = in.readString();
            sex = in.readInt();
            age = in.readString();
            hobbies = in.readString();
            ethnicity = in.readString();
            ethnicityName = in.readString();
            nationality = in.readString();
            nationalityName = in.readString();
            idCardNo = in.readString();
            phoneNumber = in.readString();
            email = in.readString();
            origin = in.readString();
            address = in.readString();
            isMarried = in.readString();
            introduction = in.readString();
            officePhone = in.readString();
            userType = in.readInt();
            birthday = in.readString();
            politicalstatus = in.readString();
            politicalstatusName = in.readString();
            sequence = in.readString();
            isDelete = in.readString();
            creatorId = in.readString();
            creatorName = in.readString();
            createTime = in.readString();
            updateTime = in.readString();
            careNum = in.readString();
            userPoints = in.readString();
            isMarriedStr = in.readString();
            orgId = in.readString();
            orgName = in.readString();
            orgCode = in.readString();
            positionName = in.readString();
            positionId = in.readString();
            positionCode = in.readString();
            employeeNo = in.readString();
            employeeId = in.readString();
            employeeTypeStr = in.readString();
            employeeType = in.readString();
            account = in.readString();
            password = in.readString();
            isCareEach = in.readString();
            select = in.readByte() != 0;
        }

        public static final Creator<UserInfoDTOSBean> CREATOR = new Creator<UserInfoDTOSBean>() {
            @Override
            public UserInfoDTOSBean createFromParcel(Parcel in) {
                return new UserInfoDTOSBean(in);
            }

            @Override
            public UserInfoDTOSBean[] newArray(int size) {
                return new UserInfoDTOSBean[size];
            }
        };

        public boolean isSelect() {
            return select;
        }

        public void setSelect(boolean select) {
            this.select = select;
        }

        public void setUserId(String userId) {
            this.userId = userId;
        }

        public void setSchoolId(String schoolId) {
            this.schoolId = schoolId;
        }

        public void setUsername(String username) {
            this.username = username;
        }

        public void setRealName(String realName) {
            this.realName = realName;
        }

        public void setAvatar(String avatar) {
            this.avatar = avatar;
        }

        public void setSex(int sex) {
            this.sex = sex;
        }

        public void setAge(String age) {
            this.age = age;
        }

        public void setHobbies(String hobbies) {
            this.hobbies = hobbies;
        }

        public void setEthnicity(String ethnicity) {
            this.ethnicity = ethnicity;
        }

        public void setEthnicityName(String ethnicityName) {
            this.ethnicityName = ethnicityName;
        }

        public void setNationality(String nationality) {
            this.nationality = nationality;
        }

        public void setNationalityName(String nationalityName) {
            this.nationalityName = nationalityName;
        }

        public void setIdCardNo(String idCardNo) {
            this.idCardNo = idCardNo;
        }

        public void setPhoneNumber(String phoneNumber) {
            this.phoneNumber = phoneNumber;
        }

        public void setEmail(String email) {
            this.email = email;
        }

        public void setOrigin(String origin) {
            this.origin = origin;
        }

        public void setAddress(String address) {
            this.address = address;
        }

        public void setIsMarried(String isMarried) {
            this.isMarried = isMarried;
        }

        public void setIntroduction(String introduction) {
            this.introduction = introduction;
        }

        public void setOfficePhone(String officePhone) {
            this.officePhone = officePhone;
        }

        public void setUserType(int userType) {
            this.userType = userType;
        }

        public void setBirthday(String birthday) {
            this.birthday = birthday;
        }

        public void setPoliticalstatus(String politicalstatus) {
            this.politicalstatus = politicalstatus;
        }

        public void setPoliticalstatusName(String politicalstatusName) {
            this.politicalstatusName = politicalstatusName;
        }

        public void setSequence(String sequence) {
            this.sequence = sequence;
        }

        public void setIsDelete(String isDelete) {
            this.isDelete = isDelete;
        }

        public void setCreatorId(String creatorId) {
            this.creatorId = creatorId;
        }

        public void setCreatorName(String creatorName) {
            this.creatorName = creatorName;
        }

        public void setCreateTime(String createTime) {
            this.createTime = createTime;
        }

        public void setUpdateTime(String updateTime) {
            this.updateTime = updateTime;
        }

        public void setCareNum(String careNum) {
            this.careNum = careNum;
        }

        public void setUserPoints(String userPoints) {
            this.userPoints = userPoints;
        }

        public void setIsMarriedStr(String isMarriedStr) {
            this.isMarriedStr = isMarriedStr;
        }

        public void setOrgId(String orgId) {
            this.orgId = orgId;
        }

        public void setOrgName(String orgName) {
            this.orgName = orgName;
        }

        public void setOrgCode(String orgCode) {
            this.orgCode = orgCode;
        }

        public void setPositionName(String positionName) {
            this.positionName = positionName;
        }

        public void setPositionId(String positionId) {
            this.positionId = positionId;
        }

        public void setPositionCode(String positionCode) {
            this.positionCode = positionCode;
        }

        public void setEmployeeNo(String employeeNo) {
            this.employeeNo = employeeNo;
        }

        public void setEmployeeId(String employeeId) {
            this.employeeId = employeeId;
        }

        public void setEmployeeTypeStr(String employeeTypeStr) {
            this.employeeTypeStr = employeeTypeStr;
        }

        public void setEmployeeType(String employeeType) {
            this.employeeType = employeeType;
        }

        public void setAccount(String account) {
            this.account = account;
        }

        public void setPassword(String password) {
            this.password = password;
        }

        public void setIsCareEach(String isCareEach) {
            this.isCareEach = isCareEach;
        }

        public String getUserId() {
            return userId;
        }

        public String getSchoolId() {
            return schoolId;
        }

        public String getUsername() {
            return username;
        }

        public String getRealName() {
            return realName;
        }

        public String getAvatar() {
            return avatar;
        }

        public int getSex() {
            return sex;
        }

        public String getAge() {
            return age;
        }

        public String getHobbies() {
            return hobbies;
        }

        public String getEthnicity() {
            return ethnicity;
        }

        public String getEthnicityName() {
            return ethnicityName;
        }

        public String getNationality() {
            return nationality;
        }

        public String getNationalityName() {
            return nationalityName;
        }

        public String getIdCardNo() {
            return idCardNo;
        }

        public String getPhoneNumber() {
            return phoneNumber;
        }

        public String getEmail() {
            return email;
        }

        public String getOrigin() {
            return origin;
        }

        public String getAddress() {
            return address;
        }

        public String getIsMarried() {
            return isMarried;
        }

        public String getIntroduction() {
            return introduction;
        }

        public String getOfficePhone() {
            return officePhone;
        }

        public int getUserType() {
            return userType;
        }

        public String getBirthday() {
            return birthday;
        }

        public String getPoliticalstatus() {
            return politicalstatus;
        }

        public String getPoliticalstatusName() {
            return politicalstatusName;
        }

        public String getSequence() {
            return sequence;
        }

        public String getIsDelete() {
            return isDelete;
        }

        public String getCreatorId() {
            return creatorId;
        }

        public String getCreatorName() {
            return creatorName;
        }

        public String getCreateTime() {
            return createTime;
        }

        public String getUpdateTime() {
            return updateTime;
        }

        public String getCareNum() {
            return careNum;
        }

        public String getUserPoints() {
            return userPoints;
        }

        public String getIsMarriedStr() {
            return isMarriedStr;
        }

        public String getOrgId() {
            return orgId;
        }

        public String getOrgName() {
            return orgName;
        }

        public String getOrgCode() {
            return orgCode;
        }

        public String getPositionName() {
            return positionName;
        }

        public String getPositionId() {
            return positionId;
        }

        public String getPositionCode() {
            return positionCode;
        }

        public String getEmployeeNo() {
            return employeeNo;
        }

        public String getEmployeeId() {
            return employeeId;
        }

        public String getEmployeeTypeStr() {
            return employeeTypeStr;
        }

        public String getEmployeeType() {
            return employeeType;
        }

        public String getAccount() {
            return account;
        }

        public String getPassword() {
            return password;
        }

        public String getIsCareEach() {
            return isCareEach;
        }

        @Override
        public int describeContents() {
            return 0;
        }

        @Override
        public void writeToParcel(Parcel parcel, int i) {
            parcel.writeString(userId);
            parcel.writeString(schoolId);
            parcel.writeString(username);
            parcel.writeString(realName);
            parcel.writeString(avatar);
            parcel.writeInt(sex);
            parcel.writeString(age);
            parcel.writeString(hobbies);
            parcel.writeString(ethnicity);
            parcel.writeString(ethnicityName);
            parcel.writeString(nationality);
            parcel.writeString(nationalityName);
            parcel.writeString(idCardNo);
            parcel.writeString(phoneNumber);
            parcel.writeString(email);
            parcel.writeString(origin);
            parcel.writeString(address);
            parcel.writeString(isMarried);
            parcel.writeString(introduction);
            parcel.writeString(officePhone);
            parcel.writeInt(userType);
            parcel.writeString(birthday);
            parcel.writeString(politicalstatus);
            parcel.writeString(politicalstatusName);
            parcel.writeString(sequence);
            parcel.writeString(isDelete);
            parcel.writeString(creatorId);
            parcel.writeString(creatorName);
            parcel.writeString(createTime);
            parcel.writeString(updateTime);
            parcel.writeString(careNum);
            parcel.writeString(userPoints);
            parcel.writeString(isMarriedStr);
            parcel.writeString(orgId);
            parcel.writeString(orgName);
            parcel.writeString(orgCode);
            parcel.writeString(positionName);
            parcel.writeString(positionId);
            parcel.writeString(positionCode);
            parcel.writeString(employeeNo);
            parcel.writeString(employeeId);
            parcel.writeString(employeeTypeStr);
            parcel.writeString(employeeType);
            parcel.writeString(account);
            parcel.writeString(password);
            parcel.writeString(isCareEach);
            parcel.writeByte((byte) (select ? 1 : 0));
        }
    }
}
然后我们根据数据进行具体的操作,完成我们需要的效果

item的layout文件,为了实现上述的效果,我们在item中使用两个RecyclerView

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:paddingLeft="5dp"
        >
        <RelativeLayout
            android:id="@+id/rl_group"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?android:selectableItemBackground"
            android:padding="10dp"
            >
            <ImageView
                android:id="@+id/iv_drop"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/icon_dropdown_close"
                android:layout_centerVertical="true"
                />
            <com.iss.reslibrary.view.fontview.FontTextView
                android:id="@+id/tv_group_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="16sp"
                android:textColor="@color/text_black_color"
                android:layout_toEndOf="@id/iv_drop"
                android:text="部门一"
                android:layout_marginLeft="10dp"
                android:layout_centerVertical="true"
                />
            <com.iss.reslibrary.view.fontview.FontTextView
                android:id="@+id/tv_num"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:textSize="16sp"
                android:textColor="@color/text_gray_color"
                android:layout_centerVertical="true"
                />
        </RelativeLayout>
        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv_list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/white"
            android:visibility="gone"
            />
        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv_per"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/white"
            android:visibility="gone"
            />
    </LinearLayout>

</RelativeLayout>
首先解释下item为什么需要两个RecyclerView,第一个RecyclerView是为了重复Activity中RecyclerView的操作,其实就是实现多级树。第二个RecyclerView就是为了实现未分组的人员列表。

1、整体Adapter的实现

public class NewChoiceContactAdapter extends RecyclerView.Adapter<NewChoiceContactAdapter.NewChoiceContactViewHolder> {
    private Context context;
    private List<Contact> list;
    private LayoutInflater inflater;
    private ArrayList<Contact.UserInfoDTOSBean> dtosBeanList;

    public NewChoiceContactAdapter(Context context, List<Contact> list) {
        this.context = context;
        this.list = list;
        this.inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        dtosBeanList = new ArrayList<>();
    }

    @NonNull
    @Override
    public NewChoiceContactViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new NewChoiceContactViewHolder(inflater.inflate(R.layout.new_choice_contact_list_item_layout, null));
    }

    @Override
    public void onBindViewHolder(@NonNull final NewChoiceContactViewHolder holder, int position) {
        Contact contact = list.get(position);
        holder.tvGroupName.setText(contact.getOrgName());
        if(contact.getUserInfoDTOS() != null){
            holder.tvNum.setText(contact.getUserInfoDTOS().size()+"人");
        }else{
            holder.tvNum.setText("0人");
        }

        holder.rlGroup.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(holder.rvList.getVisibility() == View.VISIBLE){
                    holder.ivDrop.setImageResource(R.drawable.icon_dropdown_close);
                    holder.rvList.setVisibility(View.GONE);
                    holder.rvPer.setVisibility(View.GONE);
                }else {
                    holder.ivDrop.setImageResource(R.drawable.icon_dropdown_open);
                    holder.rvList.setVisibility(View.VISIBLE);
                    holder.rvPer.setVisibility(View.VISIBLE);
                }
            }
        });
        //判断是否还存在下一级,设置的Adapter就是现在这个adapter本身,就是重复调用本身。
        if(contact.getChild() != null){
            LogUtil.e("child===="+contact.getChild().size());
            setNewAdapter(holder,contact.getChild());
        }
        //设置未分组人员adapter
        if(contact.getUserInfoDTOS() != null && !contact.getUserInfoDTOS().isEmpty()){
            LogUtil.e("getUserInfoDTOS===="+contact.getUserInfoDTOS().size());
            setPersonAdapter(holder,contact.getUserInfoDTOS());
        }

    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    private void setNewAdapter(NewChoiceContactViewHolder holder, List<Contact> child) {
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(context,LinearLayoutManager.VERTICAL,false);
        holder.rvList.setLayoutManager(layoutManager);
        DividerListDecoration decoration = new DividerListDecoration(context,DividerListDecoration.VERTICAL_LIST,
                SizeUtils.dp2px(context,1f),context.getResources().getColor(R.color.divider_color));
        holder.rvList.addItemDecoration(decoration);
        NewChoiceContactAdapter contactAdapter = new NewChoiceContactAdapter(context,child);
        holder.rvList.setAdapter(contactAdapter);
        contactAdapter.setOnSelectListener(new OnSelectListener() {
            @Override
            public void onSelect(Contact.UserInfoDTOSBean dtosBean, boolean state) {
                if(state){
                    dtosBeanList.add(dtosBean);
                }else{
                    for (int i = 0; i < dtosBeanList.size(); i++) {
                        if(dtosBean.getUserId().equals(dtosBeanList.get(i).getUserId())){
                            dtosBeanList.remove(i);
                            break;
                        }
                    }
                }
                LogUtil.e("个数:"+dtosBeanList.size());
            }
        });
    }

    private void setPersonAdapter(NewChoiceContactViewHolder holder, List<Contact.UserInfoDTOSBean> userInfoDTOS) {
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(context,LinearLayoutManager.VERTICAL,false);
        holder.rvPer.setLayoutManager(layoutManager);
        NewContactAdapter adapter = new NewContactAdapter(context,userInfoDTOS);
        holder.rvPer.setAdapter(adapter);
        adapter.setOnChoiceListener(new NewContactAdapter.OnChoiceListener() {
            @Override
            public void onChoice(Contact.UserInfoDTOSBean dtosBean, boolean state) {
                if(listener != null){
                    listener.onSelect(dtosBean,state);
                }
            }
        });
    }

    public class NewChoiceContactViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.iv_drop)
        ImageView ivDrop;
        @BindView(R.id.tv_group_name)
        FontTextView tvGroupName;
        @BindView(R.id.tv_num)
        FontTextView tvNum;
        @BindView(R.id.rl_group)
        RelativeLayout rlGroup;
        @BindView(R.id.rv_list)
        RecyclerView rvList;
        @BindView(R.id.rv_per)
        RecyclerView rvPer;

        public NewChoiceContactViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }

    public interface OnSelectListener{
        void onSelect(Contact.UserInfoDTOSBean dtosBean,boolean state);
    }
    private OnSelectListener listener = null;
    public void setOnSelectListener(OnSelectListener listener){
        this.listener = listener;
    }


    /**
     * 返回联系人List
     * @return
     */
    public ArrayList<Contact.UserInfoDTOSBean> getContactList(){
        return dtosBeanList;
    }
}

2、人员Adapter实现

public class NewContactAdapter extends RecyclerView.Adapter<NewContactAdapter.NewContactViewHolder> {
    private Context context;
    private List<Contact.UserInfoDTOSBean> list;
    private LayoutInflater inflater;

    public NewContactAdapter(Context context, List<Contact.UserInfoDTOSBean> list) {
        this.context = context;
        this.list = list;
        this.inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @NonNull
    @Override
    public NewContactViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new NewContactViewHolder(inflater.inflate(R.layout.choice_contact_child_item_layout, null));
    }

    @Override
    public void onBindViewHolder(@NonNull final NewContactViewHolder holder, int position) {
        final Contact.UserInfoDTOSBean dtosBean = list.get(position);
        holder.tvName.setText(dtosBean.getRealName());
        holder.tvPos.setText(dtosBean.getPositionName());

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(listener != null){
                    listener.onChoice(dtosBean,!holder.ivCheck.isSelected());
                    holder.ivCheck.setSelected(!holder.ivCheck.isSelected());
                }
            }
        });
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public class NewContactViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.iv_head)
        ImageView ivHead;
        @BindView(R.id.tv_name)
        FontTextView tvName;
        @BindView(R.id.tv_pos)
        FontTextView tvPos;
        @BindView(R.id.iv_check)
        ImageView ivCheck;
        @BindView(R.id.ll_child)
        RelativeLayout llChild;

        public NewContactViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }

    public interface OnChoiceListener{
        void onChoice(Contact.UserInfoDTOSBean dtosBean,boolean state);
    }
    private OnChoiceListener listener = null;
    public void setOnChoiceListener(OnChoiceListener listener){
        this.listener = listener;
    }
}

Activity中调用的就是整体那个Adapter中的setNewAdapter中一样,就不写了。

讲一讲我们如何实现的多选:
1、首先在人员的适配器中写一个回调,上面Adapter有实现方式。
2、然后在整体的Adapter再去写一个回调,将结果回调到Activity中去。
3、最后的人员选择就是将为分组选中的人员和已分组中的人员合并就是我们总得选取的人员。

可能讲的不清楚,见谅,这里就是提供一个思路,就是我们日常的开发学习中可能会遇到不同的要求,我们需要去思考,因为没有万能的方法能够解决我们遇到的问题,要学会如何去变通。^_^

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃骨头不吐股骨头皮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值