自定义可以展开的ExpendRecycleView

可展开并收起的RecycleView

思路:

利用RecycleView Adatper的getItemCount实现显示条目的变化,并且使用getItemViewType来实现底部栏与普通栏的变化

代码如下,由于时间比较紧,没有优化,但是功能是可以实现的。

public class ExpendRecycleAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private static final String TAG = "ExpendRecycleAdapter";

    private List<ReportsAndBeans> reportAndBeansList;
    private List<BeanInfo> beanInfoList;
    private static final int DEFAULT_SIZE = 2; //小于等于2时,不用展开,大于2时展开。
    private int currentState;
    public ExpendRecycleAdapter adapter;

    private static final int NO_MORE_TWO = 0x0001;
    public static final int NEED_EXPEND = 0x0002;
    public static final int NEED_COMPRESS = 0x0003;

    public ExpendRecycleAdapter(List<ReportsAndBeans> ReportAndBeans, List<BeanInfo> beanInfos) {
        this.reportAndBeansList = ReportAndBeans;
        this.beanInfoList = beanInfos;

        judgeState(reportAndBeansList.size());

        adapter = this;
    }

    private void judgeState(int dataSize){
        if (dataSize > DEFAULT_SIZE) {
            currentState = NEED_EXPEND;  //默认不展开
        } else
            currentState = NO_MORE_TWO;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        if (viewType == R.layout.report_beans_item) {

            View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.report_beans_item, parent, false);

            NormalViewHolder viewHolder = new NormalViewHolder(itemView);

            return viewHolder;

        } else {

            View footView = LayoutInflater.from(parent.getContext()).inflate(R.layout.report_expend_foot_view, parent, false);

            FootViewHolder viewHolder = new FootViewHolder(footView);

            return viewHolder;
        }

    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        if (holder.getItemViewType() == R.layout.report_beans_item) {
            if (beanInfoList.size() ==0)
                return;
            ((NormalViewHolder) holder).bindData(beanInfoList.get(position), reportAndBeansList.get(position));

        } else {
            FootViewHolder footViewHolder = (FootViewHolder) holder;
            footViewHolder.changeState(currentState);
            footViewHolder.setListener(new FootViewHolder.onBottomClickListener() {
                @Override
                public void onBottomClick() {

                    if (currentState == NEED_EXPEND) {
                        currentState = NEED_COMPRESS;
                        footViewHolder.changeState(currentState);
                    } else {
                        currentState = NEED_EXPEND;
                        footViewHolder.changeState(currentState);
                    }

                    notifyDataSetChanged();
                }
            });
        }
    }

    @Override
    public int getItemCount() {
        int needShowCount;

        if (currentState == NEED_EXPEND) {
            needShowCount = DEFAULT_SIZE + 1; //2加上底部View
        } else if (currentState == NO_MORE_TWO) {
            needShowCount = reportAndBeansList.size();
        } else
            needShowCount = reportAndBeansList.size() + 1; //list大小加上底部view

        return needShowCount;
    }


    @Override
    public int getItemViewType(int position) {
        if (currentState == NO_MORE_TWO) {
            return R.layout.report_beans_item;
        } else if (currentState == NEED_EXPEND) {
            if (position < DEFAULT_SIZE) {
                return R.layout.report_beans_item;
            } else
                return R.layout.report_expend_foot_view;
        }

        if (position < reportAndBeansList.size()) {
            return R.layout.report_beans_item;
        } else
            return R.layout.report_expend_foot_view;
    }

    public static class NormalViewHolder extends RecyclerView.ViewHolder {

        private TextView reportBeansItemName;
        private TextView reportBeansItemRowWeight;


        public NormalViewHolder(View itemView) {
            super(itemView);
            reportBeansItemRowWeight = itemView.findViewById(R.id.report_beans_item_row_weight);
            reportBeansItemName = itemView.findViewById(R.id.report_beans_item_name);
        }

        public void bindData(BeanInfo beanInfo, ReportsAndBeans reportsAndBeans) {
            reportBeansItemRowWeight.setText(String.valueOf(reportsAndBeans.getBeanWight()));
            reportBeansItemName.setText(beanInfo.getBeanName());

        }
    }

    public static class FootViewHolder extends RecyclerView.ViewHolder {

        private TextView mTextView;

        public FootViewHolder(View itemView) {
            super(itemView);
            mTextView = itemView.findViewById(R.id.textView);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.i(TAG, "onClick: ");

                    if (listener != null) {
                        listener.onBottomClick();
                    }
                }
            });
        }

        public void changeState(int currentState) {
            if (currentState == NEED_COMPRESS) {
                mTextView.setText("收起");
            } else
                mTextView.setText("展开");
        }

        private onBottomClickListener listener;

        public interface onBottomClickListener {
            void onBottomClick();
        }


        public void setListener(onBottomClickListener listener) {
            this.listener = listener;
        }
    }


    public void myNotifyDataSetChanged(int dataSize){
        judgeState(dataSize);
        notifyDataSetChanged();
    }

}

转载请注明。

猜你喜欢

转载自blog.csdn.net/crookshanks_/article/details/82313694