LayoutAdapter.java 7.03 KB

/*
 * Copyright (c) People Technologies Co., Ltd. 2019-2022. All rights reserved.
 */

package com.wd.display.comp.layoutmanager;

import java.util.ArrayList;
import java.util.List;

import android.view.View;

import androidx.annotation.NonNull;

import com.people.component.comp.layoutdata.AbsPage;
import com.people.component.comp.layoutdata.AbsSection;
import com.people.component.comp.layoutdata.Page;
import com.people.entity.custom.BaseLineBean;
import com.people.entity.custom.comp.PageBean;

public class LayoutAdapter extends BaseAdapter implements ILayoutRender, ILayoutManagerScrollListener {

    /**
     * 监听内部rv滑动
     */
    ILayoutManagerScrollListener layoutManagerScrollListener;

    private Indexer indexer;

    public LayoutAdapter() {
        indexer = new Indexer();
    }

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

    @Override
    public void itemRangeRemoved(int startIndex, int count) {
        List<ItemLayoutManager> itemLayoutManagers = indexer.getItemLayoutManagers();
        List<ItemLayoutManager> list = new ArrayList<>();
        for(int i = 0 ; i < count ; i++){
            int position = startIndex + i;
            list.add(itemLayoutManagers.get(position));
        }
        itemLayoutManagers.removeAll(list);
        notifyItemRangeRemoved(startIndex,count);
    }

    @Override
    public void itemRemoved(int positon) {
        List<ItemLayoutManager> itemLayoutManagers = indexer.getItemLayoutManagers();
        if (positon < itemLayoutManagers.size()) {
            itemLayoutManagers.remove(positon);
            notifyItemRemoved(positon);
        }
    }

    @Override
    public void itemRemovedByLayoutManagerHashCode(int hashCode) {
        List<ItemLayoutManager> itemLayoutManagers = indexer.getItemLayoutManagers();
        int size = itemLayoutManagers.size();
        for (int a = 0; a < size; a++) {
            ItemLayoutManager layoutManager = itemLayoutManagers.get(a);
            if (layoutManager.hashCode() == hashCode) {
                itemLayoutManagers.remove(a);
                notifyItemRemoved(a);
                break;
            }

        }
    }

    @Override
    public void itemRangeInserted(int startIndex, int count) {

    }

    @Override
    public void itemRangeChanged(int startIndex, int count) {
        indexer.updateIndexer(startIndex, count);
    }

    @Override
    public void renderPage(AbsPage page, boolean isRefresh) {

        if(isRefresh){
            indexer.updateItemLayoutManagers(page);
        }else {
            indexer.updateItemLayoutManagersByGroup(page,isRefresh);
        }

    }

    /**
     * 释放所有layoutManger
     */
    @Override
    public void releaseLayoutManagers() {
        List<ItemLayoutManager> itemLayoutManagers = indexer.getItemLayoutManagers();
        for (ItemLayoutManager layoutManager : itemLayoutManagers) {
            if (layoutManager != null) {
                layoutManager.onPause();
            }
        }
        itemLayoutManagers.clear();
    }

    @Override
    public void addBaseLine(Page mPage) {
        if (mPage.getSpecialGroup() != null) {
            // 特殊样式,这里不加底线
            return;
        }
        if (mPage instanceof Page) {
            PageBean pageBean = ((Page) mPage).getPage();
            if (pageBean != null && pageBean.isShowBaseline()) {
                BaseLineBean baseLineBean = new BaseLineBean();
                baseLineBean.setLineHint(pageBean.getBaselineHint());
                baseLineBean.setTextColor(pageBean.getBaselineColor());
                indexer.addBaseLine(baseLineBean);
            }
        }
    }

    @Override
    public List<ItemLayoutManager> getAllSectionLayoutManager() {
        return indexer.getItemLayoutManagers();
    }

    @Override
    public void sectionItemUpdated(@NonNull AbsSection section) {
        if (section.getCompBean() == null) {
            return;
        }
        if (section.getCompBean().getDisplayItemBeans() == null) {
            return;
        }
        indexer.addItemLayoutManager(section);
        int size = section.getCompBean().getDisplayItemBeans().size();
        int groupStart = section.getParent().getStartPosition();
        int sectionPosition = section.getPosition();
        // section在recyclerView里的起始下标
        int start = groupStart + sectionPosition;
        notifyItemRangeInserted(start, size);
        // 需要更新各个layout的itemIndex
        indexer.updateIndexer(start, size);

    }

    @Override
    protected ItemLayoutManager layoutManagerAtPosition(int position) {
        if (position < 0) {
            return null;
        }
        List<ItemLayoutManager> itemLayoutManagers = indexer.getItemLayoutManagers();
        if (position >= itemLayoutManagers.size()) {
            return null;
        }
        return itemLayoutManagers.get(position);
    }

    public Indexer getIndex() {
        return indexer;
    }

    /**
     * 暂停
     *
     * @param position 位置索引
     */
    public void pause(int position) {
        ItemLayoutManager itemLayoutManager = layoutManagerAtPosition(position);
        if (itemLayoutManager != null) {
            itemLayoutManager.onPause();
        }
    }

    /**
     * 销毁
     *
     * @param position 位置索引
     */
    public void destory(int position) {
        ItemLayoutManager itemLayoutManager = layoutManagerAtPosition(position);
        if (itemLayoutManager != null) {
            itemLayoutManager.onDestory();
        }
    }

    /**
     * 恢复
     *
     * @param position 位置索引
     */
    public void resume(int position) {
        ItemLayoutManager itemLayoutManager = layoutManagerAtPosition(position);
        if (itemLayoutManager != null) {
            itemLayoutManager.onResume();
        }
    }

    /**
     * item出现在屏幕内(可见)
     *
     * @param position 位置索引
     */
    public void onItemVisible(int position) {
        ItemLayoutManager itemLayoutManager = layoutManagerAtPosition(position);
        if (itemLayoutManager != null) {
            itemLayoutManager.onVisible();
        }
    }



    /**
     * item滑出屏幕
     *
     * @param position
     */
    public void onItemInVisible(int position) {
        ItemLayoutManager itemLayoutManager = layoutManagerAtPosition(position);
        if (itemLayoutManager != null) {
            itemLayoutManager.onInvisible();
        }
    }

    /**
     * 设置内部rv滚动监听
     */
    public void setLayoutManagerScrollListener(ILayoutManagerScrollListener layoutManagerScrollListener) {
        this.layoutManagerScrollListener = layoutManagerScrollListener;
    }


    @Override
    public void onScrolled(View view, int dx, int dy) {
        if (null != layoutManagerScrollListener) {
            layoutManagerScrollListener.onScrolled(view, dx, dy);
        }
    }

    @Override
    public void onScrollStateChanged(View view, int newState) {
        if (null != layoutManagerScrollListener) {
            layoutManagerScrollListener.onScrollStateChanged(view, newState);
        }
    }
}