登录 立即注册
安币:

安卓巴士 - 安卓开发 - Android开发 - 安卓 - 移动互联网门户

类似Launcher效果的拖拽合并的RecyclerView

[复制链接]
来自: MrlLee 分类: Android精品源码 上传时间: 2016-6-24 16:20:38
Tag:Failed commit latest update
立即下载
收藏

项目介绍:

Permalink
Failed to load latest commit information.
.idea 添加样例 修改bug Jun 12, 2016
app add note Jun 22, 2016
classify add note Jun 22, 2016
gradle/wrapper init Jun 8, 2016
screenshot update Jun 13, 2016
.gitignore 使用 dialog形式 Jun 14, 2016
README.md Update README.md Jun 16, 2016
build.gradle prepare upload jitPack Jun 13, 2016
gradle.properties init Jun 8, 2016
gradlew init Jun 8, 2016
gradlew.bat init Jun 8, 2016
settings.gradle init Jun 8, 2016

游客,如果您要查看本帖隐藏内容请回复

JitPack





ClassifyView



实现原理 ClassifyView包裹这一个RecyclerView,当点击这个RecyclerView会弹出一个Dialog 该Dialog的布局会传入另一个RecyclerView.拖动显示的View 需要使用 WindowManager 添加一个View作为显示。Release0.2.0版本是在一个view下,现在版本需要在不使用时调用 ClassifyView.onDestery()来释放在WindowManager中的资源。



效果如下




这是上个版本效果,最新效果使用dialog来展示次级目录所以不会被FloatingActionButton 遮挡住次级目录,其他效果一样。




image



配置依赖



Step one:Add the JitPack repository to your build file



[Java] 查看源文件 复制代码
allprojects {
        repositories {
            ...
            maven { url \"https://jitpack.io\" }
        }
      }


Step two:Add the dependency



[Java] 查看源文件 复制代码
    dependencies {
            compile 'com.github.AlphaBoom:ClassifyView:0.3.1'
    }



图示可能不是最新版本,最新版本查看Latest release



快速使用




  1. 继承SimpleAdapter



[Java] 查看源文件 复制代码
   public class MyAdapter extends SimpleAdapter {


    public MyAdapter(List> mData) {
        super(mData);
    }


    @Override
    protected ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item,parent,false);
        return new MyAdapter.ViewHolder(view);
    }

    @Override
    public View getView(ViewGroup parent, int mainPosition, int subPosition) {
    //返回的View作为每一个Item的布局
    /*布局内容自定义 例子中如下:
    
    */
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_inner,parent,false);
        return view;
    }

    @Override
    protected void onItemClick(View view, int parentIndex, int index) {
        Toast.makeText(view.getContext(),\"parentIndex: \"+parentIndex+\"\nindex: \"+index,Toast.LENGTH_SHORT).show();
    }

    static class ViewHolder extends SimpleAdapter.ViewHolder {

        public ViewHolder(View itemView) {
            super(itemView);
        }
    }
}


2.找到ClassifyView 并设置Adapter



[Java] 查看源文件 复制代码
mClassifyView = (ClassifyView) view.findViewById(R.id.classify_view);
        List> data = new ArrayList<>();
        for(int i=0;i<30;i++){
            List inner = new ArrayList<>();
            if(i>10) {
                int c = (int) (Math.random() * 15+1);
                for(int j=0;j


3.当界面关闭时调用(清除不用的资源)



[Java] 查看源文件 复制代码
 @Override
    public void onDestroyView() {
        super.onDestroyView();
        mClassifyView.onDestroy();
    }



支持的自定义的属性



ClassifyView attr



属性 说明
MainSpanCount 主层级目录的列数
SubSpanCount 次级层级目录的列数
AnimationDuration 合并动画的时间
SubRatio 次级目录的高度占主层级的高度比例


InsertAbleGridView(显示合并布局的View)


属性 说明
RowCount 行数(默认 2)
ColumnCount 列数(默认 2)
RowGap 横向每列中的间隙距离
ColumnGap 纵向每行之间的间隙距离
OutLinePadding 处于可以合并状态及非合并状态 外围框的距离
OutlineWidth 外边框的宽度
OutlineColor 外边框的颜色
InnerPadding 当内部有多个子View 时 与周围的边距


高级自定义



继承ClassifyView 重写以下方法:




  1. RecyclerView getMain(Context context, AttributeSet parentAttrs)
    返回主层级使用的 RecyclerView。

  2. RecyclerView getSub(Context context, AttributeSet parentAttrs)返回次级层级使用的RecyclerView

  3. View chooseTarget(View selected, List swapTargets, int curX, int curY)
    当拖拽的View 覆盖到子View时会通过该方法在候选View中选择一个View 为目标View 之后的交互操作都会作用于当前所选择的View 及 这个目标View
    @param selected 当前选择的View
    @param swapTargets 候选的目标View(候选的目标View 为当前选择的View 能够覆盖到所有View)
    @param curX 当前选中View的X轴坐标
    @param curY 当前选中View的Y轴坐标

  4. Drawable getDragDrawable(View view)
    返回用于渲染当前拖动View的显示
    @param view 当前选中的View
    @return drawable返回Drawable 用于设置拖拽View的背景

  5. 自定义次级目录的布局:


    • 自定义次级目录的Dialog:重写 Dialog createSubDialog()

    • 自定义次级目录布局:重写View getSubContent()

      注意:默认会在返回的View中查找有Tag 为 @String/sub_container 的View作为容器 如果没有 就已返回的View作为容器来添加次级目录的RecyclerView。 可以覆盖ViewGroup findHaveSubTagContainer(ViewGroup group)来重写查找容器的逻辑




设置数据方式有两种方式:




  1. 使用 ClassifyView.setAdapter(BaseMainAdapter mainAdapter, BaseSubAdapter subAdapter)用于分别设置主层级及次级层级的适配器

  2. 使用 setAdapter(BaseSimpleAdapter baseSimpleAdapter)设置一个混合了主层级及次级层级的适配器,如何自定义可以参考 SimpleAdapter



主层级提供的回调



在BaseAdapter中对于mergeStart等又增加了ViewHolder形式的回调 本质是一样的。


回调方法 说明 是否有默认实现在BaseSubAdapter中
setDragPosition 设置当前被拖拽的位置 true,默认效果为隐藏被拖拽的位置
boolean canDragOnLongPress 是否可以长按拖拽该View false
boolean canDropOVer 是否可以在对应点放下 true,默认返回true
boolean onMergeStart 第一次处于可合并状态 false
void onMerged 合并结束 false
ChangeInfo onPrepareMerge 当准备进行合并动画时回调,返回的ChangeInfo用于做当前拖拽的View到目标位置的动画 false
void onStartMergeAnimation 开始合并动画的回调 false
void onMergeCancel 当脱离合并状态的回调 false
boolean onMove 当需要触发移动时的回调 false
void moved 移动完成的回调 false
boolean canMergeItem 能否进行合并操作 false
int onLeaveSubRegion 当从次级目录拖动出item到主层级时回调,返回int 为添加到主层级adapter的位置 false
float getVelocity 只对低于这个速度的才判断能否移动(需要配合getCurrentState) true
int getCurrentState 判断当前处于的状态,返回三个值 Classify.STATE_NONE 无状态,Classify.STATE_MERGE 处于合并状态,Classify.STATE_MOVE 处于移动状态 true
void onItemClick 当item被点击时的回调 false
List explodeItem 用于是否展开次级目录,返回一个List 用于初始化次级目录的数据,对于List size 小于2的不展开次级目录而调用onItemClick false


次级层级的回调



次级层级与主层级相似 没有合并的相关回调 单独有两个回调:


方法 说明
void initData 用于初始化次级层级数据,初始化的数据来自于主层级的 explodeItem
boolean canDropOver 对于次层级的item 能否拖动到主层级

结语


当前项目效果展现 使用SimpleAdapter,InsertAbleGridView 是配合SimpleAdapter的控件所写,所以本质是一个有两个RecyclerView的自定义View,支持拖拽item并提供相应回调。


相关源码推荐:

我来说两句
所有评论(168)
junemail 2016-6-24 16:55:00
正好用到
回复
junemail 2016-6-24 16:55:16
正需要啊,感谢楼主无私分享!
回复
wangqiongzbb 2016-6-24 17:49:49
回复
wangqiongzbb 2016-6-24 17:50:28
精华内容,楼主V5!
回复
liuyi5289 2016-6-24 21:20:06
感谢分享,安卓巴士有你更精彩:)
回复
liuyi5289 2016-6-24 21:22:25
精华内容,楼主V5!
回复
wcp1988 2016-6-25 10:16:32
强烈支持楼主ing……
回复
上传代码
查看数:8674 收藏数:30 下载数: 点赞数:4
代码贡献英雄榜
用户名 下载数
联系我们
首页/微信公众账号投稿

帖子代码编辑/版权问题

QQ:435399051,769657487

如何获得代码达人称号

如何成为签约作者

联系我们
关闭
合作电话:
15618560077
Email:
805941275@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| 广东互联网违法和不良信息举报中心|中国互联网举报中心|下载客户端|申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

快速回复 返回顶部 返回列表