recyclerView + GridLayoutManager 实现任意网格布局+拖拽排序
生活随笔
收集整理的這篇文章主要介紹了
recyclerView + GridLayoutManager 实现任意网格布局+拖拽排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
適配器就是直接綁定 item布局,但是要擴展ItemTouchHelperAdapter接口
package com.daobo.wand.ui.adapterimport android.content.Context import android.view.LayoutInflater import android.view.ViewGroup import androidx.databinding.DataBindingUtil import androidx.databinding.ViewDataBinding import androidx.recyclerview.widget.RecyclerView import com.daobo.wand.BR import com.daobo.wand.R import com.daobo.wand.ui.FunctionItem import com.daobo.wand.ui.listener.ItemTouchHelperAdapter import com.daobo.wand.ui.viewbean.FuncItemViewBean import java.util.* import kotlin.collections.ArrayListclass FunctionMenuAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>, ItemTouchHelperAdapter {private var data = ArrayList<FunctionItem>()private var context: Context? = nullconstructor(context: Context, data: ArrayList<FunctionItem>) {this.context = contextif (data != null) {this.data = data}}override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {return FunctionViewHolder(DataBindingUtil.inflate(LayoutInflater.from(context),R.layout.layout_menu_function, parent, false))}override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {val fi = data[position]var funcItemViewBean = FuncItemViewBean()funcItemViewBean.IvImgSrc = context!!.resources.getIdentifier(fi.mImageUrl, "drawable",context!!.packageName)funcItemViewBean.Name = fi.mNamevar binding : ViewDataBinding = DataBindingUtil.getBinding(holder.itemView)!!binding.setVariable(BR.funcItem, funcItemViewBean)binding.executePendingBindings()}override fun getItemCount(): Int {return data.size}override fun onItemMove(holder: RecyclerView.ViewHolder, fromPosition: Int, targetPosition: Int) {if (fromPosition < data.size && targetPosition < data.size) {Collections.swap(data, fromPosition, targetPosition)notifyItemMoved(fromPosition, targetPosition)}}override fun onItemSelect(holder: RecyclerView.ViewHolder) {holder.itemView.scaleX = 0.8fholder.itemView.scaleY = 0.8f}override fun onItemClear(holder: RecyclerView.ViewHolder) {holder.itemView.scaleX = 1.0fholder.itemView.scaleY = 1.0f}override fun onItemDismiss(holder: RecyclerView.ViewHolder) {}inner class FunctionViewHolder(dataBinding: ViewDataBinding) : RecyclerView.ViewHolder(dataBinding.root)}上面配置做了touch選擇處理,同時我們要做移動處理
定義接口:
package com.daobo.wand.ui.listenerimport androidx.recyclerview.widget.RecyclerViewinterface ItemTouchHelperAdapter {fun onItemMove(holder: RecyclerView.ViewHolder, fromPosition: Int, targetPosition: Int)fun onItemSelect(holder: RecyclerView.ViewHolder)fun onItemClear(holder: RecyclerView.ViewHolder)fun onItemDismiss(holder: RecyclerView.ViewHolder) }定義一個DefaultItemCallback 擴展?recyclerview.widget.ItemTouchHelper.CallBack
package com.daobo.wand.ui.listenerimport androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerViewclass DefaultItemCallback : ItemTouchHelper.Callback {private var touchHelperAdapter: ItemTouchHelperAdapterconstructor(touchHelperAdapter: ItemTouchHelperAdapter) {this.touchHelperAdapter = touchHelperAdapter}override fun getMovementFlags(recyclerView: RecyclerView,viewHolder: RecyclerView.ViewHolder): Int {val dragFlags =ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT //允許上下左右的拖動return ItemTouchHelper.Callback.makeMovementFlags(dragFlags, 0)}override fun onMove(recyclerView: RecyclerView,viewHolder: RecyclerView.ViewHolder,target: RecyclerView.ViewHolder): Boolean {touchHelperAdapter.onItemMove(viewHolder,viewHolder.adapterPosition,target.adapterPosition)return true}override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {if (actionState != ItemTouchHelper.ACTION_STATE_IDLE)touchHelperAdapter.onItemSelect(viewHolder!!)}override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) {if (!recyclerView.isComputingLayout)touchHelperAdapter.onItemClear(viewHolder)}override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {}override fun isLongPressDragEnabled(): Boolean {return true}override fun isItemViewSwipeEnabled(): Boolean {return false} }在做一個封裝 helper
?
然后在fragment或者activity中使用的時候綁定GridLayoutManager:
{ blockAdapter = FunctionMenuAdapter(this, selData!!) recyclerViewExist.layoutManager = GridLayoutManager(this, 4) recyclerViewExist.adapter = blockAdapter recyclerViewExist.addItemDecoration(SpaceItemDecoration(4, dip2px(this, 10.0F)))val callback = DefaultItemCallback(blockAdapter!!) val helper = DefaultItemTouchHelper(callback) helper.attachToRecyclerView(recyclerViewExist)itemWidth = getAtyWidth(this) / 4 + dip2px(this, 2.0F) resetEditHeight(selData!!.size) ...... }private fun dip2px(context: Context, dpValue: Float): Int {val scale = context.resources.displayMetrics.densityreturn (dpValue * scale + 0.5f).toInt() }private fun getAtyWidth(context: Context): Int {return try {val mDm = DisplayMetrics()(context as Activity).windowManager.defaultDisplay.getMetrics(mDm)mDm.widthPixels} catch (e: Exception) {0}}private fun resetEditHeight(size: Int) {var size = sizetry {if (size == 0) {size = 1}var row = size / 4 + if (size % 4 > 0) 1 else 0if (row <= 0)row = 1if (lastRow != row) {lastRow = rowval params = recyclerViewExist.layoutParamsparams.height = itemWidth * rowrecyclerViewExist.layoutParams = params}} catch (e: Exception) {e.printStackTrace()}}?
?
總結
以上是生活随笔為你收集整理的recyclerView + GridLayoutManager 实现任意网格布局+拖拽排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 董明珠第二崩了!孟羽童被曝考勤异常率超8
- 下一篇: 财务付款审批流程