张钢
2024-09-02 63608b5dca9eebb6fa2cb1a8652b395f1d910c3e
app/src/main/java/com/application/zhangshi_app_android/ui/function/FamilyMemorabiliaActivity.java
@@ -1,41 +1,34 @@
package com.application.zhangshi_app_android.ui.function;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.drawable.ColorDrawable;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.PopupWindow;
import android.widget.TextView;
import androidx.annotation.IdRes;
import androidx.annotation.LayoutRes;
import androidx.appcompat.app.AlertDialog;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.lifecycle.Observer;
import com.android.app_base.base.BaseConfig;
import com.android.app_base.base.dialog.BaseDialog;
import com.android.app_base.base.dialog.UIDialog;
import com.android.app_base.base.view.BaseActivity;
import com.android.app_base.manager.AppManager;
import com.android.app_base.utils.ScreenSizeUtils;
import com.android.app_base.utils.Utils;
import com.android.app_base.utils.rxbus.RxBus;
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.FamilyMemorabiliaRvAdapter;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaBean;
import com.application.zhangshi_app_android.bean.MeetingBean;
import com.application.zhangshi_app_android.databinding.ActivityFamilyMemorabiliaBinding;
import com.application.zhangshi_app_android.databinding.PopSearchBinding;
import com.application.zhangshi_app_android.ui.DLBaseActivity;
import com.hjq.bar.TitleBar;
import com.github.gzuliyujiang.wheelpicker.DatePicker;
import com.github.gzuliyujiang.wheelpicker.contract.OnDatePickedListener;
import java.util.List;
/**
@@ -43,12 +36,12 @@
 * @date 2023.03.18. 10:00
 * @desc 家大事记 Activity
 */
public class FamilyMemorabiliaActivity extends DLBaseActivity<ActivityFamilyMemorabiliaBinding,FamilyMemorabiliaActivityViewModel> {
public class FamilyMemorabiliaActivity extends DLBaseActivity<ActivityFamilyMemorabiliaBinding,FamilyMemorabiliaActivityViewModel>{
    FamilyMemorabiliaRvAdapter adapter;
    private PopupWindow mOperatePopupWindow;
    private PopupWindow mSearchPopupWindow;
    private PopSearchBinding mSearchPopBinding;
    private boolean isSearchLayoutVisible;
    private int dateType; //0:开始时间 1:结束时间
    @Override
    public int getLayoutId() {
@@ -67,71 +60,167 @@
    @Override
    public void initView() {
        //下拉刷新布局
        binding.refreshLayout.setEnableRefresh(false);
        binding.refreshLayout.setEnableLoadMore(true);
        binding.refreshLayout.setEnableOverScrollDrag(true);
        binding.refreshLayout.setOnLoadMoreListener(refreshLayout -> {
            viewModel.getMoreFamilyMemorabilia();
        });
        //recyclerView适配器
        adapter = new FamilyMemorabiliaRvAdapter(this,viewModel);
        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);
        mSearchPopBinding = DataBindingUtil.inflate(LayoutInflater.from(this), R.layout.pop_search, null, false);
        mSearchPopBinding.setViewModel(viewModel);
        mSearchPopupWindow = initPopUpWindow(mSearchPopBinding.getRoot());
        //右上角操作弹窗
        mOperatePopupWindow = initPopUpWindow(View.inflate(this,R.layout.pop_operate,null));
        setOnClickListener(
                mOperatePopupWindow.getContentView().findViewById(R.id.tv_add),
                mOperatePopupWindow.getContentView().findViewById(R.id.tv_select),
                mOperatePopupWindow.getContentView().findViewById(R.id.tv_from_new_to_old),
                mOperatePopupWindow.getContentView().findViewById(R.id.tv_from_old_to_new),
                mOperatePopupWindow.getContentView().findViewById(R.id.tv_own_top)
        );
        //点击放大镜按钮显示出搜索框
        binding.ivSearchDefault.setOnClickListener(v -> {
            binding.layoutSearch.setVisibility(View.VISIBLE);
            binding.layoutDefault.setVisibility(View.GONE);
        });
        //点击搜索框菜单下拉出 搜索参数
        binding.ivSearchType.setOnClickListener(v -> {
            mSearchPopupWindow.setWidth(binding.layoutSearch.getMeasuredWidth());
            mSearchPopupWindow.showAsDropDown(binding.layoutSearch,0,0);
        });
        binding.etSearch.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if ((actionId == EditorInfo.IME_ACTION_UNSPECIFIED || actionId == EditorInfo.IME_ACTION_SEARCH)
                        && event != null) {
                    viewModel.getFamilyMemorabilia();
                    binding.layoutSearch.setVisibility(View.GONE);
                    binding.layoutDefault.setVisibility(View.VISIBLE);
                    binding.tvTitle.setText("搜索结果");
                    hideSoftKeyboard();
                    return true;
                }
                return false;
            if (!isSearchLayoutVisible){
                binding.layoutSearchParameter.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
                int targetHeight = binding.layoutSearchParameter.getMeasuredHeight();
                Utils.pullCollapse(binding.containerSearchParameter,0,targetHeight);
                isSearchLayoutVisible = true;
            }
        });
        //搜索参数layout添加空点击事件,防止点击它内部view时它后面的recycler还能响应点击事件
        binding.layoutSearchParameter.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            }
        });
        //点击搜索按钮进行搜索
        binding.ivSearch.setOnClickListener(v -> {
            viewModel.getFamilyMemorabilia();
            binding.layoutSearch.setVisibility(View.GONE);
            binding.layoutDefault.setVisibility(View.VISIBLE);
            binding.tvTitle.setText("搜索结果");
            mSearchPopupWindow.dismiss();
            hideSoftKeyboard();
        });
        //点击添加按钮跳转到创建家大事记页面
        binding.fabAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AppManager.getAppManager().startActivity(new Intent(getSelfActivity(),CreateFamilyProjectActivity.class).putExtra(BaseConfig.EXTRA_TYPE,1));
                AppManager.getAppManager().startActivity(new Intent(getSelfActivity(), FamilyMemorabiliaDetailActivity.class).putExtra(BaseConfig.EXTRA_TYPE,1));
            }
        });
        binding.etStartTime.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }
        setOnClickListener(
                mSearchPopupWindow.getContentView().findViewById(R.id.iv_clear_person),
                mSearchPopupWindow.getContentView().findViewById(R.id.iv_clear_place),
                mSearchPopupWindow.getContentView().findViewById(R.id.iv_clear_time),
                mSearchPopupWindow.getContentView().findViewById(R.id.iv_clear_title),
                mOperatePopupWindow.getContentView().findViewById(R.id.tv_add),
                mOperatePopupWindow.getContentView().findViewById(R.id.tv_select),
                mOperatePopupWindow.getContentView().findViewById(R.id.tv_from_new_to_old),
                mOperatePopupWindow.getContentView().findViewById(R.id.tv_from_old_to_new)
                );
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if (!TextUtils.isEmpty(s)) {
                    binding.ivTimeClear.setVisibility(View.VISIBLE);
                } else {
                    if (TextUtils.isEmpty(binding.etEndTime.getText().toString())) {
                        binding.ivTimeClear.setVisibility(View.INVISIBLE);
                    }
                }
            }
            @Override
            public void afterTextChanged(Editable s) {
            }
        });
        binding.etEndTime.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if (!TextUtils.isEmpty(s)) {
                    binding.ivTimeClear.setVisibility(View.VISIBLE);
                } else {
                    if (TextUtils.isEmpty(binding.etStartTime.getText().toString())) {
                        binding.ivTimeClear.setVisibility(View.INVISIBLE);
                    }
                }            }
            @Override
            public void afterTextChanged(Editable s) {
            }
        });
        binding.etStartTime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                hideSoftKeyboard();
                DatePicker datePicker = getDatePicker();
                datePicker.setTitle("请选择开始时间");
                datePicker.setOnDatePickedListener(new OnDatePickedListener() {
                    @Override
                    public void onDatePicked(int year, int month, int day) {
                        //以yyyy-MM-dd的格式显示,月日小于10时前面补0
                        binding.etStartTime.setText(String.format("%d-%02d-%02d", year, month, day));
                        if (binding.etEndTime.getText().toString().isEmpty()){
                            binding.etEndTime.setText(String.format("%d-%02d-%02d", year, month, day));
                        }else {
                            //比较开始时间和结束时间的大小
                            String startTime = binding.etStartTime.getText().toString();
                            String endTime = binding.etEndTime.getText().toString();
                            if (Utils.compareDate(startTime,endTime) > 0){
                                //交换
                                binding.etStartTime.setText(endTime);
                                binding.etEndTime.setText(startTime);
                            }
                        }
                    }
                });
                datePicker.show();
            }
        });
        binding.etEndTime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                hideSoftKeyboard();
                DatePicker datePicker = getDatePicker();
                datePicker.setTitle("请选择结束时间");
                datePicker.setOnDatePickedListener(new OnDatePickedListener() {
                    @Override
                    public void onDatePicked(int year, int month, int day) {
                        binding.etEndTime.setText(String.format("%d-%02d-%02d", year, month, day));
                        if (binding.etStartTime.getText().toString().isEmpty()){
                            binding.etStartTime.setText(String.format("%d-%02d-%02d", year, month, day));
                        }else {
                            //比较开始时间和结束时间的大小
                            String startTime = binding.etStartTime.getText().toString();
                            String endTime = binding.etEndTime.getText().toString();
                            if (Utils.compareDate(startTime,endTime) > 0){
                                //交换
                                binding.etStartTime.setText(endTime);
                                binding.etEndTime.setText(startTime);
                            }
                        }
                    }
                });
                datePicker.show();
            }
        });
        binding.ivTimeClear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                binding.etStartTime.setText("");
                binding.etEndTime.setText("");
            }
        });
    }
    @Override
@@ -140,7 +229,27 @@
    }
    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();
        if (isSearchLayoutVisible){
            if (!Utils.isPointInsideView(x, y, binding.layoutSearchParameter)) {
                Utils.pullCollapse(binding.containerSearchParameter, binding.layoutSearchParameter.getMeasuredHeight(),0);
                isSearchLayoutVisible = false;
                return true;
            }
        }
        return super.dispatchTouchEvent(event);
    }
    @Override
    public void initLiveDataObserve() {
        viewModel.getDataListLiveData().observe(this, new Observer<List<FamilyMemorabiliaBean>>() {
            @Override
            public void onChanged(List<FamilyMemorabiliaBean> familyMemorabiliaBeans) {
                adapter.setData(familyMemorabiliaBeans);
            }
        });
        viewModel.getCheckListLiveData().observe(this, new Observer<List<FamilyMemorabiliaBean>>() {
            @Override
            public void onChanged(List<FamilyMemorabiliaBean> familyMemorabiliaBeans) {
@@ -148,18 +257,18 @@
                    return;
                }
                if (familyMemorabiliaBeans.isEmpty()){
                    viewModel.getOperateTypeLiveData().postValue(1);
                    viewModel.getOperateTypeLiveData().setValue(1);
                }else{
                    viewModel.getOperateTypeLiveData().postValue(2);
                    viewModel.getOperateTypeLiveData().setValue(2);
                }
            }
        });
        viewModel.getDataListLiveData().observe(this, new Observer<List<FamilyMemorabiliaBean>>() {
            @Override
            public void onChanged(List<FamilyMemorabiliaBean> familyMemorabiliaBeans) {
                adapter.setData(familyMemorabiliaBeans);
            }
        });
//        viewModel.getMoreListLiveData().observe(this, new Observer<List<FamilyMemorabiliaBean>>() {
//            @Override
//            public void onChanged(List<FamilyMemorabiliaBean> familyMemorabiliaBeans) {
//                adapter.addData(familyMemorabiliaBeans);
//            }
//        });
        viewModel.getOperateTypeLiveData().observe(this, integer -> {
            if (integer == 0){
                binding.ivOperate.setBackgroundResource(R.drawable.ic_operate);
@@ -175,63 +284,61 @@
                adapter.setCheckable(true);
            }else if (integer == 2){
                binding.ivOperate.setBackgroundResource(R.drawable.ic_delete_white);
                new UIDialog.Builder(this)
                        .setTitle("您确定要删除项目吗")
                        .setContent("项目删除后将无法恢复")
                        .setConfirm("确定")
                        .setCancel("取消")
                        .setListener(new UIDialog.OnListener() {
                            @Override
                            public void onConfirm(BaseDialog dialog) {
                                viewModel.delete();
                            }
                        })
                        .show();
                adapter.setCheckable(true);
                binding.ivOperate.setOnClickListener(v -> {
                    new UIDialog.Builder(this)
                            .setTitle("您确定要删除选中的项目吗")
                            .setContent("项目删除后将无法恢复")
                            .setConfirm("确定")
                            .setCancel("取消")
                            .setListener(new UIDialog.OnListener() {
                                @Override
                                public void onConfirm(BaseDialog dialog) {
                                    viewModel.deleteCheckList();
                                }
                            })
                            .show();
                });
            }
        });
        viewModel.getFinishDeleteListLiveData().observe(this, beans -> {
            for (FamilyMemorabiliaBean bean : beans) {
                adapter.removeItem(bean);
            }
        });
        //观察家大事记数据的变化,有变化包括添加、修改、删除都会发送消息,接收到消息后重新获取数据
        RxBus.getInstance().toObservable(this, FamilyMemorabiliaBean.class)
                .subscribe(bean -> {
                    viewModel.getFamilyMemorabilia();
                });
    }
    private PopupWindow initPopUpWindow(View view){
        PopupWindow popupWindow = new PopupWindow(this);
        // 设置布局文件
        popupWindow.setContentView(view);
        // 为了避免部分机型不显示,需要重新设置一下宽高
        popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
        popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
        // 设置pop透明效果
        popupWindow.setBackgroundDrawable(new ColorDrawable(0x0000));
        // 设置pop出入动画
        popupWindow.setAnimationStyle(com.android.app_base.R.style.pop_add);
        // 设置pop获取焦点,如果为false点击返回按钮会退出当前Activity,如果pop中有Editor的话,focusable必须要为true
        popupWindow.setFocusable(true);
        // 设置pop可点击,为false点击事件无效,默认为true
        popupWindow.setTouchable(true);
        // 设置点击pop外侧消失,默认为false;在focusable为true时点击外侧始终消失
        popupWindow.setOutsideTouchable(false);
        return popupWindow;
    }
    @Override
    protected void dataNull() {
        super.dataNull();
        binding.layoutDataNull.setVisibility(View.VISIBLE);
        binding.recyclerView.setVisibility(View.GONE);
        binding.refreshLayout.setVisibility(View.GONE);
    }
    @Override
    protected void dataFinish() {
        super.dataFinish();
        binding.refreshLayout.finishLoadMore();
    }
    @Override
    protected void hide() {
        super.hide();
        binding.layoutDataNull.setVisibility(View.GONE);
        binding.recyclerView.setVisibility(View.VISIBLE);
        binding.refreshLayout.setVisibility(View.VISIBLE);
        binding.refreshLayout.finishLoadMore();
    }
    @Override
    public void onClick(View v) {
        int id = v.getId();
        if (id == R.id.tv_add){
            AppManager.getAppManager().startActivity(new Intent(this,CreateFamilyProjectActivity.class).putExtra(BaseConfig.EXTRA_TYPE,1));
            AppManager.getAppManager().startActivity(new Intent(this, FamilyMemorabiliaDetailActivity.class).putExtra(BaseConfig.EXTRA_TYPE,1));
        }else if (id == R.id.tv_select){
            viewModel.getOperateTypeLiveData().postValue(1);
            mOperatePopupWindow.dismiss();
@@ -241,6 +348,19 @@
        } else if (id == R.id.tv_from_old_to_new) {
            viewModel.changeOrder(false);
            mOperatePopupWindow.dismiss();
        } else if (id == R.id.tv_own_top) {
            viewModel.ownTop();
            mOperatePopupWindow.dismiss();
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mOperatePopupWindow != null){
            mOperatePopupWindow.dismiss();
        }
    }
}