GitHub--FoldAbleLayout可折叠组件学习

来自Github,地址:

https://github.com/worldline/FoldableLayout

效果图:

使用(以配合RecycleView一起使用为例):

先上各个布局文件:

主页面创建RecycleView

<android.support.v7.widget.RecyclerView
        android:id="@+id/rv_ShouyeFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:clipChildren="false"
        android:clipToPadding="false"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin">

    </android.support.v7.widget.RecyclerView>

list_item_cover:

<?xml version="1.0" encoding="utf-8"?>

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="100dp">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:textStyle="bold"
            android:textColor="@color/colorPrimary"
            android:gravity="center"
            android:id="@+id/tv_cover"
            android:layout_width="100dp"
            android:layout_height="match_parent" />

        <ImageView
            android:layout_toRightOf="@+id/tv_cover"
            android:scaleType="centerCrop"
            android:id="@+id/iv_cover"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

        <Button
            android:id="@+id/btn_cover"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"
            android:text="Share"
            android:textColor="@android:color/white"
            android:backgroundTint="@color/colorAccent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </RelativeLayout>

</android.support.v7.widget.CardView>

list_item_detail:

<?xml version="1.0" encoding="utf-8"?>

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="200dp">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/holo_green_dark">

        <ImageView
            android:id="@+id/iv_detail"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="centerCrop"/>

    </RelativeLayout>

</android.support.v7.widget.CardView>

1-创建FoldableLayout

FoldableLayout mFoldableLayout = new FoldableLayout(context);

2.设置封面、详情

foldableLayout.setupViews(R.layout.list_item_cover, R.layout.list_item_detail, R.dimen.card_cover_height, itemView.getContext());

第一个参数指折叠图布局,第二个是展开图布局,第三个是折叠时的高度,这个高度一定和折叠状态下的高度一致.

3-给RecycleView设置自定义Adapter,并把FoldAbleLayout添加到自定义Adapter中,控制每一个列表项的效果

/*
自定义ShouyeFragmentAdapter
*/
public class ShouyeFragmentAdapter
        extends
            RecyclerView.Adapter<ShouyeFragmentAdapter.MyViewHolder> {

    private String[] mDataList; //文字数组
    private int[] mImageList;   //要显示的图片
    private Map<Integer, Boolean> mFoldStates = new HashMap<>();  //用于判断状态是否折叠
    private Context mContext;

    public ShouyeFragmentAdapter(String[] mDataList, int[] mImageList,
            Context mContext) {
        this.mDataList = mDataList;
        this.mContext = mContext;
        this.mImageList = mImageList;
    }

    @Override
    public ShouyeFragmentAdapter.MyViewHolder onCreateViewHolder(
            ViewGroup parent, int viewType) {
        return new MyViewHolder(new FoldableLayout(parent.getContext()));
    }

    @Override
    public void onBindViewHolder(
            final ShouyeFragmentAdapter.MyViewHolder holder, int position) {

    //绑定数据holder.iv_cover.setImageResource(mImageList[position]);
        holder.iv_detail.setImageResource(mImageList[position]);

        holder.tv_cover.setText(mDataList[position]);
        // 绑定状态
        if (mFoldStates.containsKey(position)) {
            if (mFoldStates.get(position) == Boolean.TRUE) {
                if (!holder.foldableLayout.isFolded()) {
                    // 如果不是折叠状态,就将其折叠
                    holder.foldableLayout.foldWithoutAnimation();
                }
            } else if (mFoldStates.get(position) == Boolean.FALSE) {
                // 如果是折叠状态就将其展开
                if (holder.foldableLayout.isFolded()) {
                    holder.foldableLayout.unfoldWithoutAnimation();
                }
            }
        } else {
            holder.foldableLayout.foldWithoutAnimation();
        }

//设置内部按钮监听
        holder.btn_cover.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(mContext, "btn_cover Clicked",
                        Toast.LENGTH_SHORT).show();
            }
        });

//设置点击时带有动画效果的展开和折叠
        holder.foldableLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (holder.foldableLayout.isFolded()) {
                    holder.foldableLayout.unfoldWithAnimation();
                } else {
                    holder.foldableLayout.foldWithAnimation();
                }
            }
        });

        holder.foldableLayout
                .setFoldListener(new FoldableLayout.FoldListener() {
                    @Override
                    public void onUnFoldStart() {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                            holder.foldableLayout.setElevation(5);
                        }
                    }

                    @Override
                    public void onUnFoldEnd() {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                            holder.foldableLayout.setElevation(0);
                        }
                        mFoldStates.put(holder.getAdapterPosition(), false);
                    }

                    @Override
                    public void onFoldStart() {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                            holder.foldableLayout.setElevation(5);
                        }
                    }

                    @Override
                    public void onFoldEnd() {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                            holder.foldableLayout.setElevation(0);
                        }
                        mFoldStates.put(holder.getAdapterPosition(), true);
                    }
                });

    }

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

    public class MyViewHolder extends RecyclerView.ViewHolder {

        protected FoldableLayout foldableLayout;
        protected TextView tv_cover;
        protected ImageView iv_cover;
        protected ImageView iv_detail;
        protected Button btn_cover;

        public MyViewHolder(FoldableLayout foldableLayoutView) {
            super(foldableLayoutView);
            foldableLayout = foldableLayoutView;
            foldableLayout.setupViews(R.layout.list_item_cover,
                    R.layout.list_item_details, R.dimen.card_cover_height,
                    itemView.getContext());
            tv_cover = (TextView) foldableLayoutView
                    .findViewById(R.id.tv_cover);
            btn_cover = (Button) foldableLayoutView
                    .findViewById(R.id.btn_cover);
            iv_cover = (ImageView) foldableLayoutView
                    .findViewById(R.id.iv_cover);
            iv_detail = (ImageView) foldableLayoutView
                    .findViewById(R.id.iv_detail);

        }
    }
}

4-在界面里使用(给RecycleView添加适配器)

private void initRecycleView() {
        rv_ShouyeFragment = (RecyclerView) view
                .findViewById(R.id.rv_ShouyeFragment);
        rv_ShouyeFragment
                .setLayoutManager(new LinearLayoutManager(getContext()));
                //CANTEENNAME,CANTEENIMAGE,是要显示在列表的数据,图片
        mAdapter = new ShouyeFragmentAdapter(CANTEENNAME,CANTEENIMAGE,getContext());

//给子列表项间添加间隙
        rv_ShouyeFragment.addItemDecoration(new RecyclerView.ItemDecoration() {
            @Override
            public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
                super.getItemOffsets(outRect, view, parent, state);
                outRect.bottom = getResources().getDimensionPixelSize(R.dimen.activity_vertical_margin);
            }
        });

        rv_ShouyeFragment.setAdapter(mAdapter);
    }

5-发现问题:

快速点击第一项或最后一项在列表项从展开状态到折叠状态时会导致程序崩溃,但Logcat未报错。

图片加载缓慢,写的时候没考虑内存泄漏等问题导致程序在这个界面卡顿不流畅,动画无法正常显示等问题。
时间: 2024-11-08 18:58:18

GitHub--FoldAbleLayout可折叠组件学习的相关文章

GitHub--FoldAbleLayout可折叠组件学习(二)

接上文: GitHub–FoldAbleLayout可折叠组件学习(一) 遗留问题 同样是使用Picasso,图片存于drawable文件夹中,RecycleView的界面滑动十分卡顿.查看Github作者的例子,图片存在assets文件夹中存放图片,通过Picasso传入图片的路径就可以很流畅的加载出图片. 我分别实验了两种:图片放在drawable文件夹下和asset文件夹下. Drawable文件夹下,AS内存使用情况: 显示内存消耗过多,程序运行卡顿. 在Asset文件夹下,AS的内存使

angular的GitHub Repository Directive Example学习

angular的GitHub Repository Directive Example学习 运行下面代码 <!DOCTYPE html><html ng-app="myApp"><head>     <meta charset="utf-8" />     <title>GitHub Repository Directive Example</title>       <script sr

Android组件学习之ExpandableListView

一个简单的小例子: 可以展开的ListView,和Listview差不多,只是设置的Adapter不同.常用的Adapter有BaseExpandableListAdapter.SimpleExpandableListAdapter.SimpleCursorTreeAdapter 布局如下:(布局中我设置了android:groupIndicator,不知道为什么不起作用.另外,android:dividerHeight这个属性是组对象和子节点共用的.如果要定义比较复杂的组视图及子节点视图,还是

Indy10 控件的使用(2)TidTCpServer组件学习

Indy10 控件的使用(2)TidTCpServer组件学习 (2012-05-18 15:16:53) 转载▼ 标签: indy10 lazarus idtcpserver 分类: Indy10 以下来自英文原版帮助文件,文桓英语不好,翻译了老半天.有错误的地方见谅,别骂我. TIdTCPServer = class(TIdComponent) Description TIdTCPServer is a TIdComponent descendant that encapsulates a

GitHub 上值得关注学习的 iOS 开源项目

特此声明,本文转自知乎,原文地址:http://www.zhihu.com/question/22914651,本人只是复制.粘贴. 1. ReactiveCocoa:ReactiveCocoa/ReactiveCocoa · GitHub:GitHub自家的函数式响应式编程范式的Objective-C实现,名字听着很高大上,学习曲线确实也比较陡,但是绝对会改变你对iOS编程的认知,首推之.2. Mantle:Mantle/Mantle · GitHub:又是GitHub自家的产物,轻量级建模的

强烈推荐 GitHub 上值得前端学习的开源实战项目

强烈推荐 GitHub 上值得前端学习的开源实战项目. Vue.js vue-element-admin 是一个后台前端解决方案,它基于和 element-ui 实现 基于 iView 的 Vue 2.0 管理系统模板 基于 vue2 + vuex 构建一个具有 45 个页面的大型单页面应用 基于 vue + element-ui 的后台管理系统 基于Vue.js + Element UI 的后台管理系统解决方案 基于 Vue(2.5) + vuex + vue-router + vue-axi

Go组件学习——cron定时器

1 前言 转到Go已经将近三个月,写业务代码又找到了属于Go的条件反射了. 后置声明和多参数返回这些Go风格代码写起来也不会那么蹩脚,甚至还有点小适应~ 反而,前几天在写Java的时候,发现Java怎么启动这么慢,Java怎么能够容忍这些用不到的代码还理直气壮的躺在那……等等,这些话在哪听过类似的??? “Go为什么要后置声明,多别扭啊” “Go里面为啥要定义这么多的struct,看的头晕” …… 其实,没有最好的语言,只有最适合的. 前面<Go语言学习>系列主要介绍了一些Go的基础知识和相较

react native组件学习(四)

PullToRefreshViewAndroid学习 PullToRefreshViewAndroid是一个视图,可以放置单个可滚动子视图,当子视图的竖直方向偏移(scrollY)为0时,将其下拉可以触发一个onRefresh事件. 在学习PullToRefreshViewAndroid组件之前,如果没有一定的基础,建议先阅读前面的文章,因为,这里我在之前学习ScrollView的基础上,添加PullToRefreshViewAndroid功能.当前的代码如下: 'use strict'; va

Android 四大组件学习之BroadcastReceiver一

本节课学习四大组件最后一个, 广播接受者. 顾名思义广播接受者就是接受广播呗.比如在现实社会中,以前每个人家都有一台收音机,这可就可以去接受广播发出来的消息.大家都知道,程序世界也是参照的显示生活设计出来的,那在Android系统中也引入了广播这个概念.那在Android系统中广播有什么作用呢? 举个例子:比如你正在玩游戏或者看视频突然手机电量过低,这时候就会弹出一个框,提醒您手机电量过低,请充电的提示.其实电量改变就是一种广播类型,当电量过低时,系统就会发生一条广播,这时候正在运行的程序就会收