Linjiajia
2023-05-15 a0dc6be52293a64ebfe38b8c2391dc7d2ffe63ae
提交代码
25个文件已修改
38个文件已添加
4449 ■■■■■ 已修改文件
app/src/main/AndroidManifest.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/adapter/ConsumeRecordRvAdapter.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/adapter/ContactsDetailAdapter.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/adapter/ContactsRvAdapter.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/adapter/DailyConsumeRecordRvAdapter.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/adapter/PersonalNotepadRvAdapter.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/adapter/TourismExperienceRvAdapter.java 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/adapter/TourismRvAdapter.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/bean/ContactsBean.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/bean/ContactsDetailBean.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/bean/ContactsRequestBean.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/bean/ContactsResponseBean.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/bean/PersonalNotepadBean.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/bean/TourismExperienceBean.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/data/DataRepository.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/data/source/HttpDataSource.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/data/source/http/ApiService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/data/source/http/HttpDataSourceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/DLBaseActivity.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/DLBaseFragment.java 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/dialog/ContactsDialog.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/dialog/PetOwnerInfoDialog.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/ContactsActivity.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/ContactsActivityViewModel.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/FunctionFragment.java 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/GrowthExperienceActivity.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/PersonalNotepadActivity.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/PersonalNotepadActivityViewModel.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/PersonalNotepadDetailActivity.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/PersonalNotepadDetailActivityViewModel.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/TourismExperienceActivity.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/TourismExperienceActivityViewModel.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/TourismExperienceDetailActivity.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/TourismExperienceDetailActivityViewModel.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/personal_center/BasicInfoActivity.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/personal_center/BasicInfoActivityViewModel.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/personal_center/PersonalCenterFragment.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable-xhdpi/ic_contacts_import.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable-xhdpi/ic_delete_tourism.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable-xxhdpi/ic_contacts_import.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable-xxhdpi/ic_delete_tourism.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/shape_ffebafb4_dash_line.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/acitivity_tourism_experience_detail.xml 228 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_basic_info.xml 267 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_contacts.xml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_growth_experience.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_personal_notepad.xml 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_personal_notepad_detail.xml 158 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_tourism.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_tourism_experience.xml 143 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/dialog_contacts_info.xml 253 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_personal_center.xml 270 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_consume_record.xml 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_contacts.xml 81 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_contacts_detail.xml 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_daily_consume_record.xml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_personal_notepad.xml 197 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_tourism_experience.xml 270 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/pop_contacts_import.xml 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/pop_operate_person_center.xml 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/pop_personal_notepad.xml 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app_base/build.gradle 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app_base/src/main/java/com/android/app_base/base/view/BaseFragment.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/AndroidManifest.xml
@@ -168,7 +168,30 @@
        <activity
            android:name=".ui.function.PrivacyDetailActivity"
            android:exported="false" />
        <activity
            android:name=".ui.function.TourismActivity"
            android:exported="false" />
        <activity
            android:name=".ui.function.TourismDetailActivity"
            android:exported="false" />
        <activity
            android:name=".ui.function.TourismExperienceActivity"
            android:exported="false" />
        <activity
            android:name=".ui.function.TourismExperienceDetailActivity"
            android:exported="false" />
        <activity
            android:name=".ui.personal_center.BasicInfoActivity"
            android:exported="false" />
        <activity
            android:name=".ui.function.ContactsActivity"
            android:exported="false" />
        <activity
            android:name=".ui.function.PersonalNotepadActivity"
            android:exported="false" />
        <activity
            android:name=".ui.function.PersonalNotepadDetailActivity"
            android:exported="false" />
    </application>
</manifest>
app/src/main/java/com/application/zhangshi_app_android/adapter/ConsumeRecordRvAdapter.java
New file
@@ -0,0 +1,34 @@
package com.application.zhangshi_app_android.adapter;
import android.content.Context;
import com.android.app_base.base.adapter.BaseRVAdapter;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.bean.ConsumeRecordBean;
import com.application.zhangshi_app_android.databinding.ItemConsumeRecordBinding;
/**
 * @author Ljj
 * @date 2023.05.08. 19:49
 * @desc 消费记录适配器
 */
public class ConsumeRecordRvAdapter extends BaseRVAdapter<ConsumeRecordBean, ItemConsumeRecordBinding,BaseRVAdapter.BaseViewHolder<ItemConsumeRecordBinding>> {
    public ConsumeRecordRvAdapter(Context context) {
        super(context);
    }
    @Override
    protected int getLayoutId() {
        return R.layout.item_consume_record;
    }
    @Override
    protected void onBind(BaseViewHolder<ItemConsumeRecordBinding> holder, int position) {
        holder.getBinding().setBean(getItem(position));
    }
    @Override
    protected BaseViewHolder<ItemConsumeRecordBinding> getViewHolder(ItemConsumeRecordBinding itemBind, int viewType) {
        return new BaseViewHolder<>(itemBind);
    }
}
app/src/main/java/com/application/zhangshi_app_android/adapter/ContactsDetailAdapter.java
New file
@@ -0,0 +1,44 @@
package com.application.zhangshi_app_android.adapter;
import android.content.Context;
import android.view.View;
import com.android.app_base.base.adapter.BaseRVAdapter;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.bean.ContactsDetailBean;
import com.application.zhangshi_app_android.databinding.ItemContactsDetailBinding;
import com.application.zhangshi_app_android.ui.dialog.ContactsDialog;
/**
 * @author Ljj
 * @date 2023.05.12. 22:50
 * @desc
 */
public class ContactsDetailAdapter extends BaseRVAdapter<ContactsDetailBean,ItemContactsDetailBinding,BaseRVAdapter.BaseViewHolder<ItemContactsDetailBinding>> {
    public ContactsDetailAdapter(Context context) {
        super(context);
    }
    @Override
    protected int getLayoutId() {
        return R.layout.item_contacts_detail;
    }
    @Override
    protected void onBind(BaseViewHolder<ItemContactsDetailBinding> holder, int position) {
        holder.getBinding().setBean(mDataList.get(position));
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ContactsDialog.Builder builder = new ContactsDialog.Builder(mContext);
                builder.setBean(mDataList.get(position));
                builder.show();
            }
        });
    }
    @Override
    protected BaseViewHolder<ItemContactsDetailBinding> getViewHolder(ItemContactsDetailBinding itemBind, int viewType) {
        return new BaseViewHolder<ItemContactsDetailBinding>(itemBind);
    }
}
app/src/main/java/com/application/zhangshi_app_android/adapter/ContactsRvAdapter.java
@@ -9,8 +9,8 @@
import com.android.app_base.base.adapter.BaseRVAdapter;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.bean.ContactsBean;
import com.application.zhangshi_app_android.bean.ContactsDetailBean;
import com.application.zhangshi_app_android.databinding.ItemContactsBinding;
import com.application.zhangshi_app_android.ui.function.ContactsActivityViewModel;
/**
 * @author Gss
@@ -19,12 +19,10 @@
 */
public class ContactsRvAdapter extends BaseRVAdapter<ContactsBean, ItemContactsBinding, ContactsRvAdapter.ViewHolder> {
    private ContactsActivityViewModel viewModel;
    public ContactsRvAdapter(Context context) {
        super(context);
    }
    @Override
    protected int getLayoutId() {
@@ -39,6 +37,9 @@
    @Override
    protected void onBind(ViewHolder holder, int position) {
        holder.getBinding().setBean(mDataList.get(position));
        ContactsDetailAdapter adapter = new ContactsDetailAdapter(mContext);
        holder.getBinding().recyclerView.setAdapter(adapter);
        adapter.setData(mDataList.get(position).getContactsDetailBeans());
        if (position % 2 != 0){
            holder.getBinding().cardView.setCardBackgroundColor(mContext.getColor(R.color.color_card_blue));
        }else {
@@ -71,7 +72,7 @@
                    holder.isExpended = false;
                }else{
                    final int initialHeight = holder.getBinding().cardView.getMeasuredHeight();
                    holder.getBinding().cardView.measure(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT);
                    holder.getBinding().cardView.measure(View.MeasureSpec.UNSPECIFIED,View.MeasureSpec.UNSPECIFIED);
                    int targetHeight = holder.getBinding().cardView.getMeasuredHeight();
                    int distanceToExpand = targetHeight - initialHeight;
                    Animation a = new Animation() {
app/src/main/java/com/application/zhangshi_app_android/adapter/DailyConsumeRecordRvAdapter.java
@@ -36,7 +36,22 @@
    @Override
    protected void onBind(ViewHolder holder, int position) {
        holder.getBinding().setBean(getItem(position));
        holder.getBinding().setIsFold(holder.isExpended);
        ConsumeRecordRvAdapter adapter = new ConsumeRecordRvAdapter(mContext);
        holder.getBinding().rvConsumeRecord.setAdapter(adapter);
        adapter.setData(getItem(position).getConsumeRecordBeans());
        holder.getBinding().ivFold.setOnClickListener(v -> {
            if (holder.isExpended) {
                holder.isExpended = false;
                holder.getBinding().setIsFold(false);
                collapseView(holder.getBinding().rvConsumeRecord, holder.getBinding().rvConsumeRecord);
            } else {
                holder.isExpended = true;
                holder.getBinding().setIsFold(true);
                expandView(holder.getBinding().rvConsumeRecord);
            }
        });
    }
    @Override
@@ -75,7 +90,7 @@
        a.setDuration(500);
        initialView.startAnimation(a);
    }
    public void expendView(View initialView){
    public void expandView(View initialView){
        int initialHeight = initialView.getMeasuredHeight();
        initialView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
        int targetHeight = initialView.getMeasuredHeight();
app/src/main/java/com/application/zhangshi_app_android/adapter/PersonalNotepadRvAdapter.java
New file
@@ -0,0 +1,132 @@
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.FrameLayout;
import androidx.recyclerview.widget.GridLayoutManager;
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.PersonalNotepadBean;
import com.application.zhangshi_app_android.databinding.ItemPersonalNotepadBinding;
import com.application.zhangshi_app_android.ui.function.PersonalNotepadDetailActivity;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * @author Ljj
 * @date 2023.05.14. 19:44
 * @desc
 */
public class PersonalNotepadRvAdapter  extends BaseRVAdapter<PersonalNotepadBean, ItemPersonalNotepadBinding, PersonalNotepadRvAdapter.ViewHolder> {
    public PersonalNotepadRvAdapter(Context context) {
        super(context);
    }
    @Override
    protected int getLayoutId() {
        return R.layout.item_personal_notepad;
    }
    @Override
    protected ViewHolder getViewHolder(ItemPersonalNotepadBinding itemBind, int viewType) {
        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;
                }
            }
        });
        holder.getBinding().layoutContent.setOnClickListener(v -> {
            AppManager.getAppManager().startActivity(
                    new Intent(getRecyclerView().getContext(), PersonalNotepadDetailActivity.class)
                            .putExtra("bean",mDataList.get(position)));
        });
        ImageRvAdapter adapter = new ImageRvAdapter(mContext);
        holder.getBinding().rvImage.setLayoutManager(new GridLayoutManager(mContext,3));
        holder.getBinding().rvImage.setAdapter(adapter);
        String url = mDataList.get(position).getUrl();
        if (url == null||url.isEmpty()){
            return;
        }
        List<String> list;
        if (url.contains(",")){
            String[] split = url.split(",");
            list = new ArrayList<>(Arrays.asList(split));
        }else {
            list = new ArrayList<>();
            list.add(url);
        }
        adapter.setData(list);
    }
    public static class ViewHolder extends BaseRVAdapter.BaseViewHolder<ItemPersonalNotepadBinding> {
        private boolean isExpended;
        public ViewHolder(ItemPersonalNotepadBinding binding) {
            super(binding);
        }
    }
}
app/src/main/java/com/application/zhangshi_app_android/adapter/TourismExperienceRvAdapter.java
New file
@@ -0,0 +1,134 @@
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.FrameLayout;
import androidx.recyclerview.widget.GridLayoutManager;
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.TourismExperienceBean;
import com.application.zhangshi_app_android.databinding.ItemPropertyBinding;
import com.application.zhangshi_app_android.databinding.ItemTourismExperienceBinding;
import com.application.zhangshi_app_android.ui.function.PropertyDetailActivity;
import com.application.zhangshi_app_android.ui.function.TourismExperienceDetailActivity;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * @author Ljj
 * @date 2023.05.08. 20:34
 * @desc
 */
public class TourismExperienceRvAdapter extends BaseRVAdapter<TourismExperienceBean, ItemTourismExperienceBinding, TourismExperienceRvAdapter.ViewHolder> {
    public TourismExperienceRvAdapter(Context context) {
        super(context);
    }
    @Override
    protected int getLayoutId() {
        return R.layout.item_tourism_experience;
    }
    @Override
    protected ViewHolder getViewHolder(ItemTourismExperienceBinding itemBind, int viewType) {
        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;
                }
            }
        });
        holder.getBinding().layoutContent.setOnClickListener(v -> {
            AppManager.getAppManager().startActivity(
                    new Intent(getRecyclerView().getContext(), TourismExperienceDetailActivity.class)
                            .putExtra("bean", mDataList.get(position)));
        });
        ImageRvAdapter adapter = new ImageRvAdapter(mContext);
        holder.getBinding().rvImage.setLayoutManager(new GridLayoutManager(mContext, 3));
        holder.getBinding().rvImage.setAdapter(adapter);
        String url = mDataList.get(position).getUrl();
        if (url == null || url.isEmpty()) {
            return;
        }
        List<String> list;
        if (url.contains(",")) {
            String[] split = url.split(",");
            list = new ArrayList<>(Arrays.asList(split));
        } else {
            list = new ArrayList<>();
            list.add(url);
        }
        adapter.setData(list);
    }
    public static class ViewHolder extends BaseRVAdapter.BaseViewHolder<ItemTourismExperienceBinding> {
        private boolean isExpended;
        public ViewHolder(ItemTourismExperienceBinding binding) {
            super(binding);
        }
    }
}
app/src/main/java/com/application/zhangshi_app_android/adapter/TourismRvAdapter.java
@@ -7,20 +7,16 @@
import android.view.animation.Transformation;
import android.widget.FrameLayout;
import androidx.recyclerview.widget.GridLayoutManager;
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.TourismBean;
import com.application.zhangshi_app_android.databinding.ItemTourismBinding;
import com.application.zhangshi_app_android.ui.function.TourismActivity;
import com.application.zhangshi_app_android.ui.function.TourismDetailActivity;
import com.application.zhangshi_app_android.ui.function.TourismExperienceDetailActivity;
import com.application.zhangshi_app_android.ui.function.TourismExperienceActivity;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * @author Ljj
@@ -110,7 +106,7 @@
            @Override
            public void onClick(View v) {
                AppManager.getAppManager().startActivity(
                        new Intent(getRecyclerView().getContext(), TourismExperienceDetailActivity.class)
                        new Intent(getRecyclerView().getContext(), TourismExperienceActivity.class)
                                .putExtra("bean",mDataList.get(position)));
            }
        });
app/src/main/java/com/application/zhangshi_app_android/bean/ContactsBean.java
@@ -1,19 +1,31 @@
package com.application.zhangshi_app_android.bean;
import java.io.Serializable;
import java.util.List;
public class ContactsBean implements Serializable {
    private long id;
    public long getId() {
        return id;
/**
 * @author Ljj
 * @date 2023.05.12. 22:43
 * @desc 通讯录 bean
 */
public class ContactsBean {
    //属于谁的通讯录
    private String myName;
    private List<ContactsDetailBean> contactsDetailBeans;
    public String getMyName() {
        return myName;
    }
    public void setId(long id) {
        this.id = id;
    public void setMyName(String myName) {
        this.myName = myName;
    }
    public List<ContactsBean> getData() {
        return null;
    public List<ContactsDetailBean> getContactsDetailBeans() {
        return contactsDetailBeans;
    }
    public void setContactsDetailBeans(List<ContactsDetailBean> contactsDetailBeans) {
        this.contactsDetailBeans = contactsDetailBeans;
    }
}
app/src/main/java/com/application/zhangshi_app_android/bean/ContactsDetailBean.java
New file
@@ -0,0 +1,129 @@
package com.application.zhangshi_app_android.bean;
import java.io.Serializable;
/**
 * 通讯录详情 bean
 */
public class ContactsDetailBean implements Serializable {
    //id
    private int id;
    //成员姓名
    private String myName;
    //称呼
    private String nickName;
    //称呼者姓名
    private String name;
    //工作单位
    private String work;
    //手机号码
    private String phone;
    //微信
    private String wx;
    //QQ
    private String qq;
    //推特
    private String twitter;
    //是否常联系 0 否 1 是
    private int is_always;
    //备注
    private String remark;
    //电子文件
    private String url;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getMyName() {
        return myName;
    }
    public void setMyName(String myName) {
        this.myName = myName;
    }
    public String getNickName() {
        return nickName;
    }
    public void setNickName(String nickName) {
        this.nickName = nickName;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getWork() {
        return work;
    }
    public void setWork(String work) {
        this.work = work;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getWx() {
        return wx;
    }
    public void setWx(String wx) {
        this.wx = wx;
    }
    public String getQq() {
        return qq;
    }
    public void setQq(String qq) {
        this.qq = qq;
    }
    public String getTwitter() {
        return twitter;
    }
    public void setTwitter(String twitter) {
        this.twitter = twitter;
    }
    public int getIs_always() {
        return is_always;
    }
    public void setIs_always(int is_always) {
        this.is_always = is_always;
    }
    public String getRemark() {
        return remark;
    }
    public void setRemark(String remark) {
        this.remark = remark;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
}
app/src/main/java/com/application/zhangshi_app_android/bean/ContactsRequestBean.java
New file
@@ -0,0 +1,78 @@
package com.application.zhangshi_app_android.bean;
import java.util.HashMap;
import java.util.Map;
/**
 * @author Ljj
 * @date 2023.05.13. 0:29
 * @desc
 */
public class ContactsRequestBean {
    //成员姓名
    private String myName;
    //称呼
    private String nickName;
    //称呼者姓名
    private String name;
    //工作单位
    private String work;
    //手机号码
    private String phone;
    //微信
    private String wx;
    //QQ
    private String qq;
    //推特
    private String twitter;
    //是否常联系 0 否 1 是
    private int is_always;
    //备注
    private String remark;
    private int pageNum = 1;
    private int pageSize = 20;
    public Map<String, Object> toMap() {
        Map<String, Object> map = new HashMap<>();
        if (myName == null) {
            myName = "";
        }
        if (nickName == null) {
            nickName = "";
        }
        if (name == null) {
            name = "";
        }
        if (work == null) {
            work = "";
        }
        if (phone == null) {
            phone = "";
        }
        if (wx == null) {
            wx = "";
        }
        if (qq == null) {
            qq = "";
        }
        if (twitter == null) {
            twitter = "";
        }
        if (remark == null) {
            remark = "";
        }
        map.put("myName", myName);
        map.put("nickName", nickName);
        map.put("name", name);
        map.put("work", work);
        map.put("phone", phone);
        map.put("wx", wx);
        map.put("qq", qq);
        map.put("twitter", twitter);
        map.put("is_always", is_always);
        map.put("remark", remark);
        map.put("pageNum", pageNum);
        map.put("pageSize", pageSize);
        return map;
    }
}
app/src/main/java/com/application/zhangshi_app_android/bean/ContactsResponseBean.java
New file
@@ -0,0 +1,32 @@
package com.application.zhangshi_app_android.bean;
import java.util.List;
/**
 * @author Ljj
 * @date 2023.05.13. 0:30
 * @desc
 */
public class ContactsResponseBean {
    private List<ContactsDetailBean> data;
    private long pageNum;
    private long pageSize;
    private long total;
    public List<ContactsDetailBean> getData() {
        return data;
    }
    public void setData(List<ContactsDetailBean> data) {
        this.data = data;
    }
    public long getPageNum() { return pageNum; }
    public void setPageNum(long value) { this.pageNum = value; }
    public long getPageSize() { return pageSize; }
    public void setPageSize(long value) { this.pageSize = value; }
    public long getTotal() { return total; }
    public void setTotal(long value) { this.total = value; }
}
app/src/main/java/com/application/zhangshi_app_android/bean/PersonalNotepadBean.java
New file
@@ -0,0 +1,81 @@
package com.application.zhangshi_app_android.bean;
import java.io.Serializable;
/**
 * @author Ljj
 * @date 2023.05.14. 19:33
 * @desc
 */
public class PersonalNotepadBean implements Serializable {
    //id
    private int id;
    //标题
    private String title;
    //时间
    private String time;
    //人物
    private String person;
    //地点
    private String place;
    //备注
    private String remark;
    //电子文件
    private String url;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getTime() {
        return time;
    }
    public void setTime(String time) {
        this.time = time;
    }
    public String getPerson() {
        return person;
    }
    public void setPerson(String person) {
        this.person = person;
    }
    public String getPlace() {
        return place;
    }
    public void setPlace(String place) {
        this.place = place;
    }
    public String getRemark() {
        return remark;
    }
    public void setRemark(String remark) {
        this.remark = remark;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
}
app/src/main/java/com/application/zhangshi_app_android/bean/TourismExperienceBean.java
New file
@@ -0,0 +1,111 @@
package com.application.zhangshi_app_android.bean;
import java.io.Serializable;
/**
 * @author Ljj
 * @date 2023.05.08. 20:33
 * @desc 旅游经历 Bean
 */
public class TourismExperienceBean implements Serializable{
    //标题
    private String title;
    //时间
    private String time;
    //地点
    private String address;
    //人物
    private String person;
    //旅期
    private String travelTime;
    //持证旅游
    private String certificate;
    //费用
    private String cost;
    //公费/自费
    private int free;
    //备注
    private String remark;
    //电子文件
    private String url;
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getTime() {
        return time;
    }
    public void setTime(String time) {
        this.time = time;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getPerson() {
        return person;
    }
    public void setPerson(String person) {
        this.person = person;
    }
    public String getTravelTime() {
        return travelTime;
    }
    public void setTravelTime(String travelTime) {
        this.travelTime = travelTime;
    }
    public String getCertificate() {
        return certificate;
    }
    public void setCertificate(String certificate) {
        this.certificate = certificate;
    }
    public String getCost() {
        return cost;
    }
    public void setCost(String cost) {
        this.cost = cost;
    }
    public int getFree() {
        return free;
    }
    public void setFree(int free) {
        this.free = free;
    }
    public String getRemark() {
        return remark;
    }
    public void setRemark(String remark) {
        this.remark = remark;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
}
app/src/main/java/com/application/zhangshi_app_android/data/DataRepository.java
@@ -5,7 +5,8 @@
import com.android.app_base.base.model.BaseModel;
import com.android.app_base.http.ResultData;
import com.application.zhangshi_app_android.bean.CaptchaImageBean;
import com.application.zhangshi_app_android.bean.ContactsBean;
import com.application.zhangshi_app_android.bean.ContactsDetailBean;
import com.application.zhangshi_app_android.bean.ContactsResponseBean;
import com.application.zhangshi_app_android.bean.FamilyAssetsResponseBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaResponseBean;
@@ -183,13 +184,11 @@
        return mHttpDataSource.getGrowthExperienceAutobiography();
    }
    /**
     * 获取通讯录
     */
    public Observable<ResultData<ContactsBean>> getFamilyContacts(Map<String, Object> paramsMap) {
        return mHttpDataSource.getFamilyContacts(paramsMap);
    public Observable<ResultData<ContactsResponseBean>> getContacts(Map<String, Object> paramsMap) {
        return mHttpDataSource.getContacts(paramsMap);
    }
    /**
app/src/main/java/com/application/zhangshi_app_android/data/source/HttpDataSource.java
@@ -2,8 +2,9 @@
import com.android.app_base.http.ResultData;
import com.application.zhangshi_app_android.bean.CaptchaImageBean;
import com.application.zhangshi_app_android.bean.ContactsDetailBean;
import com.application.zhangshi_app_android.bean.ContactsResponseBean;
import com.application.zhangshi_app_android.bean.FamilyAssetsResponseBean;
import com.application.zhangshi_app_android.bean.ContactsBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaResponseBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceAbroadConditionBean;
@@ -122,7 +123,7 @@
    /**
     * 获取通讯录
     */
    Observable<ResultData<ContactsBean>> getFamilyContacts(Map<String, Object> paramsMap);
    Observable<ResultData<ContactsResponseBean>> getContacts(Map<String, Object> paramsMap);
}
app/src/main/java/com/application/zhangshi_app_android/data/source/http/ApiService.java
@@ -2,8 +2,9 @@
import com.android.app_base.http.ResultData;
import com.application.zhangshi_app_android.bean.CaptchaImageBean;
import com.application.zhangshi_app_android.bean.ContactsDetailBean;
import com.application.zhangshi_app_android.bean.ContactsResponseBean;
import com.application.zhangshi_app_android.bean.FamilyAssetsResponseBean;
import com.application.zhangshi_app_android.bean.ContactsBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaResponseBean;
import com.application.zhangshi_app_android.bean.GrowthExperienceAbroadConditionBean;
@@ -156,6 +157,6 @@
    /**
     * 获取通讯录
     */
    @GET("/zAutobiography/all")
    Observable<ResultData<ContactsBean>> getFamilyContacts(Map<String, Object> paramsMap);
    @GET("/zfContact/all")
    Observable<ResultData<ContactsResponseBean>> getContacts(@QueryMap Map<String, Object> paramsMap);
}
app/src/main/java/com/application/zhangshi_app_android/data/source/http/HttpDataSourceImpl.java
@@ -3,7 +3,8 @@
import com.android.app_base.http.ResultData;
import com.android.app_base.http.RetrofitManager;
import com.application.zhangshi_app_android.bean.CaptchaImageBean;
import com.application.zhangshi_app_android.bean.ContactsBean;
import com.application.zhangshi_app_android.bean.ContactsDetailBean;
import com.application.zhangshi_app_android.bean.ContactsResponseBean;
import com.application.zhangshi_app_android.bean.FamilyAssetsResponseBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaResponseBean;
@@ -28,6 +29,7 @@
import io.reactivex.Observable;
import okhttp3.MultipartBody;
import retrofit2.http.QueryMap;
/**
 * @author Ljj
@@ -207,8 +209,8 @@
    }
    @Override
    public Observable<ResultData<ContactsBean>> getFamilyContacts(Map<String, Object> paramsMap) {
        return apiService.getFamilyContacts(paramsMap);
    public Observable<ResultData<ContactsResponseBean>> getContacts(Map<String, Object> paramsMap) {
        return apiService.getContacts(paramsMap);
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/DLBaseActivity.java
@@ -96,7 +96,7 @@
            classMap.put(HonorCollectionActivity.class,(LinearLayout) findViewById(R.id.dl_honor_collection));
            classMap.put(LittleDoctorActivity.class,(LinearLayout) findViewById(R.id.dl_little_doctor));
            classMap.put(CleanStorageActivity.class,(LinearLayout) findViewById(R.id.dl_clean_storage));
            classMap.put(null,(LinearLayout) findViewById(R.id.dl_contacts));
            classMap.put(ContactsActivity.class,(LinearLayout) findViewById(R.id.dl_contacts));
            classMap.put(PetActivity.class,(LinearLayout) findViewById(R.id.dl_pet));
            classMap.put(IncomeAndExpensesActivity.class,(LinearLayout) findViewById(R.id.dl_income_and_expenses));
            classMap.put(GrowthExperienceActivity.class,(LinearLayout) findViewById(R.id.dl_growing_up));
@@ -106,7 +106,7 @@
            classMap.put(HealthCareActivity.class,(LinearLayout) findViewById(R.id.dl_health_care));
            classMap.put(CertificateOfHonorActivity.class,(LinearLayout) findViewById(R.id.dl_certificate_of_honor));
            classMap.put(PrivacyActivity.class,(LinearLayout) findViewById(R.id.dl_privacy));
            classMap.put(null,(LinearLayout) findViewById(R.id.dl_tourism));
            classMap.put(TourismActivity.class,(LinearLayout) findViewById(R.id.dl_tourism));
            setSelectItem(classMap.get(getClass()));
            for (Map.Entry<Class, LinearLayout> set : classMap.entrySet()) {
app/src/main/java/com/application/zhangshi_app_android/ui/DLBaseFragment.java
New file
@@ -0,0 +1,173 @@
package com.application.zhangshi_app_android.ui;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;
import androidx.drawerlayout.widget.DrawerLayout;
import com.android.app_base.base.view.BaseActivity;
import com.android.app_base.base.view.BaseFragment;
import com.android.app_base.base.viewmodel.BaseViewModel;
import com.android.app_base.manager.AppManager;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.ui.function.CertificateOfHonorActivity;
import com.application.zhangshi_app_android.ui.function.CleanStorageActivity;
import com.application.zhangshi_app_android.ui.function.ContactsActivity;
import com.application.zhangshi_app_android.ui.function.FamilyAssetsActivity;
import com.application.zhangshi_app_android.ui.function.FamilyMemorabiliaActivity;
import com.application.zhangshi_app_android.ui.function.GrowthExperienceActivity;
import com.application.zhangshi_app_android.ui.function.HealthCareActivity;
import com.application.zhangshi_app_android.ui.function.HomeDevicesActivity;
import com.application.zhangshi_app_android.ui.function.HonorCollectionActivity;
import com.application.zhangshi_app_android.ui.function.HundredWishActivity;
import com.application.zhangshi_app_android.ui.function.IncomeAndExpensesActivity;
import com.application.zhangshi_app_android.ui.function.LittleDoctorActivity;
import com.application.zhangshi_app_android.ui.function.MarriageActivity;
import com.application.zhangshi_app_android.ui.function.PetActivity;
import com.application.zhangshi_app_android.ui.function.PrivacyActivity;
import com.application.zhangshi_app_android.ui.function.PropertyActivity;
import com.application.zhangshi_app_android.ui.function.TourismActivity;
import com.hjq.bar.TitleBar;
import java.util.HashMap;
import java.util.Map;
/**
 * @author Ljj
 * @date 2023.05.08. 21:49
 * @desc 该APP里统一侧拉栏的 Fragment 基类
 */
public abstract class DLBaseFragment<VDB extends ViewDataBinding,VM extends BaseViewModel> extends BaseFragment<VDB,VM> {
    /**
     * 侧拉栏
     */
    private DrawerLayout mDrawerLayout;
    private Map<Class, LinearLayout> classMap = new HashMap<>();
    @Override
    protected VDB initViewBinding(LayoutInflater inflater, @Nullable ViewGroup container) {
        if (isDrawerLayoutEnabled()){
            mDrawerLayout = new DrawerLayout(getSelfActivity());
            mDrawerLayout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
            VDB mBinding = DataBindingUtil.inflate(inflater, getLayoutId(), mDrawerLayout, true);
            if (getDrawerLayoutId() > 0){
                getLayoutInflater().inflate(getDrawerLayoutId(), mDrawerLayout, true);
            }else {
                throw new IllegalArgumentException("没给侧拉栏布局就不要开启侧拉栏啦");
            }
            return mBinding;
        }
        return super.initViewBinding(inflater, container);
    }
    /**
     * 是否开启侧拉栏
     */
    protected boolean isDrawerLayoutEnabled() {
        return true;
    }
    /**
     * 获取侧拉栏的id
     * @return layout的id
     */
    protected int getDrawerLayoutId(){
        return R.layout.layout_drawer;
    };
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (mDrawerLayout != null) {
            classMap.put(null,(LinearLayout) findViewById(R.id.dl_home_root_net));
            classMap.put(FamilyMemorabiliaActivity.class,(LinearLayout) findViewById(R.id.dl_family_memorabilia));
            classMap.put(FamilyAssetsActivity.class,(LinearLayout) findViewById(R.id.dl_family_assets));
            classMap.put(HomeDevicesActivity.class,(LinearLayout) findViewById(R.id.dl_home_devices));
            classMap.put(HonorCollectionActivity.class,(LinearLayout) findViewById(R.id.dl_honor_collection));
            classMap.put(LittleDoctorActivity.class,(LinearLayout) findViewById(R.id.dl_little_doctor));
            classMap.put(CleanStorageActivity.class,(LinearLayout) findViewById(R.id.dl_clean_storage));
            classMap.put(ContactsActivity.class,(LinearLayout) findViewById(R.id.dl_contacts));
            classMap.put(PetActivity.class,(LinearLayout) findViewById(R.id.dl_pet));
            classMap.put(IncomeAndExpensesActivity.class,(LinearLayout) findViewById(R.id.dl_income_and_expenses));
            classMap.put(GrowthExperienceActivity.class,(LinearLayout) findViewById(R.id.dl_growing_up));
            classMap.put(MarriageActivity.class,(LinearLayout) findViewById(R.id.dl_marriage));
            classMap.put(PropertyActivity.class,(LinearLayout) findViewById(R.id.dl_property));
            classMap.put(HundredWishActivity.class,(LinearLayout) findViewById(R.id.dl_hundred_wish));
            classMap.put(HealthCareActivity.class,(LinearLayout) findViewById(R.id.dl_health_care));
            classMap.put(CertificateOfHonorActivity.class,(LinearLayout) findViewById(R.id.dl_certificate_of_honor));
            classMap.put(PrivacyActivity.class,(LinearLayout) findViewById(R.id.dl_privacy));
            classMap.put(TourismActivity.class,(LinearLayout) findViewById(R.id.dl_tourism));
            setSelectItem(classMap.get(getClass()));
            for (Map.Entry<Class, LinearLayout> set : classMap.entrySet()) {
                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));
        }
    }
    private void setSelectItem(LinearLayout linearLayout) {
        if (linearLayout == null){
            return;
        }
        TextView textView = (TextView) linearLayout.getChildAt(1);
        ImageView imageView = (ImageView) linearLayout.getChildAt(2);
        textView.setTextColor(Color.parseColor("#FFF6739F"));
        imageView.setBackgroundResource(R.drawable.ic_vector_pink);
    }
    /**
     * 获取DrawerLayout
     */
    @Nullable
    public DrawerLayout getDrawerLayout() {
        return mDrawerLayout;
    }
    @Override
    public void onLeftClick(TitleBar titleBar) {
        super.onLeftClick(titleBar);
        mDrawerLayout.open();
    }
    public PopupWindow initPopUpWindow(View view){
        PopupWindow popupWindow = new PopupWindow(getSelfActivity());
        // 设置布局文件
        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_operate);
        // 设置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/dialog/ContactsDialog.java
New file
@@ -0,0 +1,53 @@
package com.application.zhangshi_app_android.ui.dialog;
import android.content.Context;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import androidx.databinding.DataBindingUtil;
import com.android.app_base.base.dialog.BaseDialog;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.bean.ContactsDetailBean;
import com.application.zhangshi_app_android.databinding.DialogContactsInfoBinding;
/**
 * @author Ljj
 * @date 2023.05.13. 20:50
 * @desc
 */
public class ContactsDialog {
    public static class Builder extends BaseDialog.Builder<ContactsDialog.Builder> {
        private DialogContactsInfoBinding binding;
        public Builder(Context context) {
            super(context);
            binding = DataBindingUtil.inflate(LayoutInflater.from(getContext()),R.layout.dialog_contacts_info,new FrameLayout(getContext()),false);
            setContentView(binding.getRoot());
            setAnimStyle(BaseDialog.ANIM_IOS);
            setBackgroundDimEnabled(false);
            setCancelable(false);
            setGravity(Gravity.CENTER);
            ImageView iv_dialog_close = findViewById(R.id.iv_dialog_close);
            setOnClickListener(iv_dialog_close);
        }
        @Override
        public void onClick(View v) {
            super.onClick(v);
            if (v.getId() == R.id.iv_dialog_close){
                if (getDialog() != null) {
                    getDialog().dismiss();
                }
            }
        }
        public Builder setBean(ContactsDetailBean bean){
            binding.setBean(bean);
            return this;
        }
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/dialog/PetOwnerInfoDialog.java
@@ -18,7 +18,7 @@
 * @desc
 */
public class PetOwnerInfoDialog {
    public static class Builder extends BaseDialog.Builder<BigImageDialog.Builder> {
    public static class Builder extends BaseDialog.Builder<PetOwnerInfoDialog.Builder> {
        public Builder(Context context) {
            super(context);
            setContentView(R.layout.dialog_pet_owner_info);
app/src/main/java/com/application/zhangshi_app_android/ui/function/ContactsActivity.java
@@ -5,15 +5,23 @@
import android.widget.PopupWindow;
import androidx.databinding.library.baseAdapters.BR;
import androidx.lifecycle.Observer;
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.ContactsRvAdapter;
import com.application.zhangshi_app_android.bean.ContactsBean;
import com.application.zhangshi_app_android.bean.ContactsDetailBean;
import com.application.zhangshi_app_android.databinding.ActivityContactsBinding;
;
import com.application.zhangshi_app_android.ui.DLBaseActivity;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
 * @author Gss
@@ -48,9 +56,7 @@
        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);
        mOperatePopupWindow = initPopUpWindow(View.inflate(this,R.layout.pop_contacts_import,null));
        binding.ivOperate.setOnClickListener(v -> {
            mOperatePopupWindow.showAsDropDown(binding.ivOperate,-ScreenSizeUtils.dip2px(this,85) +binding.ivOperate.getWidth(),0);
@@ -59,33 +65,39 @@
    @Override
    public void initData() {
//        viewModel.getFamilyContacts();
        viewModel.getContacts();
    }
    @Override
    public void initLiveDataObserve() {
//        viewModel.getDataListLiveData().observe(this, familyContactsBeans -> {
//            adapter.setData(familyContactsBeans);
//        });
        viewModel.getDataListLiveData().observe(this, contactsDetailBeans -> {
            //根据名字分组
            Set<String> maNames = new HashSet<>();
            for (ContactsDetailBean bean : contactsDetailBeans) {
                maNames.add(bean.getMyName());
            }
            List<ContactsBean> list = new ArrayList<>();
            for (String name : maNames) {
                ContactsBean bean = new ContactsBean();
                bean.setMyName(name);
                List<ContactsDetailBean> detailBeans = new ArrayList<>();
                for (ContactsDetailBean detailBean : contactsDetailBeans) {
                    if (name.equals(detailBean.getMyName())) {
                        detailBeans.add(detailBean);
                    }
                }
                bean.setContactsDetailBeans(detailBeans);
                list.add(bean);
            }
            adapter.setData(list);
        });
    }
    public 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_operate);
        // 设置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;
    @Override
    public void onClick(View v) {
        super.onClick(v);
        if (v.getId() == R.id.layout_contacts_import){
            mOperatePopupWindow.dismiss();
        }
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/function/ContactsActivityViewModel.java
@@ -1,4 +1,5 @@
package com.application.zhangshi_app_android.ui.function;
import static com.android.app_base.base.BaseConfig.CODE_SUCCESS;
import android.app.Application;
@@ -8,11 +9,13 @@
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.ContactsDetailBean;
import com.application.zhangshi_app_android.bean.ContactsBean;
import com.application.zhangshi_app_android.bean.ContactsRequestBean;
import com.application.zhangshi_app_android.bean.ContactsResponseBean;
import com.application.zhangshi_app_android.data.DataRepository;
import java.util.HashMap;
@@ -20,6 +23,7 @@
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
/**
 * @author Gss
 * @date 2023.04.18. 19:54
@@ -27,7 +31,8 @@
 */
public class ContactsActivityViewModel extends BaseViewModel<DataRepository> {
    private MutableLiveData<List<ContactsBean>> dataListLiveData;//所有数据
    private MutableLiveData<ContactsRequestBean> requestBeanLiveData;//请求参数
    private MutableLiveData<List<ContactsDetailBean>> dataListLiveData;//所有数据
    public ContactsActivityViewModel(@NonNull Application application) {
@@ -41,51 +46,66 @@
    public void getContacts(){
//        model.getFamilyContacts(new HashMap<>())
//                .compose(RxUtils.schedulersTransformer())
//                .subscribe(new Observer<ResultData<ContactsBean>>() {
//                    @Override
//                    public void onSubscribe(Disposable d) {
//                        addSubscribe(d);
//                    }
//
//                    @Override
//                    public void onNext(ResultData<ContactsBean> 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() {
//
//                    }
//                });
        if (getRequestBeanLiveData().getValue() == null){
            getRequestBeanLiveData().setValue(new ContactsRequestBean());
        }
        model.getContacts(getRequestBeanLiveData().getValue().toMap())
                .compose(RxUtils.schedulersTransformer())
                .subscribe(new Observer<ResultData<ContactsResponseBean>>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        addSubscribe(d);
                    }
                    @Override
                    public void onNext(ResultData<ContactsResponseBean> 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<ContactsBean>> getDataListLiveData() {
    public MutableLiveData<List<ContactsDetailBean>> getDataListLiveData() {
        if (dataListLiveData == null){
            dataListLiveData = new MutableLiveData<>();
        }
        return dataListLiveData;
    }
    public void setDataListLiveData(MutableLiveData<List<ContactsBean>> dataListLiveData) {
    public void setDataListLiveData(MutableLiveData<List<ContactsDetailBean>> dataListLiveData) {
        this.dataListLiveData = dataListLiveData;
    }
    public MutableLiveData<ContactsRequestBean> getRequestBeanLiveData() {
        if (requestBeanLiveData == null){
            requestBeanLiveData = new MutableLiveData<>();
            requestBeanLiveData.setValue(new ContactsRequestBean());
        }
        return requestBeanLiveData;
    }
    public void setRequestBeanLiveData(MutableLiveData<ContactsRequestBean> requestBeanLiveData) {
        this.requestBeanLiveData = requestBeanLiveData;
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/function/FunctionFragment.java
@@ -8,13 +8,14 @@
import com.application.zhangshi_app_android.BR;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.databinding.FragmentFunctionBinding;
import com.application.zhangshi_app_android.ui.DLBaseFragment;
/**
 * @author Ljj
 * @date 2023.03.15. 20:14
 * @desc 功能 Fragment
 */
public class FunctionFragment extends BaseFragment<FragmentFunctionBinding,FunctionFragmentViewModel> {
public class FunctionFragment extends DLBaseFragment<FragmentFunctionBinding,FunctionFragmentViewModel> {
    public FunctionFragment() {
    }
@@ -59,17 +60,11 @@
                AppManager.getAppManager().startActivity(FamilyAssetsActivity.class);
            }
        });
        binding.layoutHomeDevices.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AppManager.getAppManager().startActivity(HomeDevicesActivity.class);
            }
        binding.layoutHomeDevices.setOnClickListener(view -> {
            AppManager.getAppManager().startActivity(HomeDevicesActivity.class);
        });
        binding.layoutGrowingUp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AppManager.getAppManager().startActivity(GrowthExperienceActivity.class);
            }
        binding.layoutGrowingUp.setOnClickListener(view -> {
            AppManager.getAppManager().startActivity(GrowthExperienceActivity.class);
        });
        binding.layoutHonorCollection.setOnClickListener(v->{
            AppManager.getAppManager().startActivity(HonorCollectionActivity.class);
@@ -104,6 +99,12 @@
        binding.layoutPrivacy.setOnClickListener(v->{
            AppManager.getAppManager().startActivity(PrivacyActivity.class);
        });
        binding.layoutTourism.setOnClickListener(v->{
            AppManager.getAppManager().startActivity(TourismActivity.class);
        });
        binding.layoutContacts.setOnClickListener(v->{
            AppManager.getAppManager().startActivity(ContactsActivity.class);
        });
    }
    @Override
app/src/main/java/com/application/zhangshi_app_android/ui/function/GrowthExperienceActivity.java
@@ -9,11 +9,14 @@
import android.view.animation.Transformation;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.lifecycle.Observer;
import com.android.app_base.manager.AppManager;
import com.android.app_base.utils.ScreenSizeUtils;
import com.android.app_base.utils.ToastUtils;
import com.android.app_base.widget.LinearItemDecoration;
import com.application.zhangshi_app_android.BR;
@@ -42,6 +45,9 @@
    private GrowthExperienceRelationshipRvAdapter relationshipRvAdapter;
    private GrowthExperienceHolderConditionRvAdapter holderConditionRvAdapter;
    private GrowthExperienceAbroadConditionRvAdapter abroadConditionRvAdapter;
    private PopupWindow mOperatePopupWindow;
    @Override
    public int getLayoutId() {
@@ -81,6 +87,18 @@
        binding.rvAbroad.setNestedScrollingEnabled(false);
        binding.rvAbroad.setAdapter(abroadConditionRvAdapter);
        mOperatePopupWindow = initPopUpWindow(View.inflate(this,R.layout.pop_personal_notepad,null));
        mOperatePopupWindow.getContentView().findViewById(R.id.layout_personal_notepad).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mOperatePopupWindow.dismiss();
                AppManager.getAppManager().startActivity(PersonalNotepadActivity.class);
            }
        });
        binding.ivOperate.setOnClickListener(v -> {
            mOperatePopupWindow.showAsDropDown(binding.ivOperate,-ScreenSizeUtils.dip2px(this,85) +binding.ivOperate.getWidth(),0);
        });
    }
    @Override
app/src/main/java/com/application/zhangshi_app_android/ui/function/PersonalNotepadActivity.java
New file
@@ -0,0 +1,56 @@
package com.application.zhangshi_app_android.ui.function;
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.PersonalNotepadRvAdapter;
import com.application.zhangshi_app_android.adapter.PrivacyRvAdapter;
import com.application.zhangshi_app_android.databinding.ActivityPersonalNotepadBinding;
import com.application.zhangshi_app_android.ui.DLBaseActivity;
/**
 * @author Ljj
 * @date 2023.05.14. 18:51
 * @desc
 */
public class PersonalNotepadActivity extends DLBaseActivity<ActivityPersonalNotepadBinding,PersonalNotepadActivityViewModel> {
    private PersonalNotepadRvAdapter adapter;
    @Override
    public int getLayoutId() {
        return R.layout.activity_personal_notepad;
    }
    @Override
    public int getVariableId() {
        return BR.viewModel;
    }
    @Override
    public void initParam() {
    }
    @Override
    public void initView() {
        adapter = new PersonalNotepadRvAdapter(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);
    }
    @Override
    public void initData() {
        viewModel.getPersonalNotepads();
    }
    @Override
    public void initLiveDataObserve() {
        viewModel.getDataListLiveData().observe(this, dataList -> {
            adapter.setData(dataList);
        });
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/function/PersonalNotepadActivityViewModel.java
New file
@@ -0,0 +1,61 @@
package com.application.zhangshi_app_android.ui.function;
import android.app.Application;
import androidx.annotation.NonNull;
import androidx.lifecycle.MutableLiveData;
import com.android.app_base.base.viewmodel.BaseViewModel;
import com.application.zhangshi_app_android.bean.PersonalNotepadBean;
import com.application.zhangshi_app_android.bean.PrivacyBean;
import com.application.zhangshi_app_android.data.DataRepository;
import java.util.ArrayList;
import java.util.List;
/**
 * @author Ljj
 * @date 2023.05.14. 18:52
 * @desc
 */
public class PersonalNotepadActivityViewModel extends BaseViewModel<DataRepository> {
    private MutableLiveData<List<PersonalNotepadBean>> dataListLiveData;
    public PersonalNotepadActivityViewModel(@NonNull Application application) {
        super(application);
    }
    @Override
    protected DataRepository initModel() {
        return DataRepository.getInstance();
    }
    public MutableLiveData<List<PersonalNotepadBean>> getDataListLiveData() {
        if (dataListLiveData == null) {
            dataListLiveData = new MutableLiveData<>();
        }
        return dataListLiveData;
    }
    public void setDataListLiveData(MutableLiveData<List<PersonalNotepadBean>> dataListLiveData) {
        this.dataListLiveData = dataListLiveData;
    }
    /**
     *  获取个人记事本列表
     */
    public void getPersonalNotepads() {
        List<PersonalNotepadBean> beans =  new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            PersonalNotepadBean bean = new PersonalNotepadBean();
            bean.setId(i);
            bean.setTitle("标题"+i);
            bean.setPerson("张三"+i);
            bean.setTime("2020-05-14 20:00:00");
            bean.setPlace("北京市海淀区"+i);
            bean.setRemark("备注"+i);
            beans.add(bean);
        }
        dataListLiveData.setValue(beans);
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/function/PersonalNotepadDetailActivity.java
New file
@@ -0,0 +1,100 @@
package com.application.zhangshi_app_android.ui.function;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import androidx.recyclerview.widget.GridLayoutManager;
import com.application.zhangshi_app_android.BR;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.adapter.ImageRvAdapter;
import com.application.zhangshi_app_android.bean.PersonalNotepadBean;
import com.application.zhangshi_app_android.databinding.ActivityPersonalNotepadDetailBinding;
import com.application.zhangshi_app_android.ui.DLBaseActivity;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * @author Ljj
 * @date 2023.05.14. 20:37
 * @desc
 */
public class PersonalNotepadDetailActivity extends DLBaseActivity<ActivityPersonalNotepadDetailBinding,PersonalNotepadDetailActivityViewModel> {
    private ImageRvAdapter adapter;
    @Override
    public int getLayoutId() {
        return R.layout.activity_personal_notepad_detail;
    }
    @Override
    public int getVariableId() {
        return BR.viewModel;
    }
    @Override
    public void initParam() {
        if (getIntent().hasExtra("bean")){
            viewModel.getBeanLiveData().setValue((PersonalNotepadBean) getIntent().getSerializableExtra("bean"));
        }
    }
    @Override
    public void initView() {
        adapter = new ImageRvAdapter(this);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
        binding.rvImage.setLayoutManager(gridLayoutManager);
        binding.rvImage.setNestedScrollingEnabled(false);
        setIsEdited(false);
    }
    @Override
    public void initData() {
    }
    @Override
    public void initLiveDataObserve() {
        viewModel.getBeanLiveData().observe(this,bean -> {
            if (bean!=null){
                String url = bean.getUrl();
                if (url == null||url.isEmpty()){
                    return;
                }
                List<String> list;
                if (url.contains(",")){
                    String[] split = url.split(",");
                    list = new ArrayList<>(Arrays.asList(split));
                }else {
                    list = new ArrayList<>();
                    list.add(url);
                }
                adapter.setData(list);
            }
        });
    }
    public void setIsEdited(boolean isEdited){
        disableAllEditText(getContentView(),isEdited);
        adapter.setIsEdited(isEdited);
    }
    public void disableAllEditText(ViewGroup viewGroup, boolean isEdited) {
        for (int i = 0; i < viewGroup.getChildCount(); i++) {
            View child = viewGroup.getChildAt(i);
            if (child instanceof ViewGroup) {
                disableAllEditText((ViewGroup) child,isEdited);
            } else if (child instanceof EditText) {
                child.setEnabled(isEdited);
                child.setFocusable(isEdited);
                child.setFocusableInTouchMode(isEdited);
                if (!isEdited){
                    child.clearFocus();
                }
            }
        }
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/function/PersonalNotepadDetailActivityViewModel.java
New file
@@ -0,0 +1,42 @@
package com.application.zhangshi_app_android.ui.function;
import android.app.Application;
import androidx.annotation.NonNull;
import androidx.lifecycle.MutableLiveData;
import com.android.app_base.base.viewmodel.BaseViewModel;
import com.application.zhangshi_app_android.bean.PersonalNotepadBean;
import com.application.zhangshi_app_android.bean.PrivacyBean;
import com.application.zhangshi_app_android.data.DataRepository;
/**
 * @author Ljj
 * @date 2023.05.14. 20:40
 * @desc
 */
public class PersonalNotepadDetailActivityViewModel extends BaseViewModel<DataRepository> {
    private MutableLiveData<PersonalNotepadBean> beanLiveData;
    public PersonalNotepadDetailActivityViewModel(@NonNull Application application) {
        super(application);
    }
    @Override
    protected DataRepository initModel() {
        return DataRepository.getInstance();
    }
    public MutableLiveData<PersonalNotepadBean> getBeanLiveData() {
        if (beanLiveData == null) {
            beanLiveData = new MutableLiveData<>();
        }
        return beanLiveData;
    }
    public void setBeanLiveData(MutableLiveData<PersonalNotepadBean> beanLiveData) {
        this.beanLiveData = beanLiveData;
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/function/TourismExperienceActivity.java
New file
@@ -0,0 +1,58 @@
package com.application.zhangshi_app_android.ui.function;
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.PropertyRvAdapter;
import com.application.zhangshi_app_android.adapter.TourismExperienceRvAdapter;
import com.application.zhangshi_app_android.bean.TourismExperienceBean;
import com.application.zhangshi_app_android.databinding.ActivityTourismExperienceBinding;
import com.application.zhangshi_app_android.ui.DLBaseActivity;
/**
 * @author Ljj
 * @date 2023.05.08. 20:26
 * @desc 旅游经历 Activity
 */
public class TourismExperienceActivity extends DLBaseActivity<ActivityTourismExperienceBinding,TourismExperienceActivityViewModel> {
    private TourismExperienceRvAdapter adapter;
    @Override
    public int getLayoutId() {
        return R.layout.activity_tourism_experience;
    }
    @Override
    public int getVariableId() {
        return BR.viewModel;
    }
    @Override
    public void initParam() {
    }
    @Override
    public void initView() {
        adapter = new TourismExperienceRvAdapter(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);
    }
    @Override
    public void initData() {
        viewModel.getTourismExperienceData();
    }
    @Override
    public void initLiveDataObserve() {
        viewModel.getDataListLiveData().observe(this, dataList -> {
            adapter.setData(dataList);
        });
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/function/TourismExperienceActivityViewModel.java
New file
@@ -0,0 +1,47 @@
package com.application.zhangshi_app_android.ui.function;
import android.app.Application;
import androidx.annotation.NonNull;
import androidx.lifecycle.MutableLiveData;
import com.android.app_base.base.viewmodel.BaseViewModel;
import com.application.zhangshi_app_android.bean.PropertyBean;
import com.application.zhangshi_app_android.bean.TourismExperienceBean;
import com.application.zhangshi_app_android.data.DataRepository;
import java.util.List;
/**
 * @author Ljj
 * @date 2023.05.08. 20:28
 * @desc 旅游经历 ViewModel
 */
public class TourismExperienceActivityViewModel extends BaseViewModel<DataRepository> {
    private MutableLiveData<List<TourismExperienceBean>> dataListLiveData;
    public TourismExperienceActivityViewModel(@NonNull Application application) {
        super(application);
    }
    @Override
    protected DataRepository initModel() {
        return DataRepository.getInstance();
    }
    /**
     * 获取旅游经历数据
     */
    public void getTourismExperienceData() {
    }
    public MutableLiveData<List<TourismExperienceBean>> getDataListLiveData() {
        if (dataListLiveData == null) {
            dataListLiveData = new MutableLiveData<>();
        }
        return dataListLiveData;
    }
    public void setDataListLiveData(MutableLiveData<List<TourismExperienceBean>> dataListLiveData) {
        this.dataListLiveData = dataListLiveData;
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/function/TourismExperienceDetailActivity.java
@@ -1,9 +1,102 @@
package com.application.zhangshi_app_android.ui.function;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import androidx.recyclerview.widget.GridLayoutManager;
import com.application.zhangshi_app_android.BR;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.adapter.ImageRvAdapter;
import com.application.zhangshi_app_android.bean.PropertyBean;
import com.application.zhangshi_app_android.bean.TourismExperienceBean;
import com.application.zhangshi_app_android.databinding.AcitivityTourismExperienceDetailBinding;
import com.application.zhangshi_app_android.databinding.ActivityPropertyDetailBinding;
import com.application.zhangshi_app_android.ui.DLBaseActivity;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * @author Ljj
 * @date 2023.04.28. 22:49
 * @desc
 * @desc 旅游经历详情
 */
public class TourismExperienceDetailActivity {
public class TourismExperienceDetailActivity extends DLBaseActivity<AcitivityTourismExperienceDetailBinding,TourismExperienceDetailActivityViewModel> {
    private ImageRvAdapter adapter;
    @Override
    public int getLayoutId() {
        return R.layout.acitivity_tourism_experience_detail;
    }
    @Override
    public int getVariableId() {
        return BR.viewModel;
    }
    @Override
    public void initParam() {
        if (getIntent().hasExtra("bean")){
            viewModel.getBeanLiveData().setValue((TourismExperienceBean) getIntent().getSerializableExtra("bean"));
        }
    }
    @Override
    public void initView() {
        adapter = new ImageRvAdapter(this);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
        binding.rvImage.setLayoutManager(gridLayoutManager);
        binding.rvImage.setNestedScrollingEnabled(false);
        setIsEdited(false);
    }
    @Override
    public void initData() {
    }
    @Override
    public void initLiveDataObserve() {
        viewModel.getBeanLiveData().observe(this,bean -> {
            if (bean!=null){
                String url = bean.getUrl();
                if (url == null||url.isEmpty()){
                    return;
                }
                List<String> list;
                if (url.contains(",")){
                    String[] split = url.split(",");
                    list = new ArrayList<>(Arrays.asList(split));
                }else {
                    list = new ArrayList<>();
                    list.add(url);
                }
                adapter.setData(list);
            }
        });
    }
    public void setIsEdited(boolean isEdited){
        disableAllEditText(getContentView(),isEdited);
        adapter.setIsEdited(isEdited);
    }
    public void disableAllEditText(ViewGroup viewGroup, boolean isEdited) {
        for (int i = 0; i < viewGroup.getChildCount(); i++) {
            View child = viewGroup.getChildAt(i);
            if (child instanceof ViewGroup) {
                disableAllEditText((ViewGroup) child,isEdited);
            } else if (child instanceof EditText) {
                child.setEnabled(isEdited);
                child.setFocusable(isEdited);
                child.setFocusableInTouchMode(isEdited);
                if (!isEdited){
                    child.clearFocus();
                }
            }
        }
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/function/TourismExperienceDetailActivityViewModel.java
New file
@@ -0,0 +1,42 @@
package com.application.zhangshi_app_android.ui.function;
import android.app.Application;
import androidx.annotation.NonNull;
import androidx.lifecycle.MutableLiveData;
import com.android.app_base.base.viewmodel.BaseViewModel;
import com.application.zhangshi_app_android.bean.PropertyBean;
import com.application.zhangshi_app_android.bean.TourismExperienceBean;
import com.application.zhangshi_app_android.data.DataRepository;
/**
 * @author Ljj
 * @date 2023.05.08. 21:10
 * @desc
 */
public class TourismExperienceDetailActivityViewModel extends BaseViewModel<DataRepository> {
    private MutableLiveData<TourismExperienceBean> beanLiveData;
    public TourismExperienceDetailActivityViewModel(@NonNull Application application) {
        super(application);
    }
    @Override
    protected DataRepository initModel() {
        return DataRepository.getInstance();
    }
    public MutableLiveData<TourismExperienceBean> getBeanLiveData() {
        if (beanLiveData == null) {
            beanLiveData = new MutableLiveData<>();
        }
        return beanLiveData;
    }
    public void setBeanLiveData(MutableLiveData<TourismExperienceBean> beanLiveData) {
        this.beanLiveData = beanLiveData;
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/personal_center/BasicInfoActivity.java
New file
@@ -0,0 +1,43 @@
package com.application.zhangshi_app_android.ui.personal_center;
import com.application.zhangshi_app_android.BR;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.databinding.ActivityBasicInfoBinding;
import com.application.zhangshi_app_android.ui.DLBaseActivity;
/**
 * @author Ljj
 * @date 2023.05.08. 22:07
 * @desc 个人中心基本信息 Activity
 */
public class BasicInfoActivity extends DLBaseActivity<ActivityBasicInfoBinding,BasicInfoActivityViewModel> {
    @Override
    public int getLayoutId() {
        return R.layout.activity_basic_info;
    }
    @Override
    public int getVariableId() {
        return BR.viewModel;
    }
    @Override
    public void initParam() {
    }
    @Override
    public void initView() {
    }
    @Override
    public void initData() {
    }
    @Override
    public void initLiveDataObserve() {
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/personal_center/BasicInfoActivityViewModel.java
New file
@@ -0,0 +1,24 @@
package com.application.zhangshi_app_android.ui.personal_center;
import android.app.Application;
import androidx.annotation.NonNull;
import com.android.app_base.base.viewmodel.BaseViewModel;
import com.application.zhangshi_app_android.data.DataRepository;
/**
 * @author Ljj
 * @date 2023.05.08. 22:08
 * @desc 个人中心基本信息 ViewModel
 */
public class BasicInfoActivityViewModel extends BaseViewModel<DataRepository> {
    public BasicInfoActivityViewModel(@NonNull Application application) {
        super(application);
    }
    @Override
    protected DataRepository initModel() {
        return DataRepository.getInstance();
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/personal_center/PersonalCenterFragment.java
@@ -1,18 +1,29 @@
package com.application.zhangshi_app_android.ui.personal_center;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.PopupWindow;
import com.android.app_base.base.view.BaseFragment;
import com.android.app_base.manager.AppManager;
import com.android.app_base.utils.ScreenSizeUtils;
import com.application.zhangshi_app_android.BR;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.databinding.FragmentPersonalCenterBinding;
import com.application.zhangshi_app_android.ui.DLBaseFragment;
import com.application.zhangshi_app_android.ui.dialog.PetOwnerInfoDialog;
import com.application.zhangshi_app_android.ui.function.PetMemoActivity;
/**
 * @author Ljj
 * @date 2023.03.15. 20:19
 * @desc 个人中心 Fragment
 */
public class PersonalCenterFragment extends BaseFragment<FragmentPersonalCenterBinding,PersonalCenterFragmentViewModel> {
public class PersonalCenterFragment extends DLBaseFragment<FragmentPersonalCenterBinding,PersonalCenterFragmentViewModel> {
    private PopupWindow popupWindow;
    public PersonalCenterFragment() {
    }
@@ -39,7 +50,16 @@
    @Override
    protected void initView() {
        View view = View.inflate(getSelfActivity(),R.layout.pop_operate_person_center,null);
        popupWindow = initPopUpWindow(view);
        setOnClickListener(
                view.findViewById(R.id.tv_basic_info),
                view.findViewById(R.id.tv_permission_setting)
        );
        binding.ivOperate.setOnClickListener(v -> {
            popupWindow.showAsDropDown(binding.ivOperate,-ScreenSizeUtils.dip2px(getSelfActivity(),85) +binding.ivOperate.getWidth(),0);
        });
    }
    @Override
@@ -51,4 +71,21 @@
    protected void initLiveDataObserve() {
    }
    @Override
    public void onClick(View v) {
        super.onClick(v);
        int id = v.getId();
        if (id == R.id.tv_basic_info){
            popupWindow.dismiss();
            AppManager.getAppManager().startActivity(BasicInfoActivity.class);
        }else if (id == R.id.tv_permission_setting){
            popupWindow.dismiss();
        }
    }
    @Override
    protected boolean isStatusBarImmersionEnabled() {
        return true;
    }
}
app/src/main/res/drawable-xhdpi/ic_contacts_import.png
app/src/main/res/drawable-xhdpi/ic_delete_tourism.png
app/src/main/res/drawable-xxhdpi/ic_contacts_import.png
app/src/main/res/drawable-xxhdpi/ic_delete_tourism.png
app/src/main/res/drawable/shape_ffebafb4_dash_line.xml
New file
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="line"
    >
    <stroke
        android:width="2dp"
        android:color="#FFEBAFB4"
        android:dashWidth="15dp"
        android:dashGap="10dp"
        />
</shape>
app/src/main/res/layout/acitivity_tourism_experience_detail.xml
New file
@@ -0,0 +1,228 @@
<?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.TourismExperienceDetailActivityViewModel" />
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/color_normal_background"
        android:orientation="vertical">
        <com.android.app_base.widget.ExtendTitleBar
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:title="@{viewModel.beanLiveData.title}"
            app:titleGravity="left"
            />
        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            >
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"
                android:paddingHorizontal="20dp"
                android:paddingBottom="20dp"
                >
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="@dimen/dp_10"
                    android:layout_height="@dimen/dp_20"
                    android:text="标题"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="text"
                    android:autofillHints="creditCardNumber"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:textSize="16sp"
                    android:text="@={viewModel.beanLiveData.title}"
                    />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="时间"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:inputType="text"
                    android:textColor="#DE000000"
                    android:text="@={viewModel.beanLiveData.time}"
                    android:textSize="16sp" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="地点"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:text="@={viewModel.beanLiveData.address}"
                    android:textColor="#DE000000"
                    android:textSize="16sp" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="人物"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:text="@={viewModel.beanLiveData.person}"
                    android:textSize="16sp" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="旅期"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:text="@={viewModel.beanLiveData.travelTime}"
                    android:textSize="16sp" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="持证旅游"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:text="@={viewModel.beanLiveData.certificate}"
                    android:textSize="16sp" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="费用"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:text="@={viewModel.beanLiveData.cost}"
                    android:textSize="16sp" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="公费或自费"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    tools:text="自费"
                    android:drawablePadding="10dp"
                    android:drawableStart="@drawable/ic_radio_button_selected"
                    android:text="@{viewModel.beanLiveData.free==1?`公费`:`自费`}"
                    android:textSize="16sp" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="备注"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:text="@={viewModel.beanLiveData.remark}"
                    android:textSize="16sp" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="电子文件"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@drawable/shape_6b0000_stroke"
                    >
                    <com.android.app_base.widget.WrapRecyclerView
                        android:id="@+id/rv_image"
                        android:orientation="vertical"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="10dp"
                        android:layout_marginTop="2sp"
                        android:paddingStart="10dp"
                        android:paddingEnd="5dp"
                        android:paddingVertical="10dp"
                        />
                </RelativeLayout>
            </LinearLayout>
        </ScrollView>
    </LinearLayout>
</layout>
app/src/main/res/layout/activity_basic_info.xml
New file
@@ -0,0 +1,267 @@
<?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">
    <data>
        <variable
            name="viewModel"
            type="com.application.zhangshi_app_android.ui.personal_center.BasicInfoActivityViewModel" />
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/color_normal_background"
        >
        <com.android.app_base.widget.ExtendTitleBar
            android:id="@+id/title_bar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:title="基本资料"
            app:layout_constraintTop_toTopOf="parent"
            app:titleGravity="left"
            >
            <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>
        </com.android.app_base.widget.ExtendTitleBar>
        <ImageView
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_constraintTop_toBottomOf="@id/title_bar"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginTop="53dp"
            android:background="@drawable/bg_login_zhang"
            app:layout_constraintDimensionRatio="285:316"
            />
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_marginHorizontal="20dp"
            app:layout_constraintTop_toBottomOf="@id/title_bar"
            >
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="基本信息"
                android:textSize="20sp"
                android:textColor="@color/black"
                android:layout_marginTop="16dp"
                />
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                >
                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:orientation="vertical"
                    >
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="用户名称"
                        android:textColor="@color/black"
                        android:textSize="12sp"
                        android:alpha="0.54"
                        />
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="张三"
                        android:textColor="#DE000000"
                        android:textSize="16sp"
                        android:layout_marginTop="5dp"
                        />
                    <View
                        android:layout_width="match_parent"
                        android:layout_height="1dp"
                        android:background="#6B000000"
                        android:layout_marginTop="8dp"
                        />
                </LinearLayout>
                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:orientation="vertical"
                    android:layout_marginStart="40dp"
                    >
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="手机号码"
                        android:textColor="@color/black"
                        android:textSize="12sp"
                        android:alpha="0.54"
                        />
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="12345678901"
                        android:textColor="#DE000000"
                        android:textSize="16sp"
                        android:layout_marginTop="5dp"
                        />
                    <View
                        android:layout_width="match_parent"
                        android:layout_height="1dp"
                        android:background="#6B000000"
                        android:layout_marginTop="8dp"
                        />
                </LinearLayout>
            </LinearLayout>
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="40dp"
                >
                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:orientation="vertical"
                    >
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="邮箱"
                        android:textColor="@color/black"
                        android:textSize="12sp"
                        android:alpha="0.54"
                        />
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="zhang@126.com"
                        android:textColor="#DE000000"
                        android:textSize="16sp"
                        android:layout_marginTop="5dp"
                        />
                    <View
                        android:layout_width="match_parent"
                        android:layout_height="1dp"
                        android:background="#6B000000"
                        android:layout_marginTop="8dp"
                        />
                </LinearLayout>
                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:orientation="vertical"
                    android:layout_marginStart="40dp"
                    >
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="性别"
                        android:textColor="@color/black"
                        android:textSize="12sp"
                        android:alpha="0.54"
                        />
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="5dp"
                        >
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="男"
                            android:textColor="#DE000000"
                            android:textSize="16sp"
                            android:drawableStart="@drawable/ic_radio_button_selected"
                            android:drawablePadding="5dp"
                            />
                        <View
                            android:layout_width="0dp"
                            android:layout_height="match_parent"
                            android:layout_weight="2"
                            />
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="女"
                            android:textColor="#DE000000"
                            android:textSize="16sp"
                            android:drawableStart="@drawable/ic_radio_button_unselected"
                            android:drawablePadding="5dp"
                            />
                        <View
                            android:layout_width="0dp"
                            android:layout_height="match_parent"
                            android:layout_weight="1"
                            />
                    </LinearLayout>
                    <View
                        android:layout_width="match_parent"
                        android:layout_height="1dp"
                        android:background="#6B000000"
                        android:layout_marginTop="8dp"
                        />
                </LinearLayout>
            </LinearLayout>
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginTop="60dp"
                >
                <androidx.cardview.widget.CardView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    app:cardCornerRadius="10dp"
                    app:cardBackgroundColor="#FFE0EEFE"
                    app:cardElevation="0dp"
                    >
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textSize="16sp"
                        android:text="保存"
                        android:textColor="#FF282828"
                        android:layout_marginVertical="12dp"
                        android:layout_marginHorizontal="36dp"
                        />
                </androidx.cardview.widget.CardView>
                <androidx.cardview.widget.CardView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    app:cardCornerRadius="10dp"
                    app:cardBackgroundColor="#FFEBAFB4"
                    app:cardElevation="0dp"
                    android:layout_marginStart="30dp"
                    >
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textSize="16sp"
                        android:text="关闭"
                        android:textColor="#FF282828"
                        android:layout_marginVertical="12dp"
                        android:layout_marginHorizontal="36dp"
                        />
                </androidx.cardview.widget.CardView>
            </LinearLayout>
        </LinearLayout>
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
app/src/main/res/layout/activity_contacts.xml
@@ -109,10 +109,8 @@
            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" />
            tools:listitem="@layout/item_family_assets" />
    </androidx.constraintlayout.widget.ConstraintLayout>
app/src/main/res/layout/activity_growth_experience.xml
@@ -19,7 +19,22 @@
            android:layout_height="wrap_content"
            app:title="成长经历"
            app:titleGravity="left"
            />
            >
            <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>
        </com.android.app_base.widget.ExtendTitleBar>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
app/src/main/res/layout/activity_personal_notepad.xml
New file
@@ -0,0 +1,146 @@
<?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.PersonalNotepadActivityViewModel" />
    </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:ellipsize="marquee"
                    android:maxLines="1"
                    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>
        <LinearLayout
            android:id="@+id/layout_data_null"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:gravity="center"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/titleBar">
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/img_data_null"
                />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="18dp"
                android:text="暂时还没有数据哦~\n点击”+”立即创建"
                android:textSize="14sp"
                android:textColor="#73000000"
                />
        </LinearLayout>
        <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="20"
            tools:layout_editor_absoluteX="-81dp"
            tools:listitem="@layout/item_family_assets" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
app/src/main/res/layout/activity_personal_notepad_detail.xml
New file
@@ -0,0 +1,158 @@
<?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.PersonalNotepadDetailActivityViewModel" />
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/color_normal_background"
        android:orientation="vertical">
        <com.android.app_base.widget.ExtendTitleBar
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:title="@{viewModel.beanLiveData.title}"
            app:titleGravity="left"
            />
        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            >
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"
                android:paddingHorizontal="20dp"
                android:paddingBottom="20dp"
                >
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="@dimen/dp_10"
                    android:layout_height="@dimen/dp_20"
                    android:text="标题"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="text"
                    android:autofillHints="creditCardNumber"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:textSize="16sp"
                    android:text="@{viewModel.beanLiveData.title}"
                    />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="时间"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:inputType="text"
                    android:textColor="#DE000000"
                    android:text="@={viewModel.beanLiveData.time}"
                    android:textSize="16sp" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="人物"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:text="@={viewModel.beanLiveData.person}"
                    android:textColor="#DE000000"
                    android:textSize="16sp" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="地点"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:text="@={viewModel.beanLiveData.place}"
                    android:textSize="16sp" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="备注"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:text="@{viewModel.beanLiveData.remark}"
                    android:textSize="16sp" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="电子文件"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@drawable/shape_6b0000_stroke"
                    >
                    <com.android.app_base.widget.WrapRecyclerView
                        android:id="@+id/rv_image"
                        android:orientation="vertical"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="10dp"
                        android:layout_marginTop="2sp"
                        android:paddingStart="10dp"
                        android:paddingEnd="5dp"
                        android:paddingVertical="10dp"
                        />
                </RelativeLayout>
            </LinearLayout>
        </ScrollView>
    </LinearLayout>
</layout>
app/src/main/res/layout/activity_tourism.xml
@@ -6,7 +6,7 @@
    <data>
        <variable
            name="viewModel"
            type="com.application.zhangshi_app_android.ui.function.PrivacyActivityViewModel" />
            type="com.application.zhangshi_app_android.ui.function.TourismActivityViewModel" />
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
@@ -47,7 +47,7 @@
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="16dp"
                    android:text="藏心密语(仅供查看)"
                    android:text="旅游费用记录统计表"
                    android:layout_weight="1"
                    android:textColor="@color/white"
                    android:textSize="@dimen/sp_20"
app/src/main/res/layout/activity_tourism_experience.xml
New file
@@ -0,0 +1,143 @@
<?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.TourismExperienceActivityViewModel" />
    </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>
        <LinearLayout
            android:id="@+id/layout_data_null"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:gravity="center"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/titleBar">
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/img_data_null"
                />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="18dp"
                android:text="暂时还没有数据哦~\n点击”+”立即创建"
                android:textSize="14sp"
                android:textColor="#73000000"
                />
        </LinearLayout>
        <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="20"
            />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
app/src/main/res/layout/dialog_contacts_info.xml
New file
@@ -0,0 +1,253 @@
<?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.ContactsDetailBean" />
    </data>
    <androidx.cardview.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:cardBackgroundColor="#FFFFFCFC"
        app:cardCornerRadius="5dp"
        android:layout_marginHorizontal="30dp">
        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <ImageView
                android:id="@+id/iv_dialog_close"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="15dp"
                android:layout_marginEnd="15dp"
                android:background="@drawable/ic_dialog_close"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toTopOf="parent" />
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginHorizontal="30dp"
                android:layout_marginVertical="20dp"
                android:orientation="vertical"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintTop_toTopOf="parent">
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="成员姓名:"
                        android:textColor="@color/black"
                        android:textSize="14sp" />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="@{bean.myName}"
                        android:textColor="@color/black"
                        android:textSize="14sp" />
                </LinearLayout>
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="10dp">
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="称呼:"
                        android:textColor="@color/black"
                        android:textSize="14sp" />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="@{bean.nickName}"
                        android:textColor="@color/black"
                        android:textSize="14sp" />
                </LinearLayout>
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="10dp">
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="姓名:"
                        android:textColor="@color/black"
                        android:textSize="14sp" />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="@{bean.name}"
                        android:textColor="@color/black"
                        android:textSize="14sp" />
                </LinearLayout>
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="10dp">
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="工作单位:"
                        android:textColor="@color/black"
                        android:textSize="14sp" />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="@{bean.work}"
                        android:textColor="@color/black"
                        android:textSize="14sp" />
                </LinearLayout>
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="10dp">
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="手机:"
                        android:textColor="@color/black"
                        android:textSize="14sp" />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="@{bean.phone}"
                        android:textColor="@color/black"
                        android:textSize="14sp" />
                </LinearLayout>
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="10dp">
                    <TextView
                        android:layout_width="0dp"
                        android:layout_weight="1"
                        android:layout_height="wrap_content"
                        android:text="其他联系方式:"
                        android:textColor="@color/black"
                        android:textSize="14sp" />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="@{`微信号:`+ bean.wx}"
                        android:textColor="@color/black"
                        android:textSize="10sp"
                        />
                </LinearLayout>
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="10dp">
                    <TextView
                        android:layout_width="0dp"
                        android:layout_weight="1"
                        android:layout_height="wrap_content"
                        android:text="@{`QQ号:`+ bean.wx}"
                        android:textColor="@color/black"
                        android:textSize="10sp" />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="@{`推特:`+ bean.wx}"
                        android:textColor="@color/black"
                        android:textSize="10sp" />
                </LinearLayout>
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="10dp">
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="是否常联系:"
                        android:textColor="@color/black"
                        android:textSize="14sp" />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="@{bean.is_always==1?`是`:`否`}"
                        android:textColor="@color/black"
                        android:textSize="14sp" />
                </LinearLayout>
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="10dp">
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="备注"
                        android:textColor="@color/black"
                        android:textSize="14sp" />
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="(是否存在金钱关系):"
                        android:textColor="@color/black"
                        android:textSize="10sp" />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="@{bean.remark}"
                        android:textColor="@color/black"
                        android:textSize="14sp" />
                </LinearLayout>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="10dp"
                    android:text="电子名片:"
                    android:textColor="@color/black"
                    android:textSize="14sp" />
            </LinearLayout>
        </androidx.constraintlayout.widget.ConstraintLayout>
    </androidx.cardview.widget.CardView>
</layout>
app/src/main/res/layout/fragment_personal_center.xml
@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<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
@@ -7,9 +9,267 @@
            type="com.application.zhangshi_app_android.ui.personal_center.PersonalCenterFragmentViewModel" />
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </androidx.constraintlayout.widget.ConstraintLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:background="@color/color_normal_background"
        >
        <com.android.app_base.widget.ExtendTitleBar
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:title="个人中心"
            app:titleGravity="left"
            android:elevation="5dp"
            >
            <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>
        </com.android.app_base.widget.ExtendTitleBar>
        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            >
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:paddingBottom="20dp"
                >
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="个人中心"
                    android:textSize="20sp"
                    android:textColor="@color/black"
                    android:layout_marginStart="20dp"
                    android:layout_marginTop="16dp"
                    />
                <View
                    android:layout_width="match_parent"
                    android:layout_height="2dp"
                    android:background="#33000000"
                    android:layout_marginTop="24dp"
                    />
                <androidx.constraintlayout.widget.ConstraintLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    >
                    <androidx.constraintlayout.utils.widget.ImageFilterView
                        android:layout_width="0dp"
                        android:layout_height="0dp"
                        android:layout_marginVertical="25dp"
                        app:layout_constraintBottom_toBottomOf="parent"
                        app:layout_constraintDimensionRatio="1"
                        app:layout_constraintEnd_toEndOf="parent"
                        app:layout_constraintStart_toStartOf="parent"
                        app:layout_constraintTop_toTopOf="parent"
                        app:layout_constraintWidth_percent="0.3"
                        app:roundPercent="1" />
                    <View
                        android:layout_width="match_parent"
                        android:layout_height="1dp"
                        android:background="#33000000"
                        app:layout_constraintBottom_toBottomOf="parent"
                        android:layout_marginHorizontal="15dp"
                        />
                </androidx.constraintlayout.widget.ConstraintLayout>
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginHorizontal="15dp"
                    android:orientation="vertical"
                    >
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:paddingVertical="12dp"
                        android:paddingHorizontal="10dp"
                        >
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:textSize="18sp"
                            android:textColor="#FF212121"
                            android:text="用户名称"
                            />
                        <TextView
                            android:layout_width="0dp"
                            android:layout_weight="1"
                            android:layout_height="wrap_content"
                            android:textSize="18sp"
                            android:textColor="#FF212121"
                            android:text="@{}"
                            android:gravity="end"
                            tools:text="张三"
                            />
                    </LinearLayout>
                    <View
                        android:layout_width="match_parent"
                        android:layout_height="1dp"
                        android:background="#33000000"
                        />
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:paddingVertical="12dp"
                        android:paddingHorizontal="10dp"
                        >
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:textSize="18sp"
                            android:textColor="#FF212121"
                            android:text="手机号码"
                            />
                        <TextView
                            android:layout_width="0dp"
                            android:layout_weight="1"
                            android:layout_height="wrap_content"
                            android:textSize="18sp"
                            android:textColor="#FF212121"
                            android:text="@{}"
                            android:gravity="end"
                            tools:text="13234567890"
                            />
                    </LinearLayout>
                    <View
                        android:layout_width="match_parent"
                        android:layout_height="1dp"
                        android:background="#33000000"
                        />
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:paddingVertical="12dp"
                        android:paddingHorizontal="10dp"
                        >
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:textSize="18sp"
                            android:textColor="#FF212121"
                            android:text="用户邮箱"
                            />
                        <TextView
                            android:layout_width="0dp"
                            android:layout_weight="1"
                            android:layout_height="wrap_content"
                            android:textSize="18sp"
                            android:textColor="#FF212121"
                            android:text="@{}"
                            android:gravity="end"
                            tools:text="zhang@126.com"
                            />
                    </LinearLayout>
                    <View
                        android:layout_width="match_parent"
                        android:layout_height="1dp"
                        android:background="#33000000"
                        />
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:paddingVertical="12dp"
                        android:paddingHorizontal="10dp"
                        >
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:textSize="18sp"
                            android:textColor="#FF212121"
                            android:text="所属家庭"
                            />
                        <TextView
                            android:layout_width="0dp"
                            android:layout_weight="1"
                            android:layout_height="wrap_content"
                            android:textSize="18sp"
                            android:textColor="#FF212121"
                            android:text="@{}"
                            android:gravity="end"
                            tools:text="张三家庭"
                            />
                    </LinearLayout>
                    <View
                        android:layout_width="match_parent"
                        android:layout_height="1dp"
                        android:background="#33000000"
                        />
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:paddingVertical="12dp"
                        android:paddingHorizontal="10dp"
                        >
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:textSize="18sp"
                            android:textColor="#FF212121"
                            android:text="所属角色"
                            />
                        <TextView
                            android:layout_width="0dp"
                            android:layout_weight="1"
                            android:layout_height="wrap_content"
                            android:textSize="18sp"
                            android:textColor="#FF212121"
                            android:text="@{}"
                            android:gravity="end"
                            tools:text="家庭管理员"
                            />
                    </LinearLayout>
                    <View
                        android:layout_width="match_parent"
                        android:layout_height="1dp"
                        android:background="#33000000"
                        />
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:paddingVertical="12dp"
                        android:paddingHorizontal="10dp"
                        >
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:textSize="18sp"
                            android:textColor="#FF212121"
                            android:text="创建日期"
                            />
                        <TextView
                            android:layout_width="0dp"
                            android:layout_weight="1"
                            android:layout_height="wrap_content"
                            android:textSize="18sp"
                            android:textColor="#FF212121"
                            android:text="@{}"
                            android:gravity="end"
                            tools:text="2023-04-01"
                            />
                    </LinearLayout>
                    <View
                        android:layout_width="match_parent"
                        android:layout_height="1dp"
                        android:background="#33000000"
                        />
                </LinearLayout>
            </LinearLayout>
        </ScrollView>
    </LinearLayout>
</layout>
app/src/main/res/layout/item_consume_record.xml
New file
@@ -0,0 +1,214 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable
            name="bean"
            type="com.application.zhangshi_app_android.bean.ConsumeRecordBean" />
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_marginTop="10dp"
            android:layout_height="wrap_content"
            android:text="总金额"
            android:textColor="#767375"
            android:textSize="12sp" />
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            >
            <EditText
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:layout_marginTop="2dp"
                android:inputType="text"
                android:textColorHint="#6b000000"
                android:textColor="#DE000000"
                android:text="@={bean.content}"
                android:textSize="16sp" />
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/ic_delete_tourism"
                android:layout_marginHorizontal="16dp"
                />
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="12dp">
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="总金额"
                    android:textColor="#767375"
                    android:textSize="12sp" />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:text="@={bean.totalMoney}"
                    android:textSize="16sp" />
            </LinearLayout>
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical"
                android:layout_marginStart="40dp">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="餐费"
                    android:textColor="#767375"
                    android:textSize="12sp" />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:text="@={bean.mealMoney}"
                    android:textSize="16sp" />
            </LinearLayout>
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="12dp"
            >
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical"
                >
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="住宿"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    tools:text="aaa"
                    android:text="@={bean.hotelMoney}"
                    android:textSize="16sp" />
            </LinearLayout>
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical"
                android:layout_marginStart="40dp"
                >
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="交通"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:text="@={bean.trafficMoney}"
                    android:textSize="16sp" />
            </LinearLayout>
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="12dp"
            >
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical"
                >
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="门票"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    tools:text="aaa"
                    android:text="@={bean.ticketMoney}"
                    android:textSize="16sp" />
            </LinearLayout>
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical"
                android:layout_marginStart="40dp"
                >
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="购物"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:text="@={bean.shoppingMoney}"
                    android:textSize="16sp" />
            </LinearLayout>
        </LinearLayout>
        <View
            android:layout_width="match_parent"
            android:layout_height="3dp"
            android:background="@drawable/shape_ffebafb4_dash_line"
            android:layout_marginVertical="18dp"
            />
    </LinearLayout>
</layout>
app/src/main/res/layout/item_contacts.xml
@@ -16,8 +16,9 @@
        <androidx.cardview.widget.CardView
            android:id="@+id/cardView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/dp_2"
            android:layout_height="40dp"
            android:layout_margin="2dp"
            tools:layout_height="wrap_content"
            app:cardCornerRadius="@dimen/dp_10"
            app:cardBackgroundColor="@color/color_card_pink"
            >
@@ -30,85 +31,31 @@
                    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:layout_centerInParent="true"
                        android:text="@{bean.myName+` 的 通 讯 录`}"
                        android:textColor="@color/black"
                        android:gravity="center"
                        android:textSize="@dimen/sp_16"
                        android:textStyle="bold"
                        tools:text="张三的通讯录"
                        />
                        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"
                    android:layout_marginBottom="30dp"
                    >
                    <LinearLayout
                    <androidx.recyclerview.widget.RecyclerView
                        android:id="@+id/recyclerView"
                        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>
                        android:layout_marginHorizontal="25dp"
                        tools:listitem="@layout/item_contacts_detail"
                        />
                </LinearLayout>
            </LinearLayout>
app/src/main/res/layout/item_contacts_detail.xml
New file
@@ -0,0 +1,106 @@
<?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.ContactsDetailBean" />
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/transparent"
        android:layout_marginVertical="5dp"
        >
        <androidx.constraintlayout.utils.widget.ImageFilterView
            android:id="@+id/iv_avatar"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_constraintDimensionRatio="1:1"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:round="8dp"
            android:background="@color/teal_200"
            android:layout_margin="5dp"
            app:imageUrl="@{bean.url.split(`,`)[0]}"
            />
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_marginStart="15dp"
            app:layout_constraintStart_toEndOf="@id/iv_avatar"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            >
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{bean.name}"
                android:maxLines="1"
                android:textColor="@color/black"
                android:textSize="14sp"
                android:textStyle="bold"
                tools:text="姓名"
                />
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:layout_marginTop="8dp"
                >
                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:text="@{bean.nickName}"
                    android:textColor="#80000000"
                    android:textSize="@dimen/sp_12"
                    android:layout_weight="2"
                    android:maxLines="1"
                    tools:text="称呼"
                    android:layout_marginEnd="3dp"
                    android:ellipsize="end"
                    />
                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:text="@{bean.work}"
                    android:textColor="#80000000"
                    android:textSize="12sp"
                    android:maxLines="1"
                    android:layout_weight="3"
                    tools:text="工作单位"
                    android:layout_marginEnd="3dp"
                    android:ellipsize="end"
                    />
                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:text="@{bean.phone}"
                    android:ellipsize="end"
                    android:textColor="#80000000"
                    android:textSize="12sp"
                    android:maxLines="1"
                    android:layout_weight="4"
                    tools:text="12345678901"
                    />
            </LinearLayout>
            <View
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:background="#BFFFFFFF"
                android:layout_marginTop="8dp"
                />
        </LinearLayout>
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
app/src/main/res/layout/item_daily_consume_record.xml
@@ -8,7 +8,12 @@
    <data>
        <variable
            name="bean"
            type="com.application.zhangshi_app_android.bean.DailyConsumeRecordBean" />
            type="com.application.zhangshi_app_android.bean.DailyConsumeRecordBean"
            />
        <variable
            name="isFold"
            type="boolean"
            />
    </data>
    <androidx.cardview.widget.CardView
@@ -48,9 +53,10 @@
                    android:background="@drawable/ic_tourism_add"
                    />
                <ImageView
                    android:id="@+id/iv_fold"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:background="@drawable/ic_fold"
                    android:background="@{isFold?@drawable/ic_fold:@drawable/ic_unfold}"
                    android:layout_marginStart="10dp"
                    />
            </LinearLayout>
app/src/main/res/layout/item_personal_notepad.xml
New file
@@ -0,0 +1,197 @@
<?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.PersonalNotepadBean" />
    </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="40dp"
            android:layout_margin="@dimen/dp_2"
            app:cardCornerRadius="@dimen/dp_10"
            app:cardBackgroundColor="@color/color_card_pink"
            tools:layout_height="wrap_content"
            >
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                >
                <androidx.constraintlayout.widget.ConstraintLayout
                    android:id="@+id/layout_title"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/dp_40"
                    android:gravity="center_vertical">
                    <TextView
                        android:id="@+id/textView2"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginStart="25dp"
                        android:text="@{bean.title}"
                        android:textColor="@color/black"
                        android:textSize="@dimen/sp_16"
                        android:textStyle="bold"
                        app:layout_constraintBottom_toBottomOf="parent"
                        app:layout_constraintStart_toStartOf="parent"
                        app:layout_constraintTop_toTopOf="parent"
                        tools:text="房产证" />
                    <TextView
                        android:id="@+id/tv_time"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="@{bean.time}"
                        android:textColor="@color/black"
                        android:textSize="16sp"
                        android:layout_marginEnd="25dp"
                        android:textStyle="bold"
                        app:layout_constraintBottom_toBottomOf="parent"
                        app:layout_constraintEnd_toEndOf="parent"
                        app:layout_constraintTop_toTopOf="parent"
                        tools:text="2019-01-12" />
                </androidx.constraintlayout.widget.ConstraintLayout>
                <LinearLayout
                    android:id="@+id/layout_content"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    android:paddingHorizontal="35dp"
                    >
                    <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_12"
                            android:textStyle="bold"
                            />
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="@{String.valueOf(bean.id)}"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            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="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="人物:"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="@{bean.person}"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            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="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="地点:"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="@{bean.place}"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            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="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="备注:"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="@{bean.remark}"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                    </LinearLayout>
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="@dimen/dp_6"
                        android:text="电子文件:"
                        android:textColor="@color/black"
                        android:textSize="@dimen/sp_12"
                        android:textStyle="bold"
                        />
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal"
                        android:layout_marginBottom="@dimen/dp_15"
                        >
                        <androidx.recyclerview.widget.RecyclerView
                            android:id="@+id/rv_image"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            tools:listitem="@layout/item_image"
                            tools:itemCount="3"
                            />
                    </LinearLayout>
                </LinearLayout>
            </LinearLayout>
        </androidx.cardview.widget.CardView>
    </LinearLayout>
</layout>
app/src/main/res/layout/item_tourism_experience.xml
New file
@@ -0,0 +1,270 @@
<?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.TourismExperienceBean" />
    </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="40dp"
            android:layout_margin="@dimen/dp_2"
            app:cardCornerRadius="@dimen/dp_10"
            app:cardBackgroundColor="@color/color_card_pink"
            tools:layout_height="wrap_content"
            >
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                >
                <androidx.constraintlayout.widget.ConstraintLayout
                    android:id="@+id/layout_title"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/dp_40"
                    android:gravity="center_vertical">
                    <TextView
                        android:id="@+id/textView2"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginStart="25dp"
                        android:text="@{bean.title}"
                        android:textColor="@color/black"
                        android:textSize="@dimen/sp_16"
                        android:textStyle="bold"
                        app:layout_constraintBottom_toBottomOf="parent"
                        app:layout_constraintStart_toStartOf="parent"
                        app:layout_constraintTop_toTopOf="parent"
                        tools:text="游云南" />
                    <TextView
                        android:id="@+id/tv_time"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="@{bean.time}"
                        android:textColor="@color/black"
                        android:textSize="16sp"
                        android:layout_marginEnd="25dp"
                        android:textStyle="bold"
                        app:layout_constraintBottom_toBottomOf="parent"
                        app:layout_constraintEnd_toEndOf="parent"
                        app:layout_constraintTop_toTopOf="parent"
                        tools:text="2019-01-12" />
                </androidx.constraintlayout.widget.ConstraintLayout>
                <LinearLayout
                    android:id="@+id/layout_content"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    android:paddingHorizontal="35dp"
                    >
                    <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_12"
                            android:textStyle="bold"
                            />
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="@{bean.address}"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            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="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="人物:"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="@{bean.person}"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            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="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="旅期:"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="@{bean.travelTime}"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            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="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="持证旅游:"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="@{bean.certificate}"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            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="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="费用:"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="@{bean.cost}"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            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="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="公费或自费:"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="@{bean.free==1?`公费`:`自费`}"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            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="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="备注:"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="@{bean.remark}"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                    </LinearLayout>
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="@dimen/dp_6"
                        android:text="电子文件:"
                        android:textColor="@color/black"
                        android:textSize="@dimen/sp_12"
                        android:textStyle="bold"
                        />
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal"
                        android:layout_marginBottom="@dimen/dp_15"
                        >
                        <androidx.recyclerview.widget.RecyclerView
                            android:id="@+id/rv_image"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            tools:listitem="@layout/item_image"
                            tools:itemCount="3"
                            />
                    </LinearLayout>
                </LinearLayout>
            </LinearLayout>
        </androidx.cardview.widget.CardView>
    </LinearLayout>
</layout>
app/src/main/res/layout/pop_contacts_import.xml
New file
@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:cardBackgroundColor="#FFFAD1E0"
    app:cardCornerRadius="10dp"
    app:cardElevation="0dp"
    >
    <LinearLayout
        android:layout_width="85dp"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center_horizontal"
        >
        <LinearLayout
            android:id="@+id/layout_contacts_import"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:gravity="center_horizontal"
            >
            <TextView
                android:id="@+id/tv_contacts_import"
                android:layout_width="wrap_content"
                android:layout_height="32dp"
                android:gravity="center"
                android:text="导入"
                android:textColor="#FF333333"
                android:textSize="12sp"
                app:drawableStartCompat="@drawable/ic_contacts_import"
                android:drawablePadding="5dp"
                />
        </LinearLayout>
    </LinearLayout>
</androidx.cardview.widget.CardView>
app/src/main/res/layout/pop_operate_person_center.xml
New file
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:cardBackgroundColor="#FFFAD1E0"
    app:cardCornerRadius="10dp"
    app:cardElevation="0dp"
    >
    <LinearLayout
        android:layout_width="85dp"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center_horizontal"
        >
        <TextView
            android:id="@+id/tv_basic_info"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:gravity="center"
            android:text="基本信息"
            android:textColor="#FF333333"
            android:textSize="12sp"
            />
        <View
            android:layout_width="match_parent"
            android:layout_height="0.3dp"
            android:background="#FF939393"
            />
        <TextView
            android:id="@+id/tv_permission_setting"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:text="权限设置"
            android:gravity="center"
            android:textColor="#FF333333"
            android:textSize="12sp"
            />
    </LinearLayout>
</androidx.cardview.widget.CardView>
app/src/main/res/layout/pop_personal_notepad.xml
New file
@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:cardBackgroundColor="#FFFAD1E0"
    app:cardCornerRadius="10dp"
    app:cardElevation="0dp"
    >
    <LinearLayout
        android:layout_width="85dp"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center_horizontal"
        >
        <LinearLayout
            android:id="@+id/layout_personal_notepad"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:gravity="center_horizontal"
            >
            <TextView
                android:id="@+id/tv_personal_notepad"
                android:layout_width="wrap_content"
                android:layout_height="32dp"
                android:gravity="center"
                android:text="个人记事本"
                android:textColor="#FF333333"
                android:textSize="12sp"
                android:drawablePadding="5dp"
                />
        </LinearLayout>
    </LinearLayout>
</androidx.cardview.widget.CardView>
app_base/build.gradle
@@ -68,6 +68,7 @@
    //图片相关
    api 'com.github.bumptech.glide:glide:4.14.2'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
    //内存泄露工具
    debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.9.1'
app_base/src/main/java/com/android/app_base/base/view/BaseFragment.java
@@ -4,7 +4,6 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
@@ -18,6 +17,7 @@
import com.android.app_base.action.TitleBarAction;
import com.android.app_base.base.StateViewEnum;
import com.android.app_base.base.action.ClickAction;
import com.android.app_base.base.viewmodel.BaseViewModel;
import com.gyf.immersionbar.ImmersionBar;
import com.hjq.bar.TitleBar;
@@ -30,8 +30,8 @@
 * @date 2023.03.02. 15:50
 * @desc Fragment基类
 */
public abstract class BaseFragment<V extends ViewDataBinding,VM extends BaseViewModel> extends Fragment implements TitleBarAction {
    protected V binding;
public abstract class BaseFragment<VDB extends ViewDataBinding,VM extends BaseViewModel> extends Fragment implements TitleBarAction, ClickAction {
    protected VDB binding;
    protected VM viewModel;
    private int viewModelId;
@@ -65,12 +65,13 @@
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        isLoaded = false;
        if (getLayoutId() > 0){
            binding = DataBindingUtil.inflate(inflater,getLayoutId(), container, false);
            binding = initViewBinding(inflater, container);
            mRootView = binding.getRoot();
            return mRootView;
        }
        return null;
    }
    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
@@ -122,6 +123,13 @@
        getLifecycle().addObserver(viewModel);
    }
    /**
     * 初始化ViewBinding
     */
    protected VDB initViewBinding(LayoutInflater inflater, @Nullable ViewGroup container) {
        return DataBindingUtil.inflate(inflater,getLayoutId(), container, false);
    }
    /**
     * 初始化ViewModel