Guo_shaoshan
2023-04-24 f21e1ae4b858b6a329b717eaf420d4a1e79d9509
自传和通讯录界面(未完成未修改)
20个文件已修改
13个文件已添加
1692 ■■■■ 已修改文件
app/build.gradle 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/adapter/FamilyContactsRvAdapter.java 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/adapter/GrowthExperienceAbroadConditionRvAdapter.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/adapter/GrowthExperienceHolderConditionRvAdapter.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/adapter/GrowthExperiencePrimaryRvAdapter.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/adapter/GrowthExperienceRelationshipRvAdapter.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/bean/FamilyContactsBean.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/bean/GrowthExperienceAbroadConditionBean.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/bean/GrowthExperienceAutobiographyBean.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/bean/GrowthExperienceBean.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/bean/GrowthExperienceHolderConditionBean.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/bean/GrowthExperienceInformationBean.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/bean/GrowthExperienceRelationshipBean.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/data/DataRepository.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/data/source/HttpDataSource.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/data/source/http/ApiService.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/data/source/http/HttpDataSourceImpl.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/DLBaseActivity.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/ContactsActivity.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/ContactsActivityViewModel.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/GrowthExperienceActivity.java 126 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/GrowthExperienceActivityViewModel.java 330 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/mail_list_pic.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/shape_fffad1e0_stroke.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_contacts.xml 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_growth_experience.xml 59 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_contacts.xml 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_growth_experience_abroad_condition.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_growth_experience_holder_condition.xml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_growth_experience_primary.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_growth_experience_relationship.xml 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values/colors.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app_base/src/main/java/com/android/app_base/base/adapter/BaseRVAdapter.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/build.gradle
@@ -57,6 +57,7 @@
    implementation 'androidx.annotation:annotation:1.3.0'
    implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.1'
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1'
    implementation 'com.google.android.material:material:1.8.0'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
app/src/main/java/com/application/zhangshi_app_android/adapter/FamilyContactsRvAdapter.java
New file
@@ -0,0 +1,130 @@
package com.application.zhangshi_app_android.adapter;
import android.content.Context;
import android.content.Intent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.CompoundButton;
import android.widget.FrameLayout;
import androidx.recyclerview.widget.GridLayoutManager;
import com.android.app_base.base.BaseConfig;
import com.android.app_base.base.adapter.BaseRVAdapter;
import com.android.app_base.manager.AppManager;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.bean.FamilyContactsBean;
import com.application.zhangshi_app_android.databinding.ItemContactsBinding;
import com.application.zhangshi_app_android.ui.function.ContactsActivity;
import com.application.zhangshi_app_android.ui.function.ContactsActivityViewModel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
/**
 * @author Gss
 * @date 2023.04.18. 19:52
 * @desc 通讯录 recyclerView 的 adapter
 */
public class FamilyContactsRvAdapter extends BaseRVAdapter<FamilyContactsBean, ItemContactsBinding, FamilyContactsRvAdapter.ViewHolder> {
    private ContactsActivityViewModel viewModel;
    public FamilyContactsRvAdapter(Context context) {
        super(context);
    }
    public FamilyContactsRvAdapter(Context context, ContactsActivityViewModel viewModel) {
        super(context);
        this.viewModel = viewModel;
    }
    @Override
    protected int getLayoutId() {
        return R.layout.item_contacts;
    }
    @Override
    protected ViewHolder getViewHolder(ItemContactsBinding itemBind) {
        return new ViewHolder(itemBind);
    }
    @Override
    protected void onBind(ViewHolder holder, int position) {
        holder.getBinding().setBean(mDataList.get(position));
        if (position % 2 != 0){
            holder.getBinding().cardView.setCardBackgroundColor(mContext.getColor(R.color.color_card_blue));
        }else {
            holder.getBinding().cardView.setCardBackgroundColor(mContext.getColor(R.color.color_card_pink));
        }
        holder.getBinding().layoutTitle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (holder.isExpended){
                    int initialHeight = holder.getBinding().cardView.getMeasuredHeight();
                    int collapsedHeight = holder.getBinding().layoutTitle.getMeasuredHeight();
                    int distanceToCollapse = (int) (initialHeight - collapsedHeight);
                    Animation a = new Animation() {
                        @Override
                        protected void applyTransformation(float interpolatedTime, Transformation t) {
                            if (interpolatedTime == 1){
                            }
                            holder.getBinding().cardView.getLayoutParams().height = (int) (initialHeight - (distanceToCollapse * interpolatedTime));
                            holder.getBinding().cardView.requestLayout();
                        }
                        @Override
                        public boolean willChangeBounds() {
                            return true;
                        }
                    };
                    a.setDuration(500);
                    holder.getBinding().cardView.startAnimation(a);
                    holder.isExpended = false;
                }else{
                    final int initialHeight = holder.getBinding().cardView.getMeasuredHeight();
                    holder.getBinding().cardView.measure(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT);
                    int targetHeight = holder.getBinding().cardView.getMeasuredHeight();
                    int distanceToExpand = targetHeight - initialHeight;
                    Animation a = new Animation() {
                        @Override
                        protected void applyTransformation(float interpolatedTime, Transformation t) {
                            if (interpolatedTime == 1){
                            }
                            holder.getBinding().cardView.getLayoutParams().height = (int) (initialHeight + (distanceToExpand * interpolatedTime));
                            holder.getBinding().cardView.requestLayout();
                        }
                        @Override
                        public boolean willChangeBounds() {
                            return true;
                        }
                    };
                    a.setDuration(500);
                    holder.getBinding().cardView.startAnimation(a);
                    holder.isExpended = true;
                }
            }
        });
    }
    public void setData(Object familyContactsBeans) {
    }
    public static class ViewHolder extends BaseViewHolder<ItemContactsBinding>{
        private boolean isExpended;
        public ViewHolder(ItemContactsBinding binding) {
            super(binding);
        }
    }
}
app/src/main/java/com/application/zhangshi_app_android/adapter/GrowthExperienceAbroadConditionRvAdapter.java
@@ -1,28 +1,33 @@
package com.application.zhangshi_app_android.adapter;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.databinding.DataBindingUtil;
import com.android.app_base.base.adapter.BaseRVAdapter;
import com.android.app_base.manager.AppManager;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.bean.GrowthExperienceAbroadConditionBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceBean;
import com.application.zhangshi_app_android.databinding.ItemGrowthExperienceAbroadConditionBinding;
import com.application.zhangshi_app_android.ui.function.GrowthExperienceActivity;
import com.application.zhangshi_app_android.ui.function.GrowthExperienceActivityViewModel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * @author Gss
 * @date 2023.04.08. 17:08
 * @desc 成长经历(出国(境)情况) recyclerView 的 adapter
 * @date 2023.04.07. 21:31
 * @desc 成长经历(持有出入境证件情况) recyclerView 的 adapter
 */
public class GrowthExperienceAbroadConditionRvAdapter extends BaseRVAdapter<GrowthExperienceBean, ItemGrowthExperienceAbroadConditionBinding, GrowthExperienceAbroadConditionRvAdapter.ViewHolder> {
public class GrowthExperienceAbroadConditionRvAdapter extends BaseRVAdapter<GrowthExperienceAbroadConditionBean, ItemGrowthExperienceAbroadConditionBinding, GrowthExperienceAbroadConditionRvAdapter.ViewHolder> {
    private GrowthExperienceActivityViewModel viewModel;
@@ -33,6 +38,10 @@
    public GrowthExperienceAbroadConditionRvAdapter(Context context, GrowthExperienceActivityViewModel viewModel) {
        super(context);
        this.viewModel = viewModel;
    }
    public GrowthExperienceAbroadConditionRvAdapter(GrowthExperienceActivity growthExperienceActivity) {
        super(growthExperienceActivity);
    }
    @Override
@@ -49,7 +58,7 @@
    protected void onBind(ViewHolder holder, int position) {
        holder.getBinding().setBean(mDataList.get(position));
        if (position % 2 != 0){
            holder.getBinding().cardView.setCardBackgroundColor(mContext.getColor(R.color.color_card_blue));
            holder.getBinding().cardView.setCardBackgroundColor(mContext.getColor(R.color.color_card_green));
        }else {
            holder.getBinding().cardView.setCardBackgroundColor(mContext.getColor(R.color.color_card_pink));
        }
@@ -103,11 +112,7 @@
                }
            }
        });
        holder.getBinding().layoutContent.setOnClickListener(v -> {
            AppManager.getAppManager().startActivity(
                    new Intent(getRecyclerView().getContext(), GrowthExperienceActivity.class)
                            .putExtra("bean",mDataList.get(position)));
        });
    }
    public static class ViewHolder extends BaseViewHolder<ItemGrowthExperienceAbroadConditionBinding>{
@@ -118,6 +123,7 @@
        }
    }
}
app/src/main/java/com/application/zhangshi_app_android/adapter/GrowthExperienceHolderConditionRvAdapter.java
@@ -2,28 +2,32 @@
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.databinding.DataBindingUtil;
import com.android.app_base.base.adapter.BaseRVAdapter;
import com.android.app_base.manager.AppManager;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.bean.GrowthExperienceBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceHolderConditionBean;
import com.application.zhangshi_app_android.databinding.ItemGrowthExperienceHolderConditionBinding;
import com.application.zhangshi_app_android.ui.function.GrowthExperienceActivity;
import com.application.zhangshi_app_android.ui.function.GrowthExperienceActivityViewModel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * @author Gss
 * @date 2023.04.08. 17:08
 * @date 2023.04.07. 21:31
 * @desc 成长经历(持有出入境证件情况) recyclerView 的 adapter
 */
public class GrowthExperienceHolderConditionRvAdapter extends BaseRVAdapter<GrowthExperienceBean, ItemGrowthExperienceHolderConditionBinding, GrowthExperienceHolderConditionRvAdapter.ViewHolder> {
public class GrowthExperienceHolderConditionRvAdapter extends BaseRVAdapter<GrowthExperienceHolderConditionBean, ItemGrowthExperienceHolderConditionBinding, GrowthExperienceHolderConditionRvAdapter.ViewHolder> {
    private GrowthExperienceActivityViewModel viewModel;
@@ -34,6 +38,10 @@
    public GrowthExperienceHolderConditionRvAdapter(Context context, GrowthExperienceActivityViewModel viewModel) {
        super(context);
        this.viewModel = viewModel;
    }
    public GrowthExperienceHolderConditionRvAdapter(GrowthExperienceActivity growthExperienceActivity) {
        super(growthExperienceActivity);
    }
    @Override
@@ -104,11 +112,7 @@
                }
            }
        });
        holder.getBinding().layoutContent.setOnClickListener(v -> {
            AppManager.getAppManager().startActivity(
                    new Intent(getRecyclerView().getContext(), GrowthExperienceActivity.class)
                            .putExtra("bean",mDataList.get(position)));
        });
    }
    public static class ViewHolder extends BaseViewHolder<ItemGrowthExperienceHolderConditionBinding>{
@@ -119,6 +123,7 @@
        }
    }
}
app/src/main/java/com/application/zhangshi_app_android/adapter/GrowthExperiencePrimaryRvAdapter.java
@@ -31,11 +31,9 @@
public class GrowthExperiencePrimaryRvAdapter extends BaseRVAdapter<GrowthExperienceBean, ItemGrowthExperiencePrimaryBinding, GrowthExperiencePrimaryRvAdapter.ViewHolder> {
    private GrowthExperienceActivityViewModel viewModel;
    private List<GrowthExperienceBean> mDataList;
    public GrowthExperiencePrimaryRvAdapter(Context context,List<GrowthExperienceBean> dataList) {
    public GrowthExperiencePrimaryRvAdapter(Context context) {
        super(context);
        mDataList = dataList;
    }
    public GrowthExperiencePrimaryRvAdapter(Context context, GrowthExperienceActivityViewModel viewModel) {
@@ -47,10 +45,6 @@
        super(growthExperienceActivity);
    }
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        ItemGrowthExperiencePrimaryBinding itemBind = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()),getLayoutId(),parent,false);
        return new ViewHolder(itemBind);
    }
    @Override
    protected int getLayoutId() {
        return R.layout.item_growth_experience_primary;
@@ -63,7 +57,9 @@
    @Override
    protected void onBind(ViewHolder holder, int position) {
        holder.getBinding().setBean(mDataList.get(position));
        if (position % 2 != 0){
            holder.getBinding().cardView.setCardBackgroundColor(mContext.getColor(R.color.color_card_blue));
        }else {
@@ -119,23 +115,18 @@
                }
            }
        });
        holder.getBinding().layoutContent.setOnClickListener(v -> {
            AppManager.getAppManager().startActivity(
                    new Intent(getRecyclerView().getContext(), GrowthExperienceActivity.class)
                            .putExtra("bean",mDataList.get(position)));
        });
    }
    public static class ViewHolder extends BaseViewHolder<ItemGrowthExperiencePrimaryBinding>{
        private boolean isExpended;
        private ItemGrowthExperiencePrimaryBinding binding;
        public ViewHolder(ItemGrowthExperiencePrimaryBinding binding) {
            super(binding);
            binding=ItemGrowthExperiencePrimaryBinding.inflate(LayoutInflater.from(itemBind.getContext()),(ViewGroup) itemBind,false);
        }
    }
}
app/src/main/java/com/application/zhangshi_app_android/adapter/GrowthExperienceRelationshipRvAdapter.java
@@ -2,28 +2,32 @@
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.databinding.DataBindingUtil;
import com.android.app_base.base.adapter.BaseRVAdapter;
import com.android.app_base.manager.AppManager;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.bean.GrowthExperienceBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceRelationshipBean;
import com.application.zhangshi_app_android.databinding.ItemGrowthExperienceRelationshipBinding;
import com.application.zhangshi_app_android.ui.function.GrowthExperienceActivity;
import com.application.zhangshi_app_android.ui.function.GrowthExperienceActivityViewModel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * @author Gss
 * @date 2023.04.08. 17:08
 * @date 2023.04.07. 21:31
 * @desc 成长经历(家庭成员及主要社会关系情况) recyclerView 的 adapter
 */
public class GrowthExperienceRelationshipRvAdapter extends BaseRVAdapter<GrowthExperienceBean, ItemGrowthExperienceRelationshipBinding, GrowthExperienceRelationshipRvAdapter.ViewHolder> {
public class GrowthExperienceRelationshipRvAdapter extends BaseRVAdapter<GrowthExperienceRelationshipBean, ItemGrowthExperienceRelationshipBinding, GrowthExperienceRelationshipRvAdapter.ViewHolder> {
    private GrowthExperienceActivityViewModel viewModel;
@@ -34,6 +38,10 @@
    public GrowthExperienceRelationshipRvAdapter(Context context, GrowthExperienceActivityViewModel viewModel) {
        super(context);
        this.viewModel = viewModel;
    }
    public GrowthExperienceRelationshipRvAdapter(GrowthExperienceActivity growthExperienceActivity) {
        super(growthExperienceActivity);
    }
    @Override
@@ -50,7 +58,7 @@
    protected void onBind(ViewHolder holder, int position) {
        holder.getBinding().setBean(mDataList.get(position));
        if (position % 2 != 0){
            holder.getBinding().cardView.setCardBackgroundColor(mContext.getColor(R.color.color_card_blue));
            holder.getBinding().cardView.setCardBackgroundColor(mContext.getColor(R.color.color_card_green));
        }else {
            holder.getBinding().cardView.setCardBackgroundColor(mContext.getColor(R.color.color_card_pink));
        }
@@ -104,11 +112,7 @@
                }
            }
        });
        holder.getBinding().layoutContent.setOnClickListener(v -> {
            AppManager.getAppManager().startActivity(
                    new Intent(getRecyclerView().getContext(), GrowthExperienceActivity.class)
                            .putExtra("bean",mDataList.get(position)));
        });
    }
    public static class ViewHolder extends BaseViewHolder<ItemGrowthExperienceRelationshipBinding>{
@@ -119,6 +123,7 @@
        }
    }
}
app/src/main/java/com/application/zhangshi_app_android/bean/FamilyContactsBean.java
New file
@@ -0,0 +1,19 @@
package com.application.zhangshi_app_android.bean;
import java.io.Serializable;
import java.util.List;
public class FamilyContactsBean implements Serializable {
    private long id;
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public List<FamilyContactsBean> getData() {
        return null;
    }
}
app/src/main/java/com/application/zhangshi_app_android/bean/GrowthExperienceAbroadConditionBean.java
New file
@@ -0,0 +1,19 @@
package com.application.zhangshi_app_android.bean;
public class GrowthExperienceAbroadConditionBean {
    private String userId;
    private String destination;
    private String cause;
    private String startDate;
    public String getUserId() { return userId; }
    public void setUserId(String value) { this.userId = value; }
    public String getDestination() { return destination; }
    public void setDestination(String value) { this.destination = value; }
    public String getCause() { return cause; }
    public void setCause(String value) { this.cause = value; }
    public String getStartDate() { return startDate; }
    public void setStartDate(String value) { this.startDate = value; }
}
app/src/main/java/com/application/zhangshi_app_android/bean/GrowthExperienceAutobiographyBean.java
New file
@@ -0,0 +1,23 @@
package com.application.zhangshi_app_android.bean;
import java.io.Serializable;
import java.util.List;
public class GrowthExperienceAutobiographyBean implements Serializable{
    //这个时间明显和设计稿上的对应不上
   // 你就得找后台问一问   你看不懂中文吗???
    private String content;
    private int type;
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public int getType() {
        return type;
    }
    public void setType(int type) {
        this.type = type;
    }
}
app/src/main/java/com/application/zhangshi_app_android/bean/GrowthExperienceBean.java
@@ -8,89 +8,53 @@
 * @date 2023.03.31. 17:47
 * @desc 成长经历 bean 类
 */
public class GrowthExperienceBean implements Serializable {
    private String idName;
public class GrowthExperienceBean implements Serializable{
    private String id;
    private String userId;
    private String content;
    private String startDate;
    private String witness;
    private  String usedName;
    private  String gender;
    private String associate;
    private  String nationality;
    private  String ethnicGroup;
    private  String marriageCondition;
    private  String politicalStatus;
    private  String contactNumber;
    private  String idNumber;
    private  String residenceNumber;
    private  String reason;
    private String address;
    private String identity;
    private  String duringTime;
    private  String duringYear;
    private  String relationship;
    private  String School;
    private  String passCheck;
    private  String abroadZone;
    private List<String> url;
    public GrowthExperienceBean(String mDuringYear,String school,String name){
        idName=name;
        School=school;
        duringYear=mDuringYear;
    public String getId() {
        return id;
    }
    public String getAddress() { return address; }
    public void setAddress(String value) { this.address = value; }
    public String getIdName() { return idName; }
    public void setIdName(String value) { this.idName = value; }
    public String getUsedName() { return usedName; }
    public void setUsedName(String value) { this.usedName = value; }
    public String getAssociate() { return associate; }
    public void setAssociate(String value) { this.associate = value; }
    public void setId(String id) {
        this.id = id;
    }
    public String getWitness() { return witness; }
    public void setWitness(String value) { this.witness = value; }
    public String getIdentity() { return identity; }
    public void setIdentity(String value) { this.identity = value; }
    public String getGender() { return gender; }
    public void setGender(String value) { this.gender = value; }
    public String getReason() { return reason; }
    public void setReason(String value) { this.reason = value; }
    public String getNationality() { return nationality; }
    public void setNationality(String value) { this.nationality = value; }
    public String getUserId() {
        return userId;
    }
    public String getEthnicGroup() { return ethnicGroup; }
    public void setEthnicGroup(String value) { this.ethnicGroup = value; }
    public void setUserId(String userId) {
        this.userId = userId;
    }
    public String getMarriageCondition() { return marriageCondition; }
    public void setMarriageCondition(String value) { this.marriageCondition = value; }
    public String getContent() {
        return content;
    }
    public String getPoliticalStatus() { return politicalStatus; }
    public void setPoliticalStatus(String value) { this.politicalStatus = value; }
    public void setContent(String content) {
        this.content = content;
    }
    public String getContactNumber() { return contactNumber; }
    public void setContactNumber(String value) { this.contactNumber = value; }
    public String getStartDate() {
        return startDate;
    }
    public String getIdNumber() { return idNumber; }
    public void setIdNumber(String value) { this.idNumber = value; }
    public String getResidenceNumber() { return idNumber; }
    public void setResidenceNumber(String value) { this.idNumber = value; }
    public String getDuringTime() { return duringTime; }
    public void setDuringTime(String value) { this.duringTime = value; }
    public String getDuringYear() { return duringYear; }
    public void setDuringYear(String value) { this.duringYear = value; }
    public void setStartDate(String startDate) {
        this.startDate = startDate;
    }
    public String getSchool() { return School; }
    public void setSchool(String value) { this.School = value; }
    public String getWitness() {
        return witness;
    }
    public String getRelationship() { return relationship; }
    public void setRelationship(String value) { this.relationship = value; }
    public String getPassCheck() { return passCheck; }
    public void setPassCheck(String value) { this.passCheck = value; }
    public String getAbroadZone() { return abroadZone; }
    public void setAbroadZone(String value) { this.abroadZone = value; }
    public List<String> getUrl() { return url; }
    public void setUrl(List<String> value) { this.url = value; }
    public void setWitness(String witness) {
        this.witness = witness;
    }
}
app/src/main/java/com/application/zhangshi_app_android/bean/GrowthExperienceHolderConditionBean.java
New file
@@ -0,0 +1,22 @@
package com.application.zhangshi_app_android.bean;
public class GrowthExperienceHolderConditionBean {
    private String userId;
    private String cerName;
    private String idNo;
    private String validityDate;
    private String ownStatus;
    public String getUserId() { return userId; }
    public void setUserId(String value) { this.userId = value; }
    public String getCerName() { return cerName; }
    public void setCerName(String value) { this.cerName = value; }
    public String getIdNo() { return idNo; }
    public void setIdNo(String value) { this.idNo = value; }
    public String getValidityDate() { return validityDate; }
    public void setValidityDate(String value) { this.validityDate = value; }
    public String getOwnStatus() { return ownStatus; }
    public void setOwnStatus(String value) { this.ownStatus = value; }
}
app/src/main/java/com/application/zhangshi_app_android/bean/GrowthExperienceInformationBean.java
New file
@@ -0,0 +1,70 @@
package com.application.zhangshi_app_android.bean;
import java.io.Serializable;
import java.util.List;
/**
 * @author Gss
 * @date 2023.03.31. 17:47
 * @desc 成长经历个人基本信息 bean 类
 */
public class GrowthExperienceInformationBean implements Serializable {
    private int userId;
    private String nickName;
    private String oldName;
    private int sex;
    private  String nationality;
    private  String nation;
    private  int maritalStatus;
    private  String politicalOutlook;
    private  String phoneNumber;
    private String idNum;
    private String locationAddress;
    private String alwaysAddress;
    private String alwaysPolice;
    private String unit;
    private String position;
    private int outStatus;
    private String idNo;
    private String img;
    private String birth;
    private String url;
    public int getUserId() { return userId; }
    public void setUserId(int value) { this.userId = value; }
    public String getNickName() { return nickName; }
    public void setNickName(String value) { this.nickName = value; }
    public String getOldName() { return oldName; }
    public void setOldName(String value) { this.oldName = value; }
    public int getSex() { return sex; }
    public void setSex(int value) { this.sex = value; }
    public String getNationality() { return nationality; }
    public void setNationality(String value) { this.nationality = value; }
    public String getNation() { return nation; }
    public void setNation(String value) { this.nation = value; }
    public int getMaritalStatus() { return maritalStatus; }
    public void setMaritalStatus(int value) { this.maritalStatus = value; }
    public String getPoliticalOutlook() { return politicalOutlook; }
    public void setPoliticalOutlook(String value) { this.politicalOutlook = value; }
    public String getPhoneNumber() { return phoneNumber; }
    public void setPhoneNumber(String value) { this.phoneNumber = value; }
    public String getIdNum() { return idNum; }
    public void setIdNum(String value) { this.idNum = value; }
    public String getLocationAddress() { return locationAddress; }
    public void setLocationAddress(String value) { this.locationAddress = value; }
    public String getAlwaysAddress() { return alwaysAddress; }
    public void setAlwaysAddress(String value) { this.alwaysAddress = value; }
    public String getUnit() { return unit; }
    public void setUnit(String value) { this.unit = value; }
    public String getPosition() { return position; }
    public void setPosition(String value) { this.position = value; }
    public int getOutStatus() { return outStatus; }
    public void setOutStatus(int value) { this.outStatus = value; }
    public String getIdNo() { return idNo; }
    public void setIdNo(String value) { this.idNo = value; }
    public String getImg() { return img; }
    public void setImg(String value) { this.img = value; }
    public String getBirth() { return birth; }
    public void setBirth(String value) { this.birth = value; }
    public String getUrl() { return url; }
    public void setUrl(String value) { this.url = value; }
}
app/src/main/java/com/application/zhangshi_app_android/bean/GrowthExperienceRelationshipBean.java
New file
@@ -0,0 +1,23 @@
package com.application.zhangshi_app_android.bean;
public class GrowthExperienceRelationshipBean {
        private String nickName;
        private String relation;
        private String unit;
        private String position;
        private String politicalOutlook;
    public String getNickName() { return nickName; }
    public void setNickName(String value) { this.nickName = value; }
    public String getRelation() { return relation; }
    public void setRelation(String value) { this.relation = value; }
    public String getUnit() { return unit; }
    public void setUnit(String value) { this.unit = value; }
    public String getPosition() { return position; }
    public void setPosition(String value) { this.position = value; }
    public String getPoliticalOutlook() { return politicalOutlook; }
    public void setPoliticalOutlook(String value) { this.politicalOutlook = value; }
    }
app/src/main/java/com/application/zhangshi_app_android/data/DataRepository.java
@@ -6,12 +6,19 @@
import com.android.app_base.http.ResultData;
import com.application.zhangshi_app_android.bean.CaptchaImageBean;
import com.application.zhangshi_app_android.bean.FamilyAssetsResponseBean;
import com.application.zhangshi_app_android.bean.FamilyContactsBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaRequestBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaResponseBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceAbroadConditionBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceAutobiographyBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceHolderConditionBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceInformationBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceRelationshipBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceResponseBean;
import com.application.zhangshi_app_android.bean.HomeDevicesResponseBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceAutobiographyBean;
import com.application.zhangshi_app_android.bean.LoginRequestBean;
import com.application.zhangshi_app_android.bean.LoginResponseBean;
import com.application.zhangshi_app_android.bean.UploadFileResponseBean;
@@ -141,9 +148,54 @@
    /**
     * 获取成长经历
     */
       public Observable<ResultData<GrowthExperienceResponseBean>> getGrowthExperience(Map<String, Object> paramsMap) {
             return mHttpDataSource.getGrowthExperience(paramsMap);
          }
    public Observable<ResultData<List<GrowthExperienceBean>>> getGrowthExperience() {
        return mHttpDataSource.getGrowthExperience();
    }
    /**
     * 获取成长经历个人信息
     */
    public Observable<ResultData<GrowthExperienceInformationBean>> getGrowthExperienceInformation() {
        return mHttpDataSource.getGrowthExperienceInformation();
    }
    /**
     * 获取成长经历关系情况
     */
    public Observable<ResultData<List<GrowthExperienceRelationshipBean>>> getGrowthExperienceRelationship() {
        return mHttpDataSource.getGrowthExperienceRelationship();
    }
    /**
     * 获取成长经历持有出入境证件情况
     */
    public Observable<ResultData<List<GrowthExperienceHolderConditionBean>>> getGrowthExperienceHolderCondition() {
        return mHttpDataSource.getGrowthExperienceHolderCondition();
    }
    /**
     * 获取成长经历出国境情况
     */
    public Observable<ResultData<List<GrowthExperienceAbroadConditionBean>>> getGrowthExperienceAbroadCondition() {
        return mHttpDataSource.getGrowthExperienceAbroadCondition();
    }
    /**
     * 获取自传
     */
    @Override
    public Observable<ResultData<List<GrowthExperienceAutobiographyBean>>> getGrowthExperienceAutobiography() {
        return mHttpDataSource.getGrowthExperienceAutobiography();
    }
    /**
     * 获取通讯录
     */
    public Observable<ResultData<FamilyContactsBean>> getFamilyContacts(Map<String, Object> paramsMap) {
        return mHttpDataSource.getFamilyContacts(paramsMap);
    }
    /**
     * @see LocalDataSourceImpl
app/src/main/java/com/application/zhangshi_app_android/data/source/HttpDataSource.java
@@ -3,9 +3,16 @@
import com.android.app_base.http.ResultData;
import com.application.zhangshi_app_android.bean.CaptchaImageBean;
import com.application.zhangshi_app_android.bean.FamilyAssetsResponseBean;
import com.application.zhangshi_app_android.bean.FamilyContactsBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaRequestBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaResponseBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceAbroadConditionBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceAutobiographyBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceHolderConditionBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceInformationBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceRelationshipBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceResponseBean;
import com.application.zhangshi_app_android.bean.HomeDevicesResponseBean;
import com.application.zhangshi_app_android.bean.LoginRequestBean;
@@ -76,7 +83,33 @@
    /**
     * 获取成长经历
     */
    Observable<ResultData<GrowthExperienceResponseBean>> getGrowthExperience(Map<String, Object> paramsMap);
    Observable<ResultData<List<GrowthExperienceBean>>> getGrowthExperience();
    /**
     * 获取成长经历个人信息
     */
    Observable<ResultData<GrowthExperienceInformationBean>> getGrowthExperienceInformation();
    /**
     * 获取成长经历关系情况
     */
    Observable<ResultData<List<GrowthExperienceRelationshipBean>>> getGrowthExperienceRelationship();
    /**
     * 获取成长经历持有出入境证件情况
     */
    Observable<ResultData<List<GrowthExperienceHolderConditionBean>>> getGrowthExperienceHolderCondition();
    /**
     * 获取成长经历出国境情况
     */
    Observable<ResultData<List<GrowthExperienceAbroadConditionBean>>> getGrowthExperienceAbroadCondition();
    /**
     * 获取自传
     */
    Observable<ResultData<List<GrowthExperienceAutobiographyBean>>> getGrowthExperienceAutobiography();
    /**
     * 获取通讯录
     */
    Observable<ResultData<FamilyContactsBean>> getFamilyContacts(Map<String, Object> paramsMap);
}
app/src/main/java/com/application/zhangshi_app_android/data/source/http/ApiService.java
@@ -6,6 +6,12 @@
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaRequestBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaResponseBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceAbroadConditionBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceAutobiographyBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceHolderConditionBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceInformationBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceRelationshipBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceResponseBean;
import com.application.zhangshi_app_android.bean.HomeDevicesResponseBean;
import com.application.zhangshi_app_android.bean.LoginRequestBean;
@@ -94,8 +100,38 @@
    Observable<ResultData<HomeDevicesResponseBean>> getHomeDevices(@QueryMap Map<String, Object> paramsMap);
    /**
     * 获取成长经历个人信息
     */
    @GET("/self/user")
    Observable<ResultData<GrowthExperienceInformationBean>> getGrowthExperienceInformation();
    /**
     * 获取成长经历(主要学习及工作经历)
     */
    @GET("/growthExperience")
    Observable<ResultData<GrowthExperienceResponseBean>> getGrowthExperience(@QueryMap Map<String, Object> paramsMap);
    @GET("/zExperience/all")
    Observable<ResultData<List<GrowthExperienceBean>>> getGrowthExperience();
    /**
     * 获取成长经历(家庭成员及主要社会关系情况)
     */
    @GET("/self/user/relation")
    Observable<ResultData<List<GrowthExperienceRelationshipBean>>> getGrowthExperienceRelationship();
    /**
     * 获取成长经历(持有出入境证件情况)
     */
    @GET("/zCertificate/all")
    Observable<ResultData<List<GrowthExperienceHolderConditionBean>>> getGrowthExperienceHolderCondition();
    /**
     * 获取成长经历(出国境情况)
     */
    @GET("/zAbroad/all")
    Observable<ResultData<List<GrowthExperienceAbroadConditionBean>>> getGrowthExperienceAbroadCondition();
    /**
     * 获取自传
     */
    @GET("/zAutobiography/all")
    Observable<ResultData<List<GrowthExperienceAutobiographyBean>>> getGrowthExperienceAutobiography();
}
app/src/main/java/com/application/zhangshi_app_android/data/source/http/HttpDataSourceImpl.java
@@ -5,9 +5,13 @@
import com.application.zhangshi_app_android.bean.CaptchaImageBean;
import com.application.zhangshi_app_android.bean.FamilyAssetsResponseBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaRequestBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaResponseBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceResponseBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceAbroadConditionBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceAutobiographyBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceHolderConditionBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceInformationBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceRelationshipBean;
import com.application.zhangshi_app_android.bean.HomeDevicesResponseBean;
import com.application.zhangshi_app_android.bean.LoginRequestBean;
import com.application.zhangshi_app_android.bean.LoginResponseBean;
@@ -15,6 +19,7 @@
import com.application.zhangshi_app_android.bean.UploadFileResponseBean;
import com.application.zhangshi_app_android.data.source.HttpDataSource;
import java.util.List;
import java.util.Map;
import io.reactivex.Observable;
@@ -131,7 +136,45 @@
     * 获取成长经历
     */
    @Override
    public Observable<ResultData<GrowthExperienceResponseBean>> getGrowthExperience(Map<String, Object> paramsMap) {
        return apiService.getGrowthExperience(paramsMap);
    public Observable<ResultData<List<GrowthExperienceBean>>> getGrowthExperience() {
        return apiService.getGrowthExperience();
    }
    /**
     * 获取成长经历个人信息
     */
    @Override
    public Observable<ResultData<GrowthExperienceInformationBean>> getGrowthExperienceInformation() {
        return apiService.getGrowthExperienceInformation();
    }
    /**
     * 获取成长经历关系情况
     */
    @Override
    public Observable<ResultData<List<GrowthExperienceRelationshipBean>>> getGrowthExperienceRelationship() {
        return apiService.getGrowthExperienceRelationship();
    }
    /**
     * 获取成长经历持有出入境证件情况
     */
    @Override
    public Observable<ResultData<List<GrowthExperienceHolderConditionBean>>> getGrowthExperienceHolderCondition() {
        return apiService.getGrowthExperienceHolderCondition();
    }
    /**
     * 获取成长经历出国境情况
     */
    @Override
    public Observable<ResultData<List<GrowthExperienceAbroadConditionBean>>> getGrowthExperienceAbroadCondition() {
        return apiService.getGrowthExperienceAbroadCondition();
    }
    /**
     * 获取自传
     */
    @Override
    public Observable<ResultData<List<GrowthExperienceAutobiographyBean>>> getGrowthExperienceAutobiography() {
        return apiService.getGrowthExperienceAutobiography();
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/DLBaseActivity.java
@@ -91,11 +91,16 @@
            classMap.put(null,(LinearLayout) findViewById(R.id.dl_privacy));
            setSelectItem(classMap.get(getClass()));
            for (Map.Entry<Class, LinearLayout> set : classMap.entrySet()) {
                set.getValue().setOnClickListener(v -> {
                    if (set.getKey() != null){
                        AppManager.getAppManager().startActivity(set.getKey());
                    }
                });
                LinearLayout linearLayout = set.getValue();
                if (linearLayout != null) {
                    linearLayout.setOnClickListener(v -> {
                        if (set.getKey() != null){
                            AppManager.getAppManager().startActivity(set.getKey());
                        }
                    });
                } else {
                }
            }
            mDrawerLayout.setScrimColor(getResources().getColor(R.color.color_shadow));
        }
app/src/main/java/com/application/zhangshi_app_android/ui/function/ContactsActivity.java
New file
@@ -0,0 +1,96 @@
package com.application.zhangshi_app_android.ui.function;
import android.graphics.drawable.ColorDrawable;
import android.view.View;
import android.view.ViewGroup;
import android.widget.PopupWindow;
import androidx.databinding.library.baseAdapters.BR;
import androidx.lifecycle.Observer;
import com.android.app_base.base.viewmodel.BaseViewModel;
import com.android.app_base.utils.ScreenSizeUtils;
import com.android.app_base.widget.LinearItemDecoration;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.adapter.FamilyAssetsRvAdapter;
import com.application.zhangshi_app_android.adapter.FamilyContactsRvAdapter;
import com.application.zhangshi_app_android.bean.FamilyContactsBean;
import com.application.zhangshi_app_android.databinding.ActivityContactsBinding;
;
import com.application.zhangshi_app_android.ui.DLBaseActivity;
import java.util.List;
/**
 * @author Gss
 * @date 2023.04.18. 20:33
 * @desc
 */
public class ContactsActivity<FamilyContactsActivityViewModel extends BaseViewModel> extends DLBaseActivity<ActivityContactsBinding,FamilyContactsActivityViewModel> {
    private FamilyContactsRvAdapter adapter;
    private PopupWindow mOperatePopupWindow;
    @Override
    public int getLayoutId() {
        return R.layout.activity_contacts;
    }
    @Override
    public int getVariableId() {
        return BR.viewModel;
    }
    @Override
    public void initParam() {
    }
    @Override
    public void initView() {
        adapter = new FamilyContactsRvAdapter(this);
        LinearItemDecoration itemDecoration = new LinearItemDecoration();
        itemDecoration.setBottomSpace((int) getResources().getDimension(com.android.app_base.R.dimen.dp_12));
        itemDecoration.setHorizontalSpace((int) getResources().getDimension(com.android.app_base.R.dimen.dp_20));
        itemDecoration.setFirstTop((int) getResources().getDimension(com.android.app_base.R.dimen.dp_20));
        binding.recyclerView.addItemDecoration(itemDecoration);
        binding.recyclerView.setAdapter(adapter);
        mOperatePopupWindow = initPopUpWindow(View.inflate(this,R.layout.pop_operate,null));
        mOperatePopupWindow.getContentView().findViewById(R.id.layout_add).setVisibility(View.GONE);
        mOperatePopupWindow.getContentView().findViewById(R.id.layout_select).setVisibility(View.GONE);
        binding.ivOperate.setOnClickListener(v -> {
            mOperatePopupWindow.showAsDropDown(binding.ivOperate,-ScreenSizeUtils.dip2px(this,85) +binding.ivOperate.getWidth(),0);
        });
    }
    @Override
    public void initData() {
        viewModel.getFamilyContacts();
    }
    @Override
    public void initLiveDataObserve() {
        viewModel.getDataListLiveData().observe(this, familyContactsBeans -> {
            adapter.setData(familyContactsBeans);
        });
    }
    private PopupWindow initPopUpWindow(View view){
        PopupWindow popupWindow = new PopupWindow(this);
        // 设置布局文件
        popupWindow.setContentView(view);
        // 为了避免部分机型不显示,需要重新设置一下宽高
        popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
        popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
        // 设置pop透明效果
        popupWindow.setBackgroundDrawable(new ColorDrawable(0x0000));
        // 设置pop出入动画
        popupWindow.setAnimationStyle(com.android.app_base.R.style.pop_add);
        // 设置pop获取焦点,如果为false点击返回按钮会退出当前Activity,如果pop中有Editor的话,focusable必须要为true
        popupWindow.setFocusable(true);
        // 设置pop可点击,为false点击事件无效,默认为true
        popupWindow.setTouchable(true);
        // 设置点击pop外侧消失,默认为false;在focusable为true时点击外侧始终消失
        popupWindow.setOutsideTouchable(false);
        return popupWindow;
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/function/ContactsActivityViewModel.java
New file
@@ -0,0 +1,97 @@
package com.application.zhangshi_app_android.ui.function;
import static com.android.app_base.base.BaseConfig.CODE_SUCCESS;
import android.app.Application;
import androidx.annotation.NonNull;
import androidx.lifecycle.MutableLiveData;
import com.android.app_base.base.BaseConfig;
import com.android.app_base.base.StateViewEnum;
import com.android.app_base.base.viewmodel.BaseViewModel;
import com.android.app_base.http.ResultData;
import com.android.app_base.utils.RxUtils;
import com.application.zhangshi_app_android.bean.FamilyContactsBean;
import com.application.zhangshi_app_android.data.DataRepository;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
/**
 * @author Gss
 * @date 2023.04.18. 19:54
 * @desc 通讯录 ViewModel
 */
public class ContactsActivityViewModel extends BaseViewModel<DataRepository> {
    private MutableLiveData<List<FamilyContactsBean>> dataListLiveData;//所有数据
    public ContactsActivityViewModel(@NonNull Application application) {
        super(application);
    }
    @Override
    protected DataRepository initModel() {
        return DataRepository.getInstance();
    }
    public void getFamilyContacts(){
        model.getFamilyContacts(new HashMap<>())
                .compose(RxUtils.schedulersTransformer())
                .subscribe(new Observer<ResultData<FamilyContactsBean>>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        addSubscribe(d);
                    }
                    @Override
                    public void onNext(ResultData<FamilyContactsBean> data) {
                        if (data.getCode() == CODE_SUCCESS){
                            if (data.getData().getData().isEmpty()){
                                changeStateView(StateViewEnum.DATA_NULL);
                            }else {
                                changeStateView(StateViewEnum.HIDE);
                                dataListLiveData.postValue(data.getData().getData());
                            }
                        }else {
                            messageLiveData.postValue(data.getMsg());
                        }
                    }
                    @Override
                    public void onError(Throwable e) {
                        messageLiveData.postValue(e.getMessage());
                    }
                    @Override
                    public void onComplete() {
                    }
                });
    }
    public MutableLiveData<List<FamilyContactsBean>> getDataListLiveData() {
        if (dataListLiveData == null){
            dataListLiveData = new MutableLiveData<>();
        }
        return dataListLiveData;
    }
    public void setDataListLiveData(MutableLiveData<List<FamilyContactsBean>> dataListLiveData) {
        this.dataListLiveData = dataListLiveData;
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/function/GrowthExperienceActivity.java
@@ -5,19 +5,25 @@
import android.view.ViewGroup;
import android.widget.PopupWindow;
import androidx.databinding.DataBindingUtil;
import com.android.app_base.utils.ScreenSizeUtils;
import androidx.lifecycle.Observer;
import androidx.viewpager.widget.ViewPager;
import com.android.app_base.widget.LinearItemDecoration;
import com.application.zhangshi_app_android.BR;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.adapter.FamilyAssetsRvAdapter;
import com.application.zhangshi_app_android.adapter.GrowthExperienceAbroadConditionRvAdapter;
import com.application.zhangshi_app_android.adapter.GrowthExperienceHolderConditionRvAdapter;
import com.application.zhangshi_app_android.adapter.GrowthExperiencePrimaryRvAdapter;
import com.application.zhangshi_app_android.adapter.GrowthExperienceRelationshipRvAdapter;
import com.application.zhangshi_app_android.bean.GrowthExperienceAbroadConditionBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceAutobiographyBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceHolderConditionBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceRelationshipBean;
import com.application.zhangshi_app_android.databinding.ActivityGrowthExperienceBinding;
import com.application.zhangshi_app_android.ui.DLBaseActivity;
import java.util.ArrayList;
import com.google.android.material.tabs.TabLayout;
import java.util.List;
/**
@@ -26,8 +32,10 @@
 * @desc 成长经历 GrowthExperienceActivity
 */
public class GrowthExperienceActivity extends DLBaseActivity<ActivityGrowthExperienceBinding,GrowthExperienceActivityViewModel> {
    private GrowthExperiencePrimaryRvAdapter adapter;
    private GrowthExperiencePrimaryRvAdapter primaryRvAdapter;
    private GrowthExperienceRelationshipRvAdapter relationshipRvAdapter;
    private GrowthExperienceHolderConditionRvAdapter holderConditionRvAdapter;
    private GrowthExperienceAbroadConditionRvAdapter abroadConditionRvAdapter;
    @Override
    public int getLayoutId() {
@@ -41,49 +49,113 @@
    @Override
    public void initParam() {
        GrowthExperienceBean bean = new GrowthExperienceBean("name", "date", "content");
        List<GrowthExperienceBean> dataList=new ArrayList<>();
        dataList.add(new GrowthExperienceBean("2010-2016","**小学","张三"));
        dataList.add(new GrowthExperienceBean("2017-2020","**中学","李四"));
        adapter=new GrowthExperiencePrimaryRvAdapter(this,dataList);
    }
    // 设置选中效果
    @Override
    public void initView() {
        adapter = new GrowthExperiencePrimaryRvAdapter(this);
        primaryRvAdapter = new GrowthExperiencePrimaryRvAdapter(this);
        relationshipRvAdapter = new GrowthExperienceRelationshipRvAdapter(this);
        holderConditionRvAdapter = new GrowthExperienceHolderConditionRvAdapter(this );
        abroadConditionRvAdapter = new GrowthExperienceAbroadConditionRvAdapter(this);
        LinearItemDecoration itemDecoration = new LinearItemDecoration();
        itemDecoration.setBottomSpace((int) getResources().getDimension(com.android.app_base.R.dimen.dp_12));
        itemDecoration.setHorizontalSpace((int) getResources().getDimension(com.android.app_base.R.dimen.dp_20));
        itemDecoration.setFirstTop((int) getResources().getDimension(com.android.app_base.R.dimen.dp_20));
        itemDecoration.setFirstTop((int) getResources().getDimension(com.android.app_base.R.dimen.dp_16));
        binding.rvPrimary.addItemDecoration(itemDecoration);
        binding.rvPrimary.setAdapter(adapter);
        binding.rvPrimary.setAdapter(primaryRvAdapter);
        binding.rvRelationship.addItemDecoration(itemDecoration);
        binding.rvRelationship.setAdapter(adapter);
        binding.rvRelationship.setAdapter(relationshipRvAdapter);
        binding.rvCertificates.addItemDecoration(itemDecoration);
        binding.rvCertificates.setAdapter(adapter);
        binding.rvCertificates.setAdapter(holderConditionRvAdapter);
        binding.rvAbroad.addItemDecoration(itemDecoration);
        binding.rvAbroad.setAdapter(adapter);
        binding.rvAbroad.setAdapter(abroadConditionRvAdapter);
        //这里的tab数量就是后台返回的数据量,tab的标题也是后台返回的,但是{"id":1,"userId":110,"type":1,"content":"婴儿时期我很快乐"}后台的返回数据没有这个时间段,你就得问一下,看不懂吗??
        binding.tabLayout.addTab(binding.tabLayout.newTab().setText("0-3岁(婴儿期)"));
        binding.tabLayout.addTab(binding.tabLayout.newTab().setText("3-6岁(幼儿期)"));
        binding.tabLayout.addTab(binding.tabLayout.newTab().setText("6-9岁(青年期) "));
        //就不知道脑子在想什么
        binding.tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                // 当用户选中一个 Tab 时回调
                // 这里可以根据 Tab 的位置来切换相应的页面
                switch (tab.getPosition()) {
                    case 0:
                        // 切换到 0-3 岁页面
                        break;
                    case 1:
                        // 切换到 3-6 岁页面
                        break;
                    case 2:
                        // 切换到 6-9 岁页面
                        break;
                    default:
                        break;
                }
            }
            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                // 当用户取消选中一个 Tab 时回调
            }
            @Override
            public void onTabReselected(TabLayout.Tab tab) {
                // 当用户再次选中一个已经选中的 Tab 时回调
            }
        });
        // 创建 ViewPager 并设置 Adapter
        ViewPager viewPager = binding.viewPager;
        // 将 TabLayout 与 ViewPager 关联起来
        binding.tabLayout.setupWithViewPager(viewPager);
    }
    @Override
    public void initData() {
        viewModel.getGrowthExperience();
     viewModel.getInfo();
      viewModel.getGrowthExperience();
       viewModel.getRelation();
       viewModel.getHolder();
       viewModel.getAbroad();
        viewModel.getGrowthExperienceAutobiography();
    }
    @Override
    public void initLiveDataObserve() {
        ActivityGrowthExperienceBinding binding1= DataBindingUtil.setContentView(this,R.layout.activity_growth_experience);
        ActivityGrowthExperienceBinding binding2= DataBindingUtil.setContentView(this,R.layout.activity_growth_experience);
        ActivityGrowthExperienceBinding binding3= DataBindingUtil.setContentView(this,R.layout.activity_growth_experience);
        ActivityGrowthExperienceBinding binding4= DataBindingUtil.setContentView(this,R.layout.activity_growth_experience);
        viewModel.getDataListLiveData().observe(this, GrowthExperienceBeans -> {
            adapter.setData(GrowthExperienceBeans);
        viewModel.getPrimaryLiveData().observe(this, new Observer<List<GrowthExperienceBean>>() {
            @Override
            public void onChanged(List<GrowthExperienceBean> growthExperienceBeans) {
                primaryRvAdapter.setData(growthExperienceBeans);
            }
        });
        viewModel.getRelationLiveData().observe(this, new Observer<List<GrowthExperienceRelationshipBean>>() {
            @Override
            public void onChanged(List<GrowthExperienceRelationshipBean> growthExperienceRelationshipBeans) {
                relationshipRvAdapter.setData(growthExperienceRelationshipBeans);
            }
        });
        viewModel.getHolderLiveData().observe(this, new Observer<List<GrowthExperienceHolderConditionBean>>() {
            @Override
            public void onChanged(List<GrowthExperienceHolderConditionBean> growthExperienceHolderConditionBeans) {
                holderConditionRvAdapter.setData(growthExperienceHolderConditionBeans);
            }
        });
        viewModel.getAbroadLiveData().observe(this, new Observer<List<GrowthExperienceAbroadConditionBean>>() {
            @Override
            public void onChanged(List<GrowthExperienceAbroadConditionBean> growthExperienceAbroadConditionBeans) {
                abroadConditionRvAdapter.setData(growthExperienceAbroadConditionBeans);
            }
        });
    }
    private PopupWindow initPopUpWindow(View view){
app/src/main/java/com/application/zhangshi_app_android/ui/function/GrowthExperienceActivityViewModel.java
@@ -3,30 +3,19 @@
import android.app.Application;
import androidx.annotation.NonNull;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModelProvider;
import com.android.app_base.base.StateViewEnum;
import com.android.app_base.http.ResultData;
import com.android.app_base.manager.AppManager;
import com.android.app_base.utils.RxUtils;
import com.android.app_base.utils.ToastUtils;
import com.android.app_base.base.viewmodel.BaseViewModel;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.bean.FamilyAssetsBean;
import com.application.zhangshi_app_android.bean.FamilyAssetsResponseBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceAbroadConditionBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceAutobiographyBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceResponseBean;
import com.application.zhangshi_app_android.bean.HomeDevicesBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceHolderConditionBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceInformationBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceRelationshipBean;
import com.application.zhangshi_app_android.data.DataRepository;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@@ -38,8 +27,12 @@
 * @desc 成长经历 viewModel
 */
public class GrowthExperienceActivityViewModel extends BaseViewModel<DataRepository>  {
    private MutableLiveData<List<GrowthExperienceBean>> dataListLiveData;//数据
    private MutableLiveData<List<GrowthExperienceBean>> primaryLiveData;//数据
    private MutableLiveData<GrowthExperienceInformationBean> infoLiveData;
    private MutableLiveData<List<GrowthExperienceAutobiographyBean>> autobiographyLiveData;
    private MutableLiveData<List<GrowthExperienceRelationshipBean>>  relationLiveData;
    private MutableLiveData<List<GrowthExperienceHolderConditionBean>>  holderLiveData;
    private MutableLiveData<List<GrowthExperienceAbroadConditionBean>>  abroadLiveData;
    public GrowthExperienceActivityViewModel(@NonNull Application application) {
        super(application);
    }
@@ -47,24 +40,164 @@
    protected DataRepository initModel() {
        return DataRepository.getInstance();
    }
     public void getGrowthExperience(){
    model.getGrowthExperience(new HashMap<>())
           .compose(RxUtils.schedulersTransformer())
     .subscribe(new Observer<ResultData<GrowthExperienceResponseBean>>() {
                @Override
    /**
     * 获取成长经历
     */
    public void getGrowthExperience(){
         model.getGrowthExperience()
                 .compose(RxUtils.schedulersTransformer())
                 .subscribe(new Observer<ResultData<List<GrowthExperienceBean>>>() {
                     @Override
                     public void onSubscribe(Disposable d) {
                         addSubscribe(d);
                     }
                     @Override
                     public void onNext(ResultData<List<GrowthExperienceBean>> data) {
                         if (data.getCode() == CODE_SUCCESS){
                             primaryLiveData.postValue(data.getData());
                         }else {
                             messageLiveData.postValue(data.getMsg());
                         }
                     }
                     @Override
                     public void onError(Throwable e) {
                         messageLiveData.postValue(e.getMessage());
                     }
                     @Override
                     public void onComplete() {
                     }
                 });
    }
    /**
     * 获取个人信息
     */
    public void getInfo(){
        model.getGrowthExperienceInformation()
                .compose(RxUtils.schedulersTransformer())
                .subscribe(new Observer<ResultData<GrowthExperienceInformationBean>>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        addSubscribe(d);
                    }
                    @Override
                    public void onNext(ResultData<GrowthExperienceResponseBean> data) {
                    public void onNext(ResultData<GrowthExperienceInformationBean> data) {
                        if (data.getCode() == CODE_SUCCESS){
                            if (data.getData().getData().isEmpty()){
                                changeStateView(StateViewEnum.DATA_NULL);
                            }else {
                                changeStateView(StateViewEnum.HIDE);
                                dataListLiveData.postValue(data.getData().getData());
                            infoLiveData.postValue(data.getData());
                        }else {
                            messageLiveData.postValue(data.getMsg());
                        }
                    }
                    @Override
                    public void onError(Throwable e) {
                        messageLiveData.postValue(e.getMessage());
                    }
                    @Override
                    public void onComplete() {
                    }
                });
    }
    /**
     * 获取自传
     */
    public void getGrowthExperienceAutobiography(){
        model.getGrowthExperienceAutobiography()
                .compose(RxUtils.schedulersTransformer())
                .subscribe(new Observer<ResultData<List<GrowthExperienceAutobiographyBean>>>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        addSubscribe(d);
                    }
                    @Override
                    public void onNext(ResultData<List<GrowthExperienceAutobiographyBean>> data) {
                        if (data.getCode() == CODE_SUCCESS) {
                            if (autobiographyLiveData != null) {
                                //这一看就是已经获取到数据了,没法显示就是你写的代码问题,自己找问题啊
                                //就给livedata设置数据,然后呢,它的数据改变后,谁来发生ui变化,观察者呢???谁是观察者
                                autobiographyLiveData.postValue(data.getData());
                            }
                        } else {
                            if (messageLiveData != null) {
                                messageLiveData.postValue(data.getMsg());
                            }
                        }
                    }
                    @Override
                    public void onError(Throwable e) {
                        messageLiveData.postValue(e.getMessage());
                    }
                    @Override
                    public void onComplete() {
                    }
                });
    }
    /**
     * 获取关系情况
     */
    public void getRelation(){
        model.getGrowthExperienceRelationship()
                .compose(RxUtils.schedulersTransformer())
                .subscribe(new Observer<ResultData<List<GrowthExperienceRelationshipBean>>>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        addSubscribe(d);
                    }
                    @Override
                    public void onNext(ResultData<List<GrowthExperienceRelationshipBean>> data) {
                        if (data.getCode() == CODE_SUCCESS){
                            relationLiveData.postValue(data.getData());
                        }else {
                            messageLiveData.postValue(data.getMsg());
                        }
                    }
                    @Override
                    public void onError(Throwable e) {
                        messageLiveData.postValue(e.getMessage());
                    }
                    @Override
                    public void onComplete() {
                    }
                });
    }
    /**
     * 获取持有出入境证件情况
     */
    public void getHolder(){
        model.getGrowthExperienceHolderCondition()
                .compose(RxUtils.schedulersTransformer())
                .subscribe(new Observer<ResultData<List<GrowthExperienceHolderConditionBean>>>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        addSubscribe(d);
                    }
                    @Override
                    public void onNext(ResultData<List<GrowthExperienceHolderConditionBean>> data) {
                        if (data.getCode() == CODE_SUCCESS){
                            holderLiveData.postValue(data.getData());
                        }else {
                            messageLiveData.postValue(data.getMsg());
                        }
@@ -84,45 +217,106 @@
    }
    public MutableLiveData<List<GrowthExperienceBean>> getDataListLiveData() {
        if (dataListLiveData == null){
            dataListLiveData = new MutableLiveData<>();
        }
        return dataListLiveData;
    }
    public void setDataListLiveData(MutableLiveData<List<GrowthExperienceBean>> dataListLiveData) {
        this.dataListLiveData = dataListLiveData;
    }
    public void sortDataList(int type){
        List<GrowthExperienceBean> list = dataListLiveData.getValue();
        if (list == null || list.isEmpty()){
            return;
        }
        list.sort(new Comparator<GrowthExperienceBean>() {
            @Override
            public int compare(GrowthExperienceBean o1, GrowthExperienceBean o2) {
                SimpleDateFormat format = new SimpleDateFormat("yyyy-yyyy", java.util.Locale.getDefault());
                Date date1 = null;
                Date date2 = null;
                try {
                    date1 = format.parse(o1.getDuringYear());
                    date2 = format.parse(o2.getDuringYear());
                } catch (ParseException e) {
                    throw new RuntimeException(e);
                }
                if (date1 != null && date2 != null) {
                    if (type == 0){
                        return date2.compareTo(date1);
                    }else {
                        return date1.compareTo(date2);
    /**
     * 获取出国境情况
     */
    public void getAbroad(){
        model.getGrowthExperienceAbroadCondition()
                .compose(RxUtils.schedulersTransformer())
                .subscribe(new Observer<ResultData<List<GrowthExperienceAbroadConditionBean>>>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        addSubscribe(d);
                    }
                }
                return 0;
            }
        });
        dataListLiveData.postValue(list);
                    @Override
                    public void onNext(ResultData<List<GrowthExperienceAbroadConditionBean>> data) {
                        if (data.getCode() == CODE_SUCCESS){
                            abroadLiveData.postValue(data.getData());
                        }else {
                            messageLiveData.postValue(data.getMsg());
                        }
                    }
                    @Override
                    public void onError(Throwable e) {
                        messageLiveData.postValue(e.getMessage());
                    }
                    @Override
                    public void onComplete() {
                    }
                });
    }
    public MutableLiveData<List<GrowthExperienceBean>> getPrimaryLiveData() {
        if (primaryLiveData == null){
            primaryLiveData = new MutableLiveData<>();
        }
        return primaryLiveData;
    }
    public void setPrimaryLiveData(MutableLiveData<List<GrowthExperienceBean>> primaryLiveData) {
        this.primaryLiveData = primaryLiveData;
    }
    public MutableLiveData<List<GrowthExperienceRelationshipBean>> getRelationLiveData() {
        if (relationLiveData == null){
            relationLiveData = new MutableLiveData<>();
        }
        return relationLiveData;
    }
    public void setRelationLiveData(MutableLiveData<List<GrowthExperienceRelationshipBean>> relationLiveData) {
        this.relationLiveData = relationLiveData;
    }
    public MutableLiveData<GrowthExperienceInformationBean> getInfoLiveData() {
        if (infoLiveData == null){
            infoLiveData = new MutableLiveData<>();
        }
        return infoLiveData;
    }
    public void setInfoLiveData(MutableLiveData<GrowthExperienceInformationBean> infoLiveData) {
        this.infoLiveData = infoLiveData;
    }
    public void setHolderLiveData(MutableLiveData<List<GrowthExperienceHolderConditionBean>> holderLiveData) {
        this.holderLiveData = holderLiveData;
    }
    public MutableLiveData<List<GrowthExperienceHolderConditionBean>> getHolderLiveData() {
        if (holderLiveData == null){
            holderLiveData = new MutableLiveData<>();
        }
        return holderLiveData;
    }
    public void setAbroadLiveData(MutableLiveData<List<GrowthExperienceAbroadConditionBean>> abroadLiveData) {
        this.abroadLiveData = abroadLiveData;
    }
    public MutableLiveData<List<GrowthExperienceAbroadConditionBean>> getAbroadLiveData() {
        if (abroadLiveData == null){
            abroadLiveData = new MutableLiveData<>();
        }
        return abroadLiveData;
    }
    public MutableLiveData<List<GrowthExperienceAutobiographyBean>> getAutobiographyLiveData() {
        if (autobiographyLiveData == null){
            autobiographyLiveData = new MutableLiveData<>();
        }
        return autobiographyLiveData;
    }
    public void setAutobiographyLiveData(MutableLiveData<List<GrowthExperienceAutobiographyBean>> autobiographyLiveData) {
        this.autobiographyLiveData = autobiographyLiveData;
    }
}
app/src/main/res/drawable/mail_list_pic.png
app/src/main/res/drawable/shape_fffad1e0_stroke.xml
New file
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:topLeftRadius="4dp" android:topRightRadius="4dp" android:bottomLeftRadius="4dp" android:bottomRightRadius="4dp" />
    <stroke android:width="1dp" android:color="#fffad1e0" />
</shape>
app/src/main/res/layout/activity_contacts.xml
New file
@@ -0,0 +1,119 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable
            name="viewModel"
            type="com.application.zhangshi_app_android.ui.function.ContactsActivityViewModel" />
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <com.android.app_base.widget.ExtendTitleBar
            android:id="@+id/titleBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintTop_toTopOf="parent"
            >
            <FrameLayout
                android:layout_width="24dp"
                android:layout_height="24dp"
                android:layout_marginHorizontal="16dp"
                android:layout_gravity="center_vertical|end"
                >
                <ImageView
                    android:id="@+id/iv_operate"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:background="@drawable/ic_operate"
                    />
            </FrameLayout>
            <LinearLayout
                android:id="@+id/layout_default"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginHorizontal="56dp"
                android:gravity="center_vertical"
                >
                <TextView
                    android:id="@+id/tv_title"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="16dp"
                    android:text="通讯录(仅供查看)"
                    android:layout_weight="1"
                    android:textColor="@color/white"
                    android:textSize="@dimen/sp_20"
                    />
                <ImageView
                    android:id="@+id/iv_search_default"
                    android:layout_width="@dimen/dp_24"
                    android:layout_height="@dimen/dp_24"
                    android:background="@drawable/ic_search"
                    />
            </LinearLayout>
            <LinearLayout
                android:id="@+id/layout_search"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginVertical="4dp"
                android:layout_marginHorizontal="56dp"
                android:gravity="center_vertical"
                android:background="@color/white"
                android:paddingHorizontal="5dp"
                android:visibility="gone"
                >
                <ImageView
                    android:id="@+id/iv_search"
                    android:layout_width="24dp"
                    android:layout_height="24dp"
                    android:background="@drawable/ic_search_gray"
                    />
                <EditText
                    android:id="@+id/et_search"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:layout_marginStart="5dp"
                    android:textSize="14sp"
                    android:textColor="#61000000"
                    android:background="@null"
                    android:imeOptions="actionSearch"
                    android:text=""
                    android:singleLine="true"
                    android:hint="在“通讯录内搜索”"
                    />
                <ImageView
                    android:id="@+id/iv_search_type"
                    android:layout_width="24dp"
                    android:layout_height="24dp"
                    android:background="@drawable/ic_search_by"
                    />
            </LinearLayout>
        </com.android.app_base.widget.ExtendTitleBar>
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:background="@color/color_normal_background"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/titleBar"
            app:layout_constraintVertical_bias="1.0"
            tools:itemCount="10"
            tools:layout_editor_absoluteX="-81dp"
            tools:listitem="@layout/item_contacts" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
app/src/main/res/layout/activity_growth_experience.xml
@@ -73,6 +73,7 @@
                            android:textColor="#DE000000"
                            android:textColorHint="#6b000000"
                            android:textSize="@dimen/sp_16"
                            android:text="@{viewModel.infoLiveData.nickName}"
                            tools:text="张三" />
                        <View
@@ -81,6 +82,7 @@
                            android:layout_marginTop="5dp"
                            android:background="#6B000000" />
                    </LinearLayout>
                    <LinearLayout
                        android:id="@+id/layout_2"
@@ -107,6 +109,7 @@
                            android:textColor="#DE000000"
                            android:textSize="@dimen/sp_16"
                            tools:text="张四"
                            android:text="@{viewModel.infoLiveData.oldName}"
                            />
                        <View
@@ -152,6 +155,7 @@
                            android:textColorHint="#6b000000"
                            android:textSize="@dimen/sp_16"
                            tools:text="男"
                            android:text="@{String.valueOf(viewModel.infoLiveData.sex)}"
                            />
                        <View
@@ -184,6 +188,7 @@
                            android:textColorHint="#6b000000"
                            android:textSize="@dimen/sp_16"
                            tools:text="汉族"
                            android:text="@{viewModel.infoLiveData.nationality}"
                            />
                        <View
@@ -216,7 +221,9 @@
                            android:textColor="#DE000000"
                            android:textColorHint="#6b000000"
                            android:textSize="@dimen/sp_16"
                            tools:text="中国" />
                            tools:text="中国"
                            android:text="@{viewModel.infoLiveData.nation}"
                            />
                        <View
                            android:layout_width="match_parent"
@@ -247,7 +254,8 @@
                            android:textColor="#DE000000"
                            android:textColorHint="#6b000000"
                            android:textSize="@dimen/sp_16"
                            tools:text="未婚" />
                            tools:text="未婚"
                            android:text="@{String.valueOf(viewModel.infoLiveData.maritalStatus)}"/>
                        <View
                            android:layout_width="match_parent"
@@ -278,7 +286,8 @@
                            android:textColor="#DE000000"
                            android:textColorHint="#6b000000"
                            android:textSize="@dimen/sp_16"
                            tools:text="1234567890" />
                            tools:text="1234567890"
                            android:text="@{viewModel.infoLiveData.phoneNumber}"/>
                        <View
                            android:layout_width="match_parent"
@@ -311,13 +320,15 @@
                            android:textColor="#DE000000"
                            android:textColorHint="#6b000000"
                            android:textSize="@dimen/sp_16"
                            tools:text="群众" />
                            tools:text="群众"
                            android:text="@{viewModel.infoLiveData.politicalOutlook}"/>
                        <View
                            android:layout_width="match_parent"
                            android:layout_height="1dp"
                            android:layout_marginTop="5dp"
                            android:background="#6B000000" />
                            android:background="#6B000000"
                            />
                    </LinearLayout>
                    <LinearLayout
@@ -343,7 +354,8 @@
                            android:textColor="#DE000000"
                            android:textColorHint="#6b000000"
                            android:textSize="@dimen/sp_16"
                            tools:text="440000199801010001" />
                            tools:text="440000199801010001"
                            android:text="@{viewModel.infoLiveData.idNum}"/>
                        <View
                            android:layout_width="match_parent"
@@ -375,13 +387,15 @@
                            android:textColor="#DE000000"
                            android:textColorHint="#6b000000"
                            android:textSize="@dimen/sp_16"
                            tools:text="广东省广州市番禺区小谷围街道" />
                            tools:text="广东省广州市番禺区小谷围街道"
                            android:text="@{viewModel.infoLiveData.locationAddress}" />
                        <View
                            android:layout_width="match_parent"
                            android:layout_height="1dp"
                            android:layout_marginTop="5dp"
                            android:background="#6B000000" />
                    </LinearLayout>
                    <LinearLayout
@@ -432,7 +446,7 @@
                        android:id="@+id/layout_9"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal"
                        android:orientation="vertical"
                        app:layout_constraintTop_toBottomOf="@id/layout_8"
                        android:layout_marginTop="30dp"
                        >
@@ -461,7 +475,7 @@
                        <androidx.recyclerview.widget.RecyclerView
                            android:id="@+id/rv_relationship"
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"
                            android:layout_height="wrap_content"
                            android:background="@color/color_normal_background"
                            android:layout_marginTop="16dp"
                            tools:itemCount="3"
@@ -629,6 +643,33 @@
                        android:textStyle="bold"
                        app:layout_constraintLeft_toLeftOf="parent"
                        app:layout_constraintTop_toBottomOf="@+id/layout_12" />
                    <com.google.android.material.tabs.TabLayout
                        android:id="@+id/tab_layout"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        app:tabPaddingTop="@dimen/dp_22"
                        app:layout_constraintTop_toBottomOf="@+id/tv_autobiography"
                        app:tabMode="scrollable"
                        app:tabGravity="fill" />
                    <androidx.viewpager.widget.ViewPager
                        android:id="@+id/view_pager"
                        android:layout_width="match_parent"
                        android:layout_height="@dimen/dp_0"
                        android:layout_weight="1"
                        app:layout_constraintTop_toBottomOf="@id/tab_layout"/>
                    <TextView
                        android:id="@+id/tv_fill"
                        android:orientation="vertical"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:background="@drawable/shape_fffad1e0_stroke"
                        android:layout_marginBottom="20dp"
                        android:layout_marginTop="@dimen/dp_2"
                        android:paddingStart="10dp"
                        android:paddingEnd="5dp"
                        android:paddingVertical="10dp"
                        app:layout_constraintTop_toBottomOf="@id/view_pager"
                      />
app/src/main/res/layout/item_contacts.xml
New file
@@ -0,0 +1,118 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable
            name="bean"
            type="com.application.zhangshi_app_android.bean.FamilyContactsBean" />
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
        <androidx.cardview.widget.CardView
            android:id="@+id/cardView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/dp_2"
            app:cardCornerRadius="@dimen/dp_10"
            app:cardBackgroundColor="@color/color_card_pink"
            >
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                >
                <RelativeLayout
                    android:id="@+id/layout_title"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/dp_40"
                    android:gravity="center_vertical|center_horizontal"
                    >
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_centerVertical="true"
                        android:layout_gravity="center"
                        android:textSize="@dimen/sp_16"
                        android:textColor="@color/black"
                        android:gravity="center"
                        android:textStyle="bold"
                        tools:text="张三的通讯录"
                        />
                </RelativeLayout>
                <LinearLayout
                    android:id="@+id/layout_content"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    android:paddingHorizontal="@dimen/dp_24"
                    >
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal"
                        android:layout_marginBottom="@dimen/dp_6"
                        >
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="张二"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_14"
                            android:textStyle="bold"
                            />
                    </LinearLayout>
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal"
                        android:layout_marginBottom="@dimen/dp_6"
                        >
                        <TextView
                            android:layout_width="0dp"
                            android:layout_height="wrap_content"
                            android:text="父亲"
                            android:textColor="#80000000"
                            android:textSize="@dimen/sp_12"
                            android:layout_weight="1"
                            />
                        <TextView
                            android:layout_width="0dp"
                            android:layout_height="wrap_content"
                            android:text="张氏公司"
                            android:textColor="#80000000"
                            android:textSize="@dimen/sp_12"
                            android:layout_weight="1"
                            />
                        <TextView
                            android:layout_width="0dp"
                            android:layout_height="wrap_content"
                            android:text="12345678901"
                            android:textColor="#80000000"
                            android:textSize="@dimen/sp_12"
                            android:layout_weight="1"
                            />
                    </LinearLayout>
                </LinearLayout>
            </LinearLayout>
        </androidx.cardview.widget.CardView>
    </LinearLayout>
</layout>
app/src/main/res/layout/item_growth_experience_abroad_condition.xml
@@ -6,7 +6,7 @@
    <data>
        <variable
            name="bean"
            type="com.application.zhangshi_app_android.bean.GrowthExperienceBean" />
            type="com.application.zhangshi_app_android.bean.GrowthExperienceAbroadConditionBean" />
    </data>
    <LinearLayout
@@ -40,7 +40,7 @@
                        android:layout_marginStart="24dp"
                        android:textSize="@dimen/sp_16"
                        android:textColor="@color/black"
                        android:text="@{bean.abroadZone}"
                        android:text="@{bean.destination}"
                        android:layout_weight="1"
                        tools:text="香港"
                        android:textStyle="bold"
@@ -50,7 +50,7 @@
                        android:layout_height="wrap_content"
                        android:textSize="@dimen/sp_16"
                        android:textColor="@color/black"
                        android:text="@{bean.duringTime}"
                        android:text="@{bean.startDate}"
                        android:textStyle="bold"
                        android:layout_marginEnd="24dp"
                        android:layout_alignParentEnd="true"
@@ -83,7 +83,7 @@
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            tools:text="探亲"
                            android:text="@{bean.reason}"
                            android:text="@{bean.cause}"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
app/src/main/res/layout/item_growth_experience_holder_condition.xml
@@ -6,7 +6,7 @@
    <data>
        <variable
            name="bean"
            type="com.application.zhangshi_app_android.bean.GrowthExperienceBean" />
            type="com.application.zhangshi_app_android.bean.GrowthExperienceHolderConditionBean" />
    </data>
    <LinearLayout
@@ -39,7 +39,7 @@
                        android:layout_marginStart="24dp"
                        android:textSize="@dimen/sp_16"
                        android:textColor="@color/black"
                        android:text="@{bean.passCheck}"
                        android:text="@{bean.cerName}"
                        android:layout_weight="1"
                        tools:text="护照"
                        android:textStyle="bold"
@@ -49,7 +49,7 @@
                        android:layout_height="wrap_content"
                        android:textSize="@dimen/sp_16"
                        android:textColor="@color/black"
                        android:text="@{bean.duringTime}"
                        android:text="@{bean.validityDate}"
                        android:textStyle="bold"
                        android:layout_marginEnd="24dp"
                        android:layout_alignParentEnd="true"
@@ -81,10 +81,10 @@
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="持有"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            android:text="@{bean.ownStatus}"
                            />
                    </LinearLayout>
                    <LinearLayout
@@ -105,7 +105,7 @@
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:textColor="@color/black"
                            android:text="@{bean.residenceNumber}"
                            android:text="@{bean.idNo}"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            tools:text="123456789012345"
app/src/main/res/layout/item_growth_experience_primary.xml
@@ -39,7 +39,7 @@
                        android:layout_marginStart="24dp"
                        android:textSize="@dimen/sp_16"
                        android:textColor="@color/black"
                        android:text="@{bean.duringYear}"
                        android:text="@{bean.startDate}"
                        android:layout_weight="1"
                        tools:text="2010-2016"
                        android:textStyle="bold"
@@ -49,7 +49,7 @@
                        android:layout_height="wrap_content"
                        android:textSize="@dimen/sp_16"
                        android:textColor="@color/black"
                        android:text="@{bean.School}"
                        android:text="@{bean.content}"
                        android:textStyle="bold"
                        android:layout_marginEnd="24dp"
                        android:layout_alignParentEnd="true"
app/src/main/res/layout/item_growth_experience_relationship.xml
@@ -6,7 +6,7 @@
    <data>
        <variable
            name="bean"
            type="com.application.zhangshi_app_android.bean.GrowthExperienceBean" />
            type="com.application.zhangshi_app_android.bean.GrowthExperienceRelationshipBean" />
    </data>
    <LinearLayout
@@ -39,7 +39,7 @@
                        android:layout_marginStart="24dp"
                        android:textSize="@dimen/sp_16"
                        android:textColor="@color/black"
                        android:text="@{bean.relationship}"
                        android:text="@{bean.relation}"
                        android:layout_weight="1"
                        tools:text="夫妻"
                        android:textStyle="bold"
@@ -49,7 +49,7 @@
                        android:layout_height="wrap_content"
                        android:textSize="@dimen/sp_16"
                        android:textColor="@color/black"
                        android:text="@{bean.associate}"
                        android:text="@{bean.nickName}"
                        android:textStyle="bold"
                        android:layout_marginEnd="24dp"
                        android:layout_alignParentEnd="true"
@@ -81,7 +81,7 @@
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="@{bean.School}"
                            android:text="@{bean.unit}"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
@@ -104,7 +104,7 @@
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="@{bean.identity}"
                            android:text="@{bean.position}"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
@@ -128,7 +128,7 @@
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:textColor="@color/black"
                            android:text="@{bean.politicalStatus}"
                            android:text="@{bean.politicalOutlook}"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
app/src/main/res/values/colors.xml
@@ -23,6 +23,7 @@
    <color name="color_FF666666_text_default">#FF666666</color>
    <color name="color_card_pink">#FFFFE2EF</color>
    <color name="color_card_blue">#FFE0EEFE</color>
    <color name="color_card_green">#FFEBFFF2</color>
    <color name="color_shadow">#88666666</color>
</resources>
app_base/src/main/java/com/android/app_base/base/adapter/BaseRVAdapter.java
@@ -190,7 +190,7 @@
    /**
     * 设置新的数据
     */
    public void setData(@Nullable List<T> data) {
    public void setData(@Nullable Object data) {
        mDataList = data;
        notifyDataSetChanged();
    }