GithubHelp home page GithubHelp logo

android-drag-flowlayout's Introduction

android-drag-FowLayout

this is a draggable flow layout lib (android 可拖拽的流布局库) . support android-x Sample apk/示例app

Demo Screen Capture

特点

  • 1, 类似可拖拽的GridView. 不过gridView 宽度/个数是固定的。 这个布局item宽度是不定的(放不下自动换行)。
  • 2,长按item拖拽,如果要处理点击事件请调用。
        
        mDragflowLayout.setOnItemClickListener(new ClickToDeleteItemListenerImpl(R.id.iv_close){
        
             //点击删除成功时回调
            @Override
            protected void onDeleteSuccess(DragFlowLayout dfl, View child, Object data) {
               //your code
            }
        });
  • 3,可嵌套ScrollerView. demo就是。
  • 4, 默认均可拖拽,如果想禁止某些Item拖拽请实现 {@link IDraggable} 接口 .
  • 5, 支持预存储一定个数的item view. 以避免频繁创建.
 //预存指定个数的Item. 这些Item会反复使用
 mDragflowLayout.prepareItemsByCount(10);
  • 6, 1.5.0 新增 拖拽状态监听器 和 view观察者。
        //设置拖拽状态监听器
        mDragflowLayout.setOnDragStateChangeListener(new DragFlowLayout.OnDragStateChangeListener() {
            @Override
            public void onDragStateChange(DragFlowLayout dfl, int dragState) {
                System.out.println("on drag state change : dragState = " + dragState);
            }
        });
        //添加view观察者
        mDragflowLayout.addViewObserver(new IViewObserver() {
            @Override
            public void onAddView(View child, int index) {
                Logger.i(TAG, "onAddView", "index = " + index);
            }
            @Override
            public void onRemoveView(View child, int index) {
                Logger.i(TAG, "onRemoveView", "index = " + index);
            }
        });

使用步骤

  • 1, 导入下面的gradle 配置。并在xml中添加配置
//root gradle
allprojects {
    repositories {
        maven { url "https://jitpack.io" }
    }
}
// if you use androidx . please use '1.8.8-x'
implementation 'com.github.LightSun:android-drag-FlowLayout:1.8.8'
 <com.heaven7.android.dragflowlayout.DragFlowLayout
                android:id="@+id/drag_flowLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
    </com.heaven7.android.dragflowlayout.DragFlowLayout>
  • 2,设置点击事件处理器 和 数据适配器.
        //用这个处理点击事件
        mDragflowLayout.setOnItemClickListener(new ClickToDeleteItemListenerImpl(R.id.iv_close){
            @Override
            protected void onDeleteSuccess(DragFlowLayout dfl, View child, Object data) {
               //your code
            }
        });
        
        //DragAdapter 泛型参数就是为了每个Item绑定一个对应的数据。通常很可能是json转化过来的bean对象
        mDragflowLayout.setDragAdapter(new DragAdapter<TestBean>() {
        
            @Override  //获取你的item布局Id
            public int getItemLayoutId() {
                return R.layout.item_drag_flow;
            }
            //绑定对应item的数据
            @Override
            public void onBindData(View itemView, int dragState, TestBean data) {
                itemView.setTag(data);

                TextView tv = (TextView) itemView.findViewById(R.id.tv_text);
                tv.setText(data.text);
                //iv_close是关闭按钮。只有再非拖拽空闲的情况下才显示
                itemView.findViewById(R.id.iv_close).setVisibility(
                        dragState!= DragFlowLayout.DRAG_STATE_IDLE
                        && data.draggable ? View.VISIBLE : View.INVISIBLE);
            }
            //根据指定的child获取对应的数据。
            @NonNull
            @Override
            public TestBean getData(View itemView) {
                return (TestBean) itemView.getTag();
            }
        });
  • 3, item管理: 对item的增删改查-,即CRUD. 通过api: mDragflowLayout.getDragItemManager()。 即可得到DragItemManager.
  • 4, 禁止个别Item拖拽。
//数据实体实现IDraggable (是否可拖拽) 接口,并且 isDraggable 为false即可
 private static class  TestBean implements IDraggable{
        String text;
        boolean draggable = true; 
        public TestBean(String text) {
            this.text = text;
        }
        @Override
        public boolean isDraggable() {
            return draggable;
        }
    }
  • 5, 如果要使用布局动画,请用ViewGroup.setLayoutTransaction(...) .
  • 6, 更多详情请参见demo.

Gradle Config

repositories {
        jcenter()
}
// if you use androidx . please use '1.8.8-x'
compile 'com.heaven7.android.dragflowlayout:dragflowlayout:1.8.8'

API说明

  //设置拖拽状态监听器
    public void setOnDragStateChangeListener(OnDragStateChangeListener l)
 //获取拖拽状态
    public @DragState int getDragState()
 //设置Item点击事件处理器
    public void setOnItemClickListener(OnItemClickListener l)
 //设置数据适配器
    void setDragAdapter(DragAdapter<T> adapter)
 //获取Item管理器(方便CRUD-增删改查 item)
    public DragItemManager getDragItemManager()
 //设置全局是否可拖拽。如果false,则无法长按拖拽了。
    public void setDraggable(boolean draggable)
 //设置缓存view的个数。可避免重复创建item view
    public void prepareItemsByCount(int count)
    
  //标记拖拽开始,这个会使得拖拽状态变更为draggable. .
     public void beginDrag();
 //标记拖拽结束, 内部会自动将拖拽状态改为 DRAG_STATE_IDLE .
    public void finishDrag();

重要版本更新日志

  • 1, version(1.5.0)
    • (1) , 增加拖拽状态监听器 和 child view观察者
  • 2, version(1.5.1)
    • (1) , reuse item view for DragItemManager(inner class)
  • 3, version(1.5.5)
    • (1) , fix reuse item view bug.
    • (2) , add method onDeleteSuccess(...) for ClickToDeleteItemListenerImpl
  mDragflowLayout.setOnItemClickListener(new ClickToDeleteItemListenerImpl(R.id.iv_close){
            @Override
            protected void onDeleteSuccess(DragFlowLayout dfl, View child, Object data) {
               //your code
            }
        });
  • 4, version(1.6.2)
    • fix bug of issue(#1)
  • 5, version(1.8.3)
    • fix a bug of multi fask click with touch scrol (解决多次点击+滑动的问题).
  • 6,version (1.8.8)  * 为部分伙伴的新需求,开启编辑模式 添加新方法 beginDrag().
  • 7, version(1.8.8-x)
    • 支持android x

一些**

  • 1 ,最开始我打算用DragHelper做的。但是发现不能将拖拽的child 渲染在最上面。
  • 2, RecyclerView的自定义LayoutManager + onItem touch / 应该也可以.

issue

  • if you have any question or good suggestion about this, please tell me... Thanks!

About me

hope

i like technology. especially the open-source technology.And previous i didn't contribute to it caused by i am a little lazy, but now i really want to do some for the open-source. So i hope to share and communicate with the all of you.

License

Copyright 2016  
                heaven7([email protected])

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

android-drag-flowlayout's People

Contributors

lightsun avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

android-drag-flowlayout's Issues

旋转屏幕,生命周期变化导致数据全部抹除

如果都是最后一个lable位置放不下,直接切换到下一行,当每行空余长度大于总长度30percent时,是否考虑次行所有标签居中显示,否则每行最后留白,这样的排版个人觉得不太好

com.heaven7.memory.util.Cacher not found

I try to wrap your wonderful lib to a RAD software called "B4X".

I get this compiling error:

`Starting step: Compiling Java code.
javac 1.8.0_73
D:_B4A_SAMPLES_LibsToWrap_temp\src\java\com\heaven7\android\dragflowlayout\DefaultDragCallback.java:9: error: package com.heaven7.memory.util does not exist
import com.heaven7.memory.util.Cacher;

Am I missing something?

导入库运行时crash

crash log

 android.view.InflateException: Binary XML file line #54 in com.component.debug.cPaccounts:layout/paccounts_fragment_laout: Binary XML file line #54 in com.component.debug.cPaccounts:layout/paccounts_fragment_laout: Error inflating class com.heaven7.android.dragflowlayout.DragFlowLayout
    Caused by: android.view.InflateException: Binary XML file line #54 in com.component.debug.cPaccounts:layout/paccounts_fragment_laout: Error inflating class com.heaven7.android.dragflowlayout.DragFlowLayout
    Caused by: java.lang.reflect.InvocationTargetException

看上去像是xml反射失败。
我的布局

   <LinearLayout
        android:id="@+id/dragContainer"
        android:visibility="gone"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <com.heaven7.android.dragflowlayout.DragFlowLayout
            android:id="@+id/dragLayout"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:itemSpacing="5dp"
            app:lineSpacing="5dp"
            android:layout_weight="1">
        </com.heaven7.android.dragflowlayout.DragFlowLayout>

    </LinearLayout>

目前项目是androidX。

android x

最新:已解决
依赖android x版本 版本号:1.8.8-x 依赖不下来

DragFlowLayout inside a Scrollview not working properly

I have placed DragFlowLayout inside of a Scrollview. DragflowLayout is filled with childs (tags) such that height of the DragflowLayout is greater than device screen height.

For the first time when i scroll the Scrollview , its work perfectly. But as i first drag and drop a child inside DragFlowLayout and after that if i try to scroll the Scrollview then scrolling does not work.

same issue is also in the Sample provided in repo.

Please help.

设置DragFlowLayout宽高都为match_parent,item子项新增加的会重叠起来。

我开始把xml布局DragFlowLayout宽高设置为match_parent,但是addItem一直加不上,仔细观察才发现其实是因为没个新增加的item都覆盖在了前一个item上面,所以看起来只有一个item在变化。
但是把DragFlowLayout的宽高改成wrap_content就可以正常实现了,不知道是作者故意这么设置的还是设计的问题呢?

README文档感觉说明不是很清楚,对于初接触的人来说不知道该怎么用

看了作者的文档,很多地方都搞不清楚例如:
1、刚接触一看不知道怎么引用,(我是在简单看了源码之后才知道要在XML里面引用,也就是自定义的View),但是README文档里一直在强调Java代码的东西
2、能不能定义自己的Adapter,这里我猜测应该是继承DragAdapter,但是里面的方法就不知道具体表达什么意思了,源码里面也只是抽象方法,我个人能力有限,真的不知道该怎么用。
3、还有那个预存Item是什么意思?
这只是我个人的一些看法,可能是因为个人水平比较低导致消化不良,如果可以,希望作者能费一些时间解答一下这些,谢谢!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.