Giter Club home page Giter Club logo

multiselectadapter's Introduction

MultiSelectAdapter

MultiSelectAdapter是一个为RecyclerView设计的Adapter,它可以在不修改你原有Adapter的前提下让你的RecycleView支持多选和批量操作

Demo

Demo0 Demo1 Demo2 Demo3
Demo0 Demo4 Demo5 Demo6

Compile

Step 1. Add it in your root build.gradle at the end of repositories:

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

Step 2. Add the dependency

dependencies {
    compile 'com.github.goyourfly:MultiSelectAdapter:lastVersion'
}

Usage

 MultipleAdapter adapter = MultipleSelect
                .with(Activity)
                .adapter(YourAdapter)
                .ignoreViewType(ItemViewType)
                .linkList(YourAdapter.list)
                .stateChangeListener(StateChangeListener)
                .decorateFactory(? extends DecorateFactory)
                .customMenu(? extends MenuBar)
                .build();
方法名 形参 是否必须 说明
with Activity 显示RecycleView的Activity
adapter RecyclerView.Adapter 你的Adapter
ignoreViewType Integer[] 需要忽略的Item类型,比如Section,Header,Footer等
linkList List 绑定你的Adapter的地址,这样在调用MultipleAdapter.delete()接口的时候就会自动删除数据
stateChangeListener StateChangeListener 选择模式时候的一些消息回调
decorateFactory ? extends DecorateFactory 选择模式时Item的样式创建类,可以自定义,具体样式参考上面Demo,底下会详细介绍
customMenu ? extends MenuBar 选择模式的Menu,默认提供几种方式,可以简单的自定义和完全的自定义

StateChangeListener

/**
 * Kotlin
 * 一些操作的回调
 */
open class SimpleStateChangeListener:StateChangeListener{
    override fun onSelectMode() {

    }

    override fun onSelect(position: Int, selectNum: Int) {

    }

    override fun onUnSelect(position: Int, selectNum: Int) {

    }

    override fun onDone(array: ArrayList<Int>) {

    }

    override fun onDelete(array: ArrayList<Int>) {

    }

    override fun onCancel() {

    }

}

DecorateFactory

DecorateFactory定义了在多选模式下Item的样式,如下第一个是正常模式的显示状态,第二个是多选模式下的显示样式(其中的一种样式)

RadioButtonStyle

RadioButtonStyle

目前内置四种样式的DecorateFactory,分别是

类名 构造方法参数 说明 Demo
RadioBtnFactory color:Int(RadioBtn颜色), duration:Long(动画时长), gravity:Int(位置,Gravity.LEFT,Gravity.RIGHT) 在Item外面的左侧或者右侧显示RadioButton RadioButtonStyle
CheckBoxFactory color:Int(颜色), duration:Long(动画时长), gravity:Int(位置,Gravity),marginDp:Int,边距 在Item内部的左侧或者右侧显示RadioButton, CheckBoxStyle
ColorFactory targetViewId:Int(改变颜色的View ID),defaultColor:Int,普通状态下的颜色,selectColor:Int选中状态下的颜色 选中和未选中的时候,修改某一个View的背景色 ColorStyle
DrawableFactory
当然,你也可以实现自己的风格如下:
class YourCustomFactory(val color: Int = Color.RED,
                      val gravity: Int = Gravity.RIGHT,
                      val marginDp:Int = 8) : CustomViewFactory() {
    // 显示时候的动画,如果不加动画,则直接将selectView置为View.VISIBLE
    override fun onShowAnimation(itemView: View, selectView: View) {
        selectView.visibility = View.VISIBLE
    }

    // 隐藏时候的动画,如果不加动画,则直接将selectView置为View.GONE
    override fun onHideAnimation(itemView: View, selectView: View) {
        selectView.visibility = View.GONE
    }

	// 创建选中时显示的View
    override fun onCreateSelectView(context:Context): View {
        val imageView = ImageView(context)
        imageView.setImageResource(R.drawable.ic_check_box_black_24dp)
        imageView.setColorFilter(color)
        return imageView
    }
	// 创建未选中时的View
    override fun onCreateNormalView(context:Context): View {
        val imageView = ImageView(context)
        imageView.setColorFilter(color)
        imageView.setImageResource(R.drawable.ic_check_box_outline_blank_black_24dp)
        return imageView
    }

	// 创建View的容器,该容器包含了用户的ItemView和你定义的选中时的View
    override fun onCreateRootView(context:Context): ViewGroup {
        return FrameLayout(context)
    }

	// 设置ItemView和SelectView的位置关系
	// ItemView:用户创建的ItemView
	// SelectView:选中状态View
    override fun onBindSelectView(root: ViewGroup, itemView: View, selectView: View) {
        root.removeAllViews()
        root.addView(itemView)
        val params = FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT)
        params.gravity = gravity
        params.leftMargin = marginDp.toPx(root.context)
        params.topMargin = marginDp.toPx(root.context)
        params.rightMargin = marginDp.toPx(root.context)
        params.bottomMargin = marginDp.toPx(root.context)
        root.addView(selectView, params)
    }

}

MenuBar

MenuBar

内置四种MenuBar的样式,具体样式请看Demo

  • SimpleDeleteMenuBar
  • SimpleDoneMenuBar
  • SimpleDoneAndDeleteMenuBar
  • SimpleDeleteSelectAllMenuBar

你也可以通过继承CustomMenuBar来实现一个自己的MenuBar:

class MyMenuBar(activity:Activity,menuId:Int,color:Int)
        :CustomMenuBar(activity,menuId,color,Gravity.TOP){

    override fun onUpdateTitle(selectCount: Int, total: Int) {
        toolbar.title = "选中:$selectCount 总共:$total"
    }

    override fun onMenuItemClick(menuItem: MenuItem, controller: MenuController) {
        //TODO 这里处理点击事件
    }
}

详细的使用可以看这里:Code

multiselectadapter's People

Contributors

goyourfly 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

multiselectadapter's Issues

demo运行的一些问题

列表点击了也没有什么选中的提示。就是弹出toast提示 hello star,
数据集也没有改变。。。

image

CheckBox选项框不能正常显示

在Fragment的onActivityCreated方法中:
MultipleSelect.with(requireActivity()).adapter(myAdapter).decorateFactory(CheckBoxFactory()).build()
运行后,item没有CheckBox

删除问题

在长按多选状态时,如果选中的第一个item不是recyclerview顶端的item,MultiSelectAdapter.getSelect()会为空。

onDelete回调晚了

ondelete回调会在数据被删除以后才调用 我这边是需要根据被删除的数据去删除本地文件的...结果拿不到数据了

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.