RecommendFragment.java 13 KB
package com.wd.display.ui.fragment;

import java.util.List;

import org.jetbrains.annotations.NotNull;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.SimpleItemAnimator;

import com.github.mminng.itemvisibility.listener.ItemStateChangeListener;
import com.people.common.base.BaseLazyFragment;
import com.people.common.constant.IntentConstants;
import com.people.common.decoration.Decoration;
import com.people.component.R;
import com.people.component.comp.layoutdata.Page;
import com.people.component.comp.layoutmanager.BaseAdapter;
import com.people.component.comp.layoutmanager.ILayoutRender;
import com.people.component.comp.layoutmanager.ItemLayoutManager;
import com.people.component.comp.layoutmanager.LayoutAdapter;
import com.people.component.ui.commonpage.TemplatePageDataFetcher;
import com.people.component.ui.commonpage.TemplatePageDataListener;
import com.people.component.ui.commonpage.TemplatePageDataViewModel;
import com.people.component.ui.widget.nested.ColumnRecyclerView;
import com.people.component.utils.CompentLogicUtil;
import com.people.entity.RecListBean;
import com.people.entity.custom.MenuBean;
import com.people.entity.custom.comp.CompDataSourceBean;
import com.people.entity.custom.comp.PageBean;
import com.people.entity.livedate.EventMessage;
import com.people.livedate.EventConstants;
import com.people.livedate.base.LiveDataBus;
import com.wondertek.wheat.ability.tools.SafeBundleUtil;
import com.wondertek.wheat.ability.tools.StringUtils;

/**
 * @Description: 信息流页面一个模板(相关推荐列表 , 便于使用组件和稿件资源)
 * @Author: Li Yubing
 * @Email: liyubing@wondert.com.cn
 * @CreateDate: 2023/8/14 18:46
 * @Version: 1.0
 * 数据请求:{@link TemplatePageDataFetcher}
 */
public class RecommendFragment extends BaseLazyFragment {
    private static final String TAG = "RecommendFragment";

    private ILayoutRender layoutRender;

    /**
     * 总页面容器
     */
    private FrameLayout mFrameLayout;

    /**
     * 信息流页面容器
     */
    private FrameLayout contentFrameLayout;

    /**
     * recyclerview背景
     */
    protected View viewBg;

    /**
     * 当前页数据
     */
    private PageBean mPageBean;
    private Page mPage;
    /**
     * 页面是否已经有数据显示
     */
    private boolean isHashLoadDataInPage = false;

    /**
     * 内容存储器
     */
    private ColumnRecyclerView mRecyclerView;

    private int pageNum = 1;

    private MenuBean menuBean;

    private String channelId;

    TemplatePageDataViewModel templatePageDataViewModel;

    /**
     * 来源类型
     */
    private String dataSourceType = "";

    /**
     * 推荐列表数据
     */
    private RecListBean recListBean;
    /**
     * 获取Fragment实例对象
     *
     * @param menuBean 数据id
     * @return Fragment实例
     */
    public static RecommendFragment newInstance(MenuBean menuBean) {
        RecommendFragment fragment = new RecommendFragment();
        Bundle bundle = new Bundle();
        bundle.putSerializable(IntentConstants.PAGE_INFOR_DATA, menuBean);
        fragment.setArguments(bundle);
        return fragment;
    }

    /**
     * 获取Fragment实例对象
     *
     * @param menuBean 数据id
     * @return Fragment实例
     */
    public static RecommendFragment newInstance(MenuBean menuBean, RecListBean recListBean) {
        RecommendFragment fragment = new RecommendFragment();
        Bundle bundle = new Bundle();
        bundle.putSerializable(IntentConstants.PAGE_INFOR_DATA, menuBean);
        bundle.putSerializable(IntentConstants.OPER_DATA_LIST, recListBean);
        fragment.setArguments(bundle);
        return fragment;
    }

    /**
     * 获取Fragment实例对象
     *
     * @param menuBean 数据id
     * @return Fragment实例
     */
    public static RecommendFragment newInstance(MenuBean menuBean, int topMarginInt, String channelId) {
        RecommendFragment fragment = new RecommendFragment();
        Bundle bundle = new Bundle();
        bundle.putSerializable(IntentConstants.PAGE_INFOR_DATA, menuBean);
        bundle.putInt(IntentConstants.PARAM_TOPMARGININT, topMarginInt);
        bundle.putString(IntentConstants.PARAM_CHANNEL_ID, channelId);
        fragment.setArguments(bundle);
        return fragment;
    }


    @Override
    protected void perCreate() {
        super.perCreate();
        //首页启动速度用户,使用java布局
        setIsjava(true);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        int topMarginInt = SafeBundleUtil.getInt(getArguments(), IntentConstants.PARAM_TOPMARGININT, 0);
        if (topMarginInt != 0) {
            mFrameLayout.setPadding(0, topMarginInt, 0, 0);
        }
    }

    @Override
    protected String getLogTag() {
        return TAG;
    }

    @Override
    protected int getLayout() {
        return 0;
    }

    @Override
    protected void initView(View rootView) {
        initViewModel();
        registerBus();
    }
    /**
     * 注册LiveBus
     */
    private void registerBus() {
        //接受关注事件
        LiveDataBus.getInstance().with(EventConstants.FRESH_FOLLOW_CREATOR_EVENT, EventMessage.class).observe(getViewLifecycleOwner(), mEventMessage -> {
            if (mEventMessage == null) {
                return;
            }
            if (null != mRecyclerView && null != mRecyclerView.getAdapter()) {
                // 同步关注信息
                List<ItemLayoutManager> layoutManagers = layoutRender.getAllSectionLayoutManager();
                CompentLogicUtil.updateUserFollowInforLayout(mEventMessage, layoutManagers);
            }
        });

        //接受点赞事件
        LiveDataBus.getInstance().with(EventConstants.FRESH_ZAN_CREATOR_EVENT, EventMessage.class).observe(getViewLifecycleOwner(), mEventMessage -> {
            if (mEventMessage == null) {
                return;
            }
            if (null != mRecyclerView && null != mRecyclerView.getAdapter()) {
                // 同步关注信息
                List<ItemLayoutManager> layoutManagers = layoutRender.getAllSectionLayoutManager();
                CompentLogicUtil.updateUserZanInforLayout(mEventMessage, layoutManagers);
            }
        });

        //接受预约状态事件
        LiveDataBus.getInstance().with(EventConstants.FRESH_APPONINTMENT_STATUS_EVENT, EventMessage.class).observe(getViewLifecycleOwner(), mEventMessage -> {
            if (mEventMessage == null) {
                return;
            }
            if (null != mRecyclerView && null != mRecyclerView.getAdapter()) {
                // 同步关注信息
                List<ItemLayoutManager> layoutManagers = layoutRender.getAllSectionLayoutManager();
                CompentLogicUtil.updateCompLiveAppointStatus(mEventMessage, layoutManagers);
            }
        });

    }

    private void initViewModel() {
        templatePageDataViewModel = getViewModelThis(TemplatePageDataViewModel.class);
        templatePageDataViewModel.setChannelId(channelId);
        templatePageDataViewModel.observeTemplatePageDataListener(this, new TemplatePageDataListener() {

            @Override
            public void onPageDataSuccess(Page page, PageBean data) {
                mPage = page;
                mPageBean = data;
                isHashLoadDataInPage = true;
                doPageDataSuccess();
            }

            @Override
            public void onGetFailed(int code, String failedMsg) {

            }
        });

    }

    @Override
    protected View getJavaLayout() {
        menuBean = (MenuBean) SafeBundleUtil.getSerializable(getArguments(),
                IntentConstants.PAGE_INFOR_DATA);
        channelId = SafeBundleUtil.getString(getArguments(),
                IntentConstants.PARAM_CHANNEL_ID,"");
        if(menuBean != null){
            dataSourceType = menuBean.dataSourceType;
        }
        if(StringUtils.isEqual(CompDataSourceBean.RECOMMEND_LIST,dataSourceType)){
            recListBean = (RecListBean) SafeBundleUtil.getSerializable(getArguments(),
                    IntentConstants.OPER_DATA_LIST);
        }
        mFrameLayout = new FrameLayout(activity);
        mFrameLayout.setBackgroundColor(0x00FFFFFF);
        FrameLayout subLayout = getSubLayout();
        mFrameLayout.addView(subLayout);

        return mFrameLayout;
    }

    private FrameLayout getSubLayout() {
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
        contentFrameLayout = new FrameLayout(activity);
        contentFrameLayout.setLayoutParams(params);
        viewBg = new View(activity);
        viewBg.setAlpha(0);
        viewBg.setBackgroundColor(ContextCompat.getColor(activity, R.color.res_color_common_C8));
        contentFrameLayout.addView(viewBg);
        mRecyclerView = (ColumnRecyclerView) LayoutInflater.from(activity).
                inflate(R.layout.page_layout_columnrecyclerview, null);
        contentFrameLayout.addView(mRecyclerView);
        return contentFrameLayout;
    }

    /**
     * 处理数据获取成功后续逻辑
     */
    private void doPageDataSuccess() {

        if (mPage == null) {
            return;
        }
        mPage.setFragment(RecommendFragment.this);

        initCommonRecyclerView();

        if (layoutRender != null) {
            layoutRender.renderPage(mPage, true);
            layoutRender.notifyDataSetChanged();
        }

    }

    private void initCommonRecyclerView() {

        mRecyclerView.setNestedScrollingEnabled(true);

        if (layoutRender != null) {
            layoutRender.releaseLayoutManagers();
        }
        layoutRender = new LayoutAdapter();
        // 组件内的滚动事件
        mRecyclerView.setItemViewCacheSize(4);
        mRecyclerView.setDrawingCacheEnabled(true);
        mRecyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
        GridLayoutManager layoutManager = new GridLayoutManager(getContext(), 12, RecyclerView.VERTICAL, false);
        //  mRecyclerView.setOnAllowEnableLoadMoreListener(onAllowEnableLoadMoreListener);
        layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                if (layoutRender.getAllSectionLayoutManager().size() == 0) {
                    return 0;
                }
                return 12 / layoutRender.getAllSectionLayoutManager().get(position).getItemSpan();
            }
        });
        //  mRecyclerView.setItemAnimator(new NoAlphaItemAnimator());
        // 关闭动画,防止刷新闪烁
        RecyclerView.ItemAnimator animator = mRecyclerView.getItemAnimator();
        if (animator instanceof SimpleItemAnimator) {
            ((SimpleItemAnimator) animator).setSupportsChangeAnimations(false);
        }

        RecyclerView.RecycledViewPool pool = new RecyclerView.RecycledViewPool();
        pool.setMaxRecycledViews(0, 10);
        mRecyclerView.setRecycledViewPool(pool);
        mRecyclerView.getItemAnimator().setChangeDuration(0);

        mRecyclerView.setLayoutManager(layoutManager);
        mRecyclerView.addItemDecoration(new Decoration());
        mRecyclerView.setAdapter((BaseAdapter) layoutRender);

        mRecyclerView.openGlobalLayout();
        mRecyclerView.itemVisibilityHelper.attachToRecyclerView(mRecyclerView, R.id.player_container, true, RecyclerView.VERTICAL, false, new ItemStateChangeListener() {

            @Override
            public void onActivateItem(@NotNull View view, int position) {
                super.onActivateItem(view, position);
                ((LayoutAdapter) layoutRender).onItemVisible(position);
            }

            @Override
            public void onDeactivateItem(@NotNull View view, int position) {
                super.onDeactivateItem(view, position);
                ((LayoutAdapter) layoutRender).onItemInVisible(position);
            }

            @Override
            public void onPauseItem(@NotNull View view, int position) {
                super.onPauseItem(view, position);
                ((LayoutAdapter) layoutRender).onItemInVisible(position);
            }

            @Override
            public void onResumeItem(@NotNull View view, int position) {
                super.onResumeItem(view, position);
                ((LayoutAdapter) layoutRender).onItemVisible(position);
            }
        });
    }


    @Override
    protected void lazyLoadData() {
        refreshData();
    }

    /**
     * 刷新请求数据
     */
    private void refreshData() {
        pageNum = 1;
        templatePageDataViewModel.sendPageDataRequest(getContext(),pageNum,20,menuBean,recListBean);
    }
}