diff --git a/app/build.gradle b/app/build.gradle
index af4d155..d1e9dad 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -24,8 +24,8 @@ android {
}
}
compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_8
- targetCompatibility JavaVersion.VERSION_1_8
+ sourceCompatibility JavaVersion.VERSION_11
+ targetCompatibility JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = '1.8'
@@ -43,4 +43,8 @@ dependencies {
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
+ implementation 'q.rorbin:badgeview:1.1.3'
+ implementation "com.github.goweii:AnyLayer:5.0.0-beta3"
+ implementation 'com.github.Dimezis:BlurView:version-2.0.3'
+ implementation 'com.github.shenbengit:PagerGridLayoutManager:1.1.8'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index bc7e257..06a85dc 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -9,11 +9,9 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.DSDrag">
+
-
@@ -26,6 +24,7 @@
+
\ No newline at end of file
diff --git a/app/src/main/java/com/ds/drag/demo/FolderAdapter.kt b/app/src/main/java/com/ds/drag/demo/FolderAdapter.kt
index a9badf1..e8624e8 100644
--- a/app/src/main/java/com/ds/drag/demo/FolderAdapter.kt
+++ b/app/src/main/java/com/ds/drag/demo/FolderAdapter.kt
@@ -6,7 +6,10 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
+import com.ds.drag.core.IDragData
+import com.ds.drag.core.SimpleData
import kotlinx.android.synthetic.main.item_folder_item_layout.view.*
+import kotlinx.android.synthetic.main.item_simple_data_layout.view.image
/**
* author : linzheng
@@ -18,10 +21,10 @@ import kotlinx.android.synthetic.main.item_folder_item_layout.view.*
class FolderAdapter(context: Context) : RecyclerView.Adapter() {
private val layoutInflater = LayoutInflater.from(context)
- private val mList: MutableList = mutableListOf()
+ private val mList: MutableList = mutableListOf()
@SuppressLint("NotifyDataSetChanged")
- fun setData(data: List) {
+ fun setData(data: List) {
mList.clear()
mList.addAll(data)
notifyDataSetChanged()
@@ -35,13 +38,14 @@ class FolderAdapter(context: Context) : RecyclerView.Adapter() {
override fun onBindViewHolder(holder: FolderItemVH, position: Int) {
val data = mList[position]
- holder.itemView.tv_content.text = (data as? SimpleData)?.value.toString()
+ holder.itemView.image.setImageResource(data.iconResId!!)
+ holder.itemView.tv_content.visibility = View.GONE
}
override fun getItemCount(): Int {
- return minOf(mList.size, 4)
+ return minOf(mList.size, 100)
}
}
diff --git a/app/src/main/java/com/ds/drag/demo/FolderItemDragCallback.kt b/app/src/main/java/com/ds/drag/demo/FolderItemDragCallback.kt
index 11fe5f6..295a76e 100644
--- a/app/src/main/java/com/ds/drag/demo/FolderItemDragCallback.kt
+++ b/app/src/main/java/com/ds/drag/demo/FolderItemDragCallback.kt
@@ -4,6 +4,10 @@ import android.graphics.Canvas
import android.util.Log
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
+import com.ds.drag.core.FolderData
+import com.ds.drag.core.IDragAdapter
+import com.ds.drag.core.IDragData
+import com.ds.drag.core.callback.IDragHandler
/**
* author : linzheng
@@ -12,12 +16,17 @@ import androidx.recyclerview.widget.RecyclerView
* desc : 文件夹内的item拖拽回调
* version: 1.0
*/
-class FolderItemDragCallback : ItemTouchHelper.Callback() {
+class FolderItemDragCallback(private val dragAdapter: IDragAdapter) : ItemTouchHelper.Callback() {
companion object {
private val TAG = "FolderItemDragCallback"
}
+ fun setDragHandler(handler: IDragHandler) {
+ this.mDragHandler = handler
+ }
+ // 合并逻辑的处理
+ private var mDragHandler: IDragHandler? = null
var itemLocationListener: ((viewHolder: RecyclerView.ViewHolder?, left: Float, top: Float, activity: Boolean) -> Unit)? = null
@@ -30,11 +39,23 @@ class FolderItemDragCallback : ItemTouchHelper.Callback() {
}
override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
-
- return false
+ val fromPosition = viewHolder.adapterPosition
+ val toPosition = target.adapterPosition
+ val swap = mDragHandler?.swapPosition(fromPosition, toPosition)?: false
+ if (swap) { // 交换位置
+ mDragHandler?.onBeforeSwap(fromPosition, toPosition)
+ val list = dragAdapter.getDragData()
+ if (list is MutableList) {
+ val item = list.removeAt(fromPosition)
+ list.add(toPosition, item)
+ }
+ mDragHandler?.onAfterSwap(fromPosition, toPosition)
+ }
+ return swap
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
+ Log.d("onSwiped", "onSwiped: "+direction)
}
@@ -55,7 +76,7 @@ class FolderItemDragCallback : ItemTouchHelper.Callback() {
val y = parentLocation[1] + top + dY
itemLocationListener?.invoke(viewHolder, x, y, isCurrentlyActive)
Log.d(TAG, "onChildDrawOver: top $x, left $y")
-
+ Log.d(TAG, "onChildDrawOver: actionState:"+actionState)
}
diff --git a/app/src/main/java/com/ds/drag/demo/SimpleAdapter.kt b/app/src/main/java/com/ds/drag/demo/SimpleAdapter.kt
index d867520..ee11937 100644
--- a/app/src/main/java/com/ds/drag/demo/SimpleAdapter.kt
+++ b/app/src/main/java/com/ds/drag/demo/SimpleAdapter.kt
@@ -2,17 +2,27 @@ package com.ds.drag.demo
import android.annotation.SuppressLint
import android.content.Context
+import android.graphics.Color
+import android.util.Log
+import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
+import com.ds.drag.core.FolderData
import com.ds.drag.core.IDragAdapter
+import com.ds.drag.core.IDragData
import com.ds.drag.core.IDragItem
+import com.ds.drag.core.PreviewData
+import com.ds.drag.core.SimpleData
import kotlinx.android.synthetic.main.item_folder_data_layout.view.*
import kotlinx.android.synthetic.main.item_preview_data_layout.view.*
+import q.rorbin.badgeview.QBadgeView
/**
* author : linzheng
@@ -43,6 +53,7 @@ class SimpleAdapter(private val context: Context, private val inFolder: Boolean
}
}
+ var isSHow=true;
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseDataVH {
val layoutInflater = LayoutInflater.from(context)
@@ -53,24 +64,38 @@ class SimpleAdapter(private val context: Context, private val inFolder: Boolean
}
2 -> {
val view = layoutInflater.inflate(R.layout.item_preview_data_layout, parent, false)
+
PreviewViewHolder(view)
+
}
else -> {
- val view = layoutInflater.inflate(R.layout.item_simple_data_layout, parent, false)
+ var view:View?=null
+ if(inFolder){
+ view = layoutInflater.inflate(R.layout.item_simple_data_infolder_layout, parent, false)
+ }else{
+ view = layoutInflater.inflate(R.layout.item_simple_data_layout, parent, false)
+ }
SimpleViewHolder(view)
}
}
}
-
override fun onBindViewHolder(holder: BaseDataVH, position: Int) {
if (inFolder) {
-
- holder.itemView.setBackgroundResource(R.drawable.se_folder_bg)
+ Log.d("onBindViewHolder", "onBindViewHolder:"+position)
+
+ if(!isSHow){
+ holder.itemView.visibility=View.GONE
+ Log.d("onBindViewHolder", "是否透明:"+isSHow)
+ }else{
+ holder.itemView.visibility=View.VISIBLE
+ // holder.itemView.setBackgroundResource(R.drawable.se_folder_bg)
+ }
}
holder.bindData(mList[position])
if (holder is FolderViewHolder) {
+
holder.itemView.clk_mask.setOnClickListener {
itemClickListener?.invoke(mList[position])
}
@@ -108,8 +133,13 @@ abstract class BaseDataVH(itemView: View) : RecyclerView.ViewHolder(itemView), I
*/
class PreviewViewHolder(itemView: View) : BaseDataVH(itemView) {
override fun bindData(data: IDragData) {
+ itemView.isSelected=true
val simpleData = (data as? PreviewData)?.realData
- itemView.tv_content.text = simpleData?.value?.toString()
+ var image=itemView.findViewById(R.id.image)
+ image.setImageResource(simpleData?.iconResId!!)
+ itemView.findViewById(R.id.tv_content).text=simpleData.titleName
+ itemView.findViewById(R.id.tv_content).visibility=View.VISIBLE
+ bindunreadQBadge(simpleData,image)
}
override fun canDrag(viewHolder: RecyclerView.ViewHolder): Boolean {
@@ -143,9 +173,13 @@ class SimpleViewHolder(itemView: View) : BaseDataVH(itemView) {
@SuppressLint("SetTextI18n")
override fun bindData(data: IDragData) {
val simpleData = data as SimpleData
- itemView.findViewById(R.id.tv_content).text = "${simpleData.value}"
- }
+ var image=itemView.findViewById(R.id.image)
+ image.setImageResource(simpleData.iconResId!!)
+ itemView.findViewById(R.id.tv_content).text=simpleData.titleName
+ itemView.findViewById(R.id.tv_content).visibility=View.VISIBLE
+ bindunreadQBadge(simpleData,image)
+ }
override fun canDrag(viewHolder: RecyclerView.ViewHolder): Boolean {
return true
@@ -179,16 +213,19 @@ class SimpleViewHolder(itemView: View) : BaseDataVH(itemView) {
*/
class FolderViewHolder(itemView: View) : BaseDataVH(itemView) {
-
+ val 透明=false;
override fun bindData(data: IDragData) {
val folderData = data as FolderData
val context = itemView.context
- val recyclerView = itemView.findViewById(R.id.recycler_view)
- recyclerView.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
+ val recyclerView = itemView.findViewById(R.id.grvDesk)
+ recyclerView.layoutManager =GridLayoutManager(context,2, LinearLayoutManager.VERTICAL,false)
val folderAdapter = FolderAdapter(context)
folderAdapter.setData(folderData.list)
recyclerView.adapter = folderAdapter
+ itemView.findViewById(R.id.tv_content).text=folderData.getFolderId()
+ itemView.findViewById(R.id.tv_content).visibility=View.VISIBLE
+ bindunreadQBadge(folderData,recyclerView)
showMergePreview(this, false)
}
@@ -241,5 +278,42 @@ class DiffCallback(private val oldList: List, private val newList: Li
}
+fun bindunreadQBadge( data: IDragData, targetView:View){
+ //未读数
+ val unreadQBadge: QBadgeView
+ if (targetView.getTag(R.id.viewTag1) == null) {
+ unreadQBadge = QBadgeView(targetView.context)
+ unreadQBadge.badgeBackgroundColor = Color.parseColor("#FC353A")
+ unreadQBadge.setBadgeTextSize(9f, true)
+ unreadQBadge.setBadgePadding(3f, true)
+ unreadQBadge.bindTarget(targetView)
+ targetView.setTag(R.id.viewTag1, unreadQBadge)
+ } else {
+ unreadQBadge = targetView.getTag(R.id.viewTag1) as QBadgeView
+ }
+ unreadQBadge.badgeGravity = Gravity.END or Gravity.TOP
+ unreadQBadge.setGravityOffset(2f,true)
+
+
+ if(data is SimpleData){
+ if ( data.unreadcount > 0 ) {
+ unreadQBadge.badgeNumber = data.unreadcount
+ unreadQBadge.visibility = View.VISIBLE
+ } else {
+ unreadQBadge.visibility = View.GONE
+ }
+ }else if(data is FolderData){
+ if ( data.getUnreadcount() > 0 ) {
+ unreadQBadge.badgeNumber = data.getUnreadcount()
+ unreadQBadge.visibility = View.VISIBLE
+ } else {
+ unreadQBadge.visibility = View.GONE
+ }
+ }else{
+ unreadQBadge.visibility = View.GONE
+ }
+
+
+}
diff --git a/app/src/main/java/com/ds/drag/demo/activity/AdditionActivity.kt b/app/src/main/java/com/ds/drag/demo/activity/AdditionActivity.kt
index c6d1dac..4b1bd3d 100644
--- a/app/src/main/java/com/ds/drag/demo/activity/AdditionActivity.kt
+++ b/app/src/main/java/com/ds/drag/demo/activity/AdditionActivity.kt
@@ -5,11 +5,11 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
+import com.ds.drag.core.IDragData
+import com.ds.drag.core.SimpleData
import com.ds.drag.core.callback.DragTouchCallback
-import com.ds.drag.demo.IDragData
import com.ds.drag.demo.R
import com.ds.drag.demo.SimpleAdapter
-import com.ds.drag.demo.SimpleData
import com.ds.drag.demo.handler.AdditionHandlerImpl
/**
@@ -29,7 +29,7 @@ class AdditionActivity : AppCompatActivity() {
setContentView(R.layout.activity_simple_handler)
supportActionBar?.title = "加法逻辑"
- recyclerView = findViewById(R.id.recycler_view)
+ recyclerView = findViewById(R.id.grvDesk)
recyclerView.layoutManager = LinearLayoutManager(this)
mAdapter = SimpleAdapter(this)
mAdapter.setData(getTestList())
diff --git a/app/src/main/java/com/ds/drag/demo/activity/FolderActivity.kt b/app/src/main/java/com/ds/drag/demo/activity/FolderActivity.kt
index 0effed2..0c2bf05 100644
--- a/app/src/main/java/com/ds/drag/demo/activity/FolderActivity.kt
+++ b/app/src/main/java/com/ds/drag/demo/activity/FolderActivity.kt
@@ -8,6 +8,10 @@ import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
+import com.ds.drag.core.FolderData
+import com.ds.drag.core.IDragData
+import com.ds.drag.core.PreviewData
+import com.ds.drag.core.SimpleData
import com.ds.drag.core.callback.DragTouchCallback
import com.ds.drag.demo.*
import com.ds.drag.demo.handler.FolderHandlerImpl
@@ -50,7 +54,7 @@ class FolderActivity : AppCompatActivity() {
* 初始化左侧列表
*/
private fun initSimpleList() {
- recyclerView = findViewById(R.id.recycler_view)
+ recyclerView = findViewById(R.id.grvDesk)
recyclerView.layoutManager = LinearLayoutManager(this)
listAdapter.setData(getTestList())
listAdapter.itemClickListener = { item ->
@@ -76,15 +80,15 @@ class FolderActivity : AppCompatActivity() {
* 初始化文件夹RecyclerView
*/
private fun initFolderList() {
- recycler_view_folder.layoutManager = LinearLayoutManager(this)
- recycler_view_folder.adapter = folderAdapter
+ grvDeskFolder.layoutManager = LinearLayoutManager(this)
+ grvDeskFolder.adapter = folderAdapter
// 拖拽位置监听,实现将文件夹的item拖回左侧列表
- val itemTouchCallback = FolderItemDragCallback()
+ val itemTouchCallback = FolderItemDragCallback(folderAdapter)
itemTouchCallback.itemLocationListener = { viewHolder, left, top, activity ->
Log.d("FolderActivity", "initFolderList: left $left, top $top")
notifyPreviewViewHolder(viewHolder, left, top, activity)
}
- ItemTouchHelper(itemTouchCallback).attachToRecyclerView(recycler_view_folder)
+ ItemTouchHelper(itemTouchCallback).attachToRecyclerView(grvDeskFolder)
}
/**
diff --git a/app/src/main/java/com/ds/drag/demo/activity/FolderActivity2.kt b/app/src/main/java/com/ds/drag/demo/activity/FolderActivity2.kt
new file mode 100644
index 0000000..85a8ebb
--- /dev/null
+++ b/app/src/main/java/com/ds/drag/demo/activity/FolderActivity2.kt
@@ -0,0 +1,482 @@
+package com.ds.drag.demo.activity
+
+import android.annotation.SuppressLint
+import android.graphics.Color
+import android.graphics.drawable.ColorDrawable
+import android.os.Bundle
+import android.util.Log
+import android.view.View
+import android.view.ViewGroup
+import androidx.appcompat.app.AppCompatActivity
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.ItemTouchHelper
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.ds.drag.core.FolderData
+import com.ds.drag.core.IDragData
+import com.ds.drag.core.PreviewData
+import com.ds.drag.core.SimpleData
+import com.ds.drag.core.callback.DragTouchCallback
+import com.ds.drag.core.callback.DragTouchCallback.Companion.defaultFolderId
+import com.ds.drag.demo.*
+import com.ds.drag.demo.handler.FolderHandlerImpl
+import com.ds.drag.demo.handler.FolderInnerHandlerImpl
+import com.shencoder.pagergridlayoutmanager.PagerGridLayoutManager
+import eightbitlab.com.blurview.RenderScriptBlur
+import kotlinx.android.synthetic.main.activity_folder.*
+import kotlinx.android.synthetic.main.activity_folder2.deskBlurView
+import kotlinx.android.synthetic.main.activity_folder2.deskFolderBlurView
+import java.util.concurrent.CopyOnWriteArrayList
+
+
+/**
+ * author : linzheng
+ * e-mail : z.hero.dodge@gmail.com
+ * time : 2022/7/20
+ * desc : 合并生成文件夹逻辑
+ * version: 1.0
+ */
+class FolderActivity2 : AppCompatActivity() {
+
+ private lateinit var grvDesk: RecyclerView
+ // recyclerView 在 Window 中的坐标
+ private val location: IntArray by lazy {
+ val location = IntArray(2)
+ grvDesk.getLocationInWindow(location)
+ return@lazy location
+ }
+ private val folderLocation: IntArray by lazy {
+ val location = IntArray(2)
+ grvDeskFolder.getLocationInWindow(location)
+ return@lazy location
+ }
+ private var previewPosition = -1
+
+ // 左侧列表
+ private val deskAdapter by lazy { SimpleAdapter(this) }
+ // 子列表
+ private val deskFolderAdapter by lazy { SimpleAdapter(this, true) }
+ private var selectedItem: IDragData? = null
+
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_folder2)
+ initSimpleList()
+ initFolderList()
+ deskBlurView.visibility=View.GONE
+ }
+
+ var spancount=4;
+ /**
+ * 初始化左侧列表
+ */
+ private fun initSimpleList() {
+ grvDesk = findViewById(R.id.grvDesk)
+ grvDesk.layoutManager = GridLayoutManager(this,spancount, LinearLayoutManager.VERTICAL,false)
+ deskAdapter.setData(getTestList())
+ deskAdapter.itemClickListener = { item ->
+// if(isExpandFolder){
+// isExpandFolder(false)
+// blur_view.visibility=View.GONE
+// }else{
+ if(item is FolderData){
+ selectedItem = item
+ val dataList = (item as? FolderData)?.list
+ showFolderList(dataList)
+ }
+ // }
+ }
+ deskBlurView.setOnClickListener {
+ // isExpandFolder(false)
+ deskBlurView.visibility=View.GONE }
+ grvDesk.adapter = deskAdapter
+ val itemTouchCallback = DragTouchCallback(deskAdapter, vertical = true, horizontal = true)
+ val dragHandler = FolderHandlerImpl(grvDesk, deskAdapter)
+ // 合并操作回调
+ dragHandler.mergedListener = { item ->
+ if (item == selectedItem) {
+ val dataList = (item as? FolderData)?.list
+ //showFolderList(dataList)
+ }
+ }
+
+ itemTouchCallback.setDragHandler(dragHandler)
+ ItemTouchHelper(itemTouchCallback).attachToRecyclerView(grvDesk)
+ }
+
+ /**
+ * 初始化文件夹RecyclerView
+ */
+ private fun initFolderList() {
+ // grvDeskFolder.layoutManager = GridLayoutManager(this,3, LinearLayoutManager.VERTICAL,false)
+
+ val layoutManager = PagerGridLayoutManager(
+ 3, 3, PagerGridLayoutManager.HORIZONTAL
+ )
+ grvDeskFolder.layoutManager = layoutManager;
+ grvDeskFolder.adapter = deskFolderAdapter
+ // 拖拽位置监听,实现将文件夹的item拖回左侧列表
+ val itemTouchCallback = FolderItemDragCallback(deskFolderAdapter)
+ itemTouchCallback.itemLocationListener = { viewHolder, left, top, activity ->
+ Log.d("FolderActivity", "initFolderList: left $left, top $top")
+ notifyPreviewViewHolder(viewHolder, left, top, activity)
+ }
+ val dragHandler = FolderInnerHandlerImpl(grvDeskFolder, deskFolderAdapter,deskAdapter)
+ itemTouchCallback.setDragHandler(dragHandler)
+ ItemTouchHelper(itemTouchCallback).attachToRecyclerView(grvDeskFolder)
+ }
+ /**
+ * 用于显示文件夹内的list
+ */
+ private fun showFolderList(list: List?) {
+ deskBlurView.visibility=View.VISIBLE
+ if (list != null) {
+ deskFolderAdapter.setData(list)
+ } else {
+ deskFolderAdapter.setData(emptyList())
+ }
+ val radius = 5f
+ val decorView = window.decorView
+ // ViewGroup you want to start blur from. Choose root as close to BlurView in hierarchy as possible.
+ // ViewGroup you want to start blur from. Choose root as close to BlurView in hierarchy as possible.
+ val rootView = decorView.findViewById(android.R.id.content) as ViewGroup
+ val windowBackground = decorView.background
+ deskBlurView.setupWith(rootView, RenderScriptBlur(this)) // or RenderEffectBlur
+ .setFrameClearDrawable(windowBackground) // Optional
+ .setBlurAutoUpdate(true)
+ .setBlurRadius(radius)
+
+ deskFolderBlurView.setupWith(rootView, RenderScriptBlur(this)) // or RenderEffectBlur
+ .setFrameClearDrawable(windowBackground) // Optional
+ .setBlurAutoUpdate(true)
+ .setBlurRadius(25f)
+
+ isExpandFolder(true)
+// val dialogLayer = AnyLayer.dialog(this)
+// dialogLayer.contentView(R.layout.dialog_sign_up_for_login_tips)
+// .gravity(Gravity.CENTER)
+// .doBindData {
+// val recycler_view_folder = findViewById(R.id.recycler_view_folder)
+// recycler_view_folder?.layoutManager = LinearLayoutManager(this.activity)
+// recycler_view_folder?.adapter = folderAdapter
+// // 拖拽位置监听,实现将文件夹的item拖回左侧列表
+// val itemTouchCallback = FolderItemDragCallback()
+// itemTouchCallback.itemLocationListener = { viewHolder, left, top, activity ->
+// Log.d("FolderActivity", "initFolderList: left $left, top $top")
+// notifyPreviewViewHolder(viewHolder, left, top, activity)
+// }
+// ItemTouchHelper(itemTouchCallback).attachToRecyclerView(recycler_view_folder)
+//
+// }
+// .show()
+ }
+
+ override fun onBackPressed() {
+ deskBlurView?.visibility = View.GONE
+ // super.onBackPressed()
+ }
+ /**
+ * 根据 X、Y轴方向的位置,找到RecyclerView对应的位置
+ */
+ private fun findBestPosition(left: Int,top: Int, recyclerView: RecyclerView): Int {
+ val adapterList = deskAdapter.mList
+ if (adapterList.isEmpty()) {
+ return 0
+ }
+ val linearLayoutManager = (recyclerView.layoutManager as LinearLayoutManager?) ?: return 0
+ val firstPosition = linearLayoutManager.findFirstVisibleItemPosition()
+ val lastPosition = linearLayoutManager.findLastVisibleItemPosition()
+ for (i in firstPosition until lastPosition) { //遍历所有可见的view,
+ val childView = linearLayoutManager.findViewByPosition(i) ?: return 0
+ //逐一比对,在满足条件的view后面插入
+ if (childView?.bottom!! <= top || childView?.left!! <= left){
+ var nextViewPos=i + 1
+ val nextView = linearLayoutManager.findViewByPosition(nextViewPos)
+ if(nextView == null ){
+ return i
+ }else {
+ if (nextViewPos % spancount == 0) { //grid布局的话,每行的最后一个要单独处理
+ if(nextView.top >= top && nextView?.left==0 ){
+ return i
+ }
+ }else{
+ if (nextView.bottom >= top && (nextView.left >= left)) {
+ return i
+ }
+ }
+ }
+ }
+ }
+ return 0
+ }
+
+
+
+
+ //当前拖拽的文件夹postion
+ var dragoutFolderPid=-1;
+ var isExpandFolder=false;
+ /**
+ * 根据拖拽位置,显示、隐藏预览项
+ * @param viewHolder 被拖拽的ViewHolder
+ * @param left viewHolder相对当前window的left
+ * @param top viewHolder相对当前window的top
+ * @param activity 是否被拖动,释放拖动时 activity == false
+ */
+ private fun notifyPreviewViewHolder(viewHolder: RecyclerView.ViewHolder?, left: Float, top: Float, activity: Boolean) {
+
+ if (activity) {
+ val targetLeft = grvDesk.left.toFloat()
+ val targetRight = grvDesk.right.toFloat()
+ val targetTop = grvDesk.top.toFloat()
+ val targetBottom = grvDesk.bottom.toFloat()
+ val targetWith = grvDesk.width.toFloat() //文件夹内的图标将要移出的目标
+ val targetHeight = grvDesk.height.toFloat() //文件夹内的图标将要移出的目标
+ val xStart = targetLeft - targetWith / 4
+ val xEnd = targetRight - targetWith / 4
+
+ val yStart = targetTop - targetHeight / 4
+ val yEnd = targetBottom - targetWith / 4
+ var itemwidth= viewHolder!!.itemView.width.toFloat()
+ var itemHeight= viewHolder!!.itemView.height.toFloat()
+ if(dragoutFolderPid!=-1){ //从文件夹拖出来以后
+ Log.d("notifyPreviewViewHolder", "文件夹内的图标在文件夹 外 拖动")
+ if(left in xStart..xEnd+itemwidth || top in yStart..yEnd+itemHeight){
+ //打印left xStart xEnd 的log
+ Log.d("notifyPreviewViewHolder", "left:"+left)
+ val x = left - location[0]
+ val y = top - location[1]
+ val position = findBestPosition(x.toInt(),y.toInt(),
+ grvDesk
+ )
+ // Log.d("notifyPreviewViewHolderfindBestPosition", "position:"+position)
+
+ updatePreviewPosition(position, viewHolder)
+ }else{
+ Log.d("notifyPreviewViewHolder", xEnd.toString())
+ updatePreviewPosition(-1, viewHolder) //文件夹列表内
+ }
+ }else{ //在文件夹中拖动
+ Log.d("notifyPreviewViewHolder", "文件夹内的图标在文件夹 内 拖动")
+ // Log.d("notifyPreviewViewHolderfindBestPosition", "top:"+(blur_view2.get ))
+ // Log.d("notifyPreviewViewHolderfindBestPosition", "viewtop:"+(top ))
+ val x = folderLocation[0]
+ val y = folderLocation[1]
+ Log.d("notifyPreviewViewHolderfindBestPosition", "top:"+top)
+ Log.d("notifyPreviewViewHolderfindBestPosition", "y:"+y)
+ Log.d("notifyPreviewViewHolderfindBestPosition", "(y +grvDeskFolder.height - (itemHeight/3*2)):"+(y +grvDeskFolder.height - (itemHeight/3*2)))
+ if (
+// left in -Float.MAX_VALUE..(x - (itemwidth /3*1))
+// ||
+// left in (x+grvDeskFolder.width- (itemwidth /3*2))..Float.MAX_VALUE
+// ||
+ top in 0f..(y - (itemHeight /3*1))
+ ||
+ top in (y +grvDeskFolder.height - (itemHeight/3*2))..Float.MAX_VALUE
+ ){ //拖到外部文件
+ val x = left - location[0]
+ val y = top - location[1]
+ val position = findBestPosition(x.toInt(),y.toInt(),
+ grvDesk
+ )
+ // Log.d("notifyPreviewViewHolderfindBestPosition", "position:"+position)
+ updatePreviewPosition(position, viewHolder)
+ dragoutFolderPid= viewHolder?.layoutPosition!!;
+ isExpandFolder(false);
+ }else{
+ updatePreviewPosition(-1, viewHolder) //文件夹列表内
+ }
+ }
+
+ } else {//拖拽结束
+ if(dragoutFolderPid!=-1){
+ deskBlurView?.visibility=View.GONE
+ }
+ dragoutFolderPid=-1;
+ replacePreview(viewHolder)
+ }
+ //isDragoutFolder=activity;
+ }
+ fun isExpandFolder(isExpandFolder:Boolean){
+ grvDeskFolder?.visibility=View.VISIBLE
+ this.isExpandFolder=isExpandFolder;
+ grvDeskFolder?.isEnabled=isExpandFolder
+ grvDeskFolder?.background = isExpandFolder.let {
+ if (isExpandFolder) {
+ ColorDrawable(Color.WHITE).apply {
+ alpha = 180
+ }
+ } else {
+ ColorDrawable(Color.WHITE).apply {
+ alpha = 0
+ }
+ }
+ }
+ deskFolderAdapter.isSHow=isExpandFolder;
+ deskFolderAdapter.mList.forEachIndexed { index, iDragData ->
+ Log.d("dragoutFolderPid", "dragoutFolderPid:"+dragoutFolderPid)
+ if(index!=dragoutFolderPid){
+ deskFolderAdapter.notifyItemChanged(index)
+ }else{
+ }
+ }
+ if (isExpandFolder){
+ deskBlurView.setBlurEnabled(true)
+ deskFolderBlurView.setBlurEnabled(true)
+ }else{
+ deskBlurView.setBlurEnabled(false)
+ deskFolderBlurView.setBlurEnabled(false)
+ }
+ }
+
+ @SuppressLint("NotifyDataSetChanged")
+ private fun replacePreview(viewHolder: RecyclerView.ViewHolder?) {
+ if (previewPosition >= 0) {
+ val fromPosition = viewHolder?.adapterPosition ?: return
+ val folderList = deskFolderAdapter.getDragData()
+ val data = folderList.removeAt(fromPosition)
+ deskFolderAdapter.notifyDataSetChanged()
+
+ val dataList = deskAdapter.getDragData()
+ dataList.forEach {
+ val folderData = it as? FolderData
+ folderData?.list?.remove(data)
+ }
+ // 移除空的文件夹
+// dataList.removeAll {
+// val folderData = it as? FolderData
+// folderData?.list?.isEmpty() ?: false
+// }
+ dataList.remove(previewData)
+ dataList.add(previewPosition, data)
+ deskAdapter.notifyDataSetChanged()
+ previewPosition = -1
+ }
+ }
+
+
+ private val previewData = PreviewData()
+
+ /**
+ * 更新预览ViewHolder的位置
+ */
+ @SuppressLint("NotifyDataSetChanged")
+ private fun updatePreviewPosition(position: Int, viewHolder: RecyclerView.ViewHolder) {
+ if (previewPosition != position) {
+ previewPosition = position
+ Log.d("Dodge", "updatePreviewPosition: position = $position")
+ if (position >= 0) {
+ val fromPosition = viewHolder.adapterPosition
+ val simpleData = deskFolderAdapter.getDragData().getOrNull(fromPosition) as? SimpleData
+ previewData.realData = simpleData
+ val dataList = deskAdapter.getDragData()
+ dataList.remove(previewData)
+ dataList.add(position, previewData)
+ deskAdapter.notifyDataSetChanged()
+ } else {
+ val dataList = deskAdapter.getDragData()
+ val oldList = dataList.toList()
+ dataList.remove(previewData)
+ val result = DiffUtil.calculateDiff(DiffCallback(oldList, dataList))
+ result.dispatchUpdatesTo(deskAdapter)
+ }
+ }
+ }
+
+ private fun getTestList(): MutableList {
+ val list = mutableListOf()
+
+ var simpleData=SimpleData(1)
+ simpleData.iconResId=R.drawable.gzhb
+ simpleData.titleName="工作汇报"
+ simpleData.unreadcount=0
+ list.add(simpleData)
+
+
+
+
+
+ var l= FolderData();
+ l.setFolderId(defaultFolderId)
+ l.list.addAll(convertData())
+ list.add(l)
+
+ return list
+ }
+
+ fun convertData(): CopyOnWriteArrayList {
+ val da =CopyOnWriteArrayList()
+ var simpleData=SimpleData(10)
+ simpleData.iconResId=R.drawable.glyg
+ simpleData.titleName="关联员工"
+ simpleData.unreadcount=23
+ da.add(simpleData)
+
+ simpleData=SimpleData(11)
+ simpleData.iconResId=R.drawable.bmlxd
+ simpleData.titleName="部门联系单"
+ simpleData.unreadcount=0
+ da.add(simpleData)
+
+ simpleData=SimpleData(12)
+ simpleData.iconResId=R.drawable.qtsx
+ simpleData.titleName="其他事项"
+ simpleData.unreadcount=11
+ da.add(simpleData)
+
+
+ simpleData=SimpleData(5)
+ simpleData.iconResId=R.drawable.rwmb
+ simpleData.titleName="任务目标"
+ simpleData.unreadcount=13
+ da.add(simpleData)
+
+ simpleData=SimpleData(6)
+ simpleData.iconResId=R.drawable.wdyp
+ simpleData.titleName="我的云盘"
+ simpleData.unreadcount=12
+ da.add(simpleData)
+
+ simpleData=SimpleData(7)
+ simpleData.iconResId=R.drawable.txl
+ simpleData.titleName="通讯录"
+ simpleData.unreadcount=11
+ da.add(simpleData)
+
+ simpleData=SimpleData(8)
+ simpleData.iconResId=R.drawable.zdlc
+ simpleData.titleName="制度流程"
+ simpleData.unreadcount=1
+ da.add(simpleData)
+
+ simpleData=SimpleData(9)
+ simpleData.iconResId=R.drawable.glbm
+ simpleData.titleName="关联部门"
+ simpleData.unreadcount=2
+ da.add(simpleData)
+
+ simpleData=SimpleData(3)
+ simpleData.iconResId=R.drawable.spsx
+ simpleData.titleName="审批事项"
+ simpleData.unreadcount=5
+ da.add(simpleData)
+
+ simpleData=SimpleData(4)
+ simpleData.iconResId=R.drawable.kqdk
+ simpleData.titleName="考勤打卡"
+ simpleData.unreadcount=12
+ da.add(simpleData)
+
+ simpleData=SimpleData(2)
+ simpleData.iconResId=R.drawable.gztz
+ simpleData.titleName="工作通知"
+ simpleData.unreadcount=1
+ da.add(simpleData)
+
+ return da
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/ds/drag/demo/activity/MainActivity.kt b/app/src/main/java/com/ds/drag/demo/activity/MainActivity.kt
index f9e1b34..73f6ebe 100644
--- a/app/src/main/java/com/ds/drag/demo/activity/MainActivity.kt
+++ b/app/src/main/java/com/ds/drag/demo/activity/MainActivity.kt
@@ -25,7 +25,7 @@ class MainActivity : AppCompatActivity() {
}
btn_folder.setOnClickListener {
- val intent = Intent(this, FolderActivity::class.java)
+ val intent = Intent(this, FolderActivity2::class.java)
startActivity(intent)
}
diff --git a/app/src/main/java/com/ds/drag/demo/activity/MultiplyActivity.kt b/app/src/main/java/com/ds/drag/demo/activity/MultiplyActivity.kt
index ec01ada..3e3885a 100644
--- a/app/src/main/java/com/ds/drag/demo/activity/MultiplyActivity.kt
+++ b/app/src/main/java/com/ds/drag/demo/activity/MultiplyActivity.kt
@@ -5,11 +5,11 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
+import com.ds.drag.core.IDragData
+import com.ds.drag.core.SimpleData
import com.ds.drag.core.callback.DragTouchCallback
-import com.ds.drag.demo.IDragData
import com.ds.drag.demo.R
import com.ds.drag.demo.SimpleAdapter
-import com.ds.drag.demo.SimpleData
import com.ds.drag.demo.handler.MultiplyHandlerImpl
/**
@@ -30,7 +30,7 @@ class MultiplyActivity : AppCompatActivity() {
supportActionBar?.title = "乘法逻辑"
- recyclerView = findViewById(R.id.recycler_view)
+ recyclerView = findViewById(R.id.grvDesk)
recyclerView.layoutManager = LinearLayoutManager(this)
mAdapter = SimpleAdapter(this)
mAdapter.setData(getTestList())
diff --git a/app/src/main/java/com/ds/drag/demo/activity/NotDragHandlerImplActivity.kt b/app/src/main/java/com/ds/drag/demo/activity/NotDragHandlerImplActivity.kt
index 9292aa6..5a93d49 100644
--- a/app/src/main/java/com/ds/drag/demo/activity/NotDragHandlerImplActivity.kt
+++ b/app/src/main/java/com/ds/drag/demo/activity/NotDragHandlerImplActivity.kt
@@ -5,12 +5,11 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
+import com.ds.drag.core.IDragData
+import com.ds.drag.core.SimpleData
import com.ds.drag.core.callback.DragTouchCallback
-import com.ds.drag.demo.IDragData
import com.ds.drag.demo.R
import com.ds.drag.demo.SimpleAdapter
-import com.ds.drag.demo.SimpleData
-import com.ds.drag.demo.handler.AdditionHandlerImpl
/**
* author : linzheng
@@ -29,7 +28,7 @@ class NotDragHandlerImplActivity : AppCompatActivity() {
setContentView(R.layout.activity_simple_handler)
supportActionBar?.title = "没有处理器"
- recyclerView = findViewById(R.id.recycler_view)
+ recyclerView = findViewById(R.id.grvDesk)
recyclerView.layoutManager = LinearLayoutManager(this)
mAdapter = SimpleAdapter(this)
mAdapter.setData(getTestList())
diff --git a/app/src/main/java/com/ds/drag/demo/activity/TestDragActivity.kt b/app/src/main/java/com/ds/drag/demo/activity/TestDragActivity.kt
index 79bd270..289e507 100644
--- a/app/src/main/java/com/ds/drag/demo/activity/TestDragActivity.kt
+++ b/app/src/main/java/com/ds/drag/demo/activity/TestDragActivity.kt
@@ -10,10 +10,10 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
-import com.ds.drag.demo.IDragData
+import com.ds.drag.core.IDragData
+import com.ds.drag.core.SimpleData
import com.ds.drag.demo.R
import com.ds.drag.demo.SimpleAdapter
-import com.ds.drag.demo.SimpleData
/**
* author : linzheng
@@ -24,7 +24,7 @@ import com.ds.drag.demo.SimpleData
*/
class TestDragActivity : AppCompatActivity() {
- private val recyclerView: RecyclerView by lazy { findViewById(R.id.recycler_view) }
+ private val recyclerView: RecyclerView by lazy { findViewById(R.id.grvDesk) }
private val mAdapter: SimpleAdapter by lazy { SimpleAdapter(this) }
@@ -63,7 +63,7 @@ class TestDragCallback(val adapter: SimpleAdapter) : ItemTouchHelper.Callback()
override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {
- val flag = ItemTouchHelper.UP or ItemTouchHelper.DOWN
+ val flag = ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
return makeMovementFlags(flag, 0)
}
diff --git a/app/src/main/java/com/ds/drag/demo/handler/AdditionHandlerImpl.kt b/app/src/main/java/com/ds/drag/demo/handler/AdditionHandlerImpl.kt
index e4de64e..07f20ec 100644
--- a/app/src/main/java/com/ds/drag/demo/handler/AdditionHandlerImpl.kt
+++ b/app/src/main/java/com/ds/drag/demo/handler/AdditionHandlerImpl.kt
@@ -3,10 +3,10 @@ package com.ds.drag.demo.handler
import android.annotation.SuppressLint
import android.util.Log
import androidx.recyclerview.widget.RecyclerView
+import com.ds.drag.core.IDragData
+import com.ds.drag.core.SimpleData
import com.ds.drag.core.callback.IDragHandler
-import com.ds.drag.demo.IDragData
import com.ds.drag.demo.SimpleAdapter
-import com.ds.drag.demo.SimpleData
/**
* author : linzheng
@@ -43,8 +43,8 @@ class AdditionHandlerImpl(private val recyclerView: RecyclerView, private val ad
return
}
- val value1 = (fromData as? SimpleData)?.value
- val value2 = (toData as? SimpleData)?.value
+ val value1 = (fromData as? SimpleData)?.id
+ val value2 = (toData as? SimpleData)?.id
if (value1 != null && value2 != null) {
val newValue = value1 + value2
val data = SimpleData(newValue)
diff --git a/app/src/main/java/com/ds/drag/demo/handler/FolderHandlerImpl.kt b/app/src/main/java/com/ds/drag/demo/handler/FolderHandlerImpl.kt
index 9203114..92db985 100644
--- a/app/src/main/java/com/ds/drag/demo/handler/FolderHandlerImpl.kt
+++ b/app/src/main/java/com/ds/drag/demo/handler/FolderHandlerImpl.kt
@@ -3,9 +3,11 @@ package com.ds.drag.demo.handler
import android.annotation.SuppressLint
import android.util.Log
import androidx.recyclerview.widget.RecyclerView
+import com.ds.drag.core.FolderData
+import com.ds.drag.core.IDragData
+import com.ds.drag.core.SimpleData
import com.ds.drag.core.callback.IDragHandler
-import com.ds.drag.demo.IDragData
-import com.ds.drag.demo.FolderData
+import com.ds.drag.demo.*
import com.ds.drag.demo.SimpleAdapter
/**
@@ -33,6 +35,13 @@ class FolderHandlerImpl(private val recyclerView: RecyclerView, private val adap
override fun onAfterSwap(fromPosition: Int, toPosition: Int) {
recyclerView.adapter?.notifyItemMoved(fromPosition, toPosition)
+ //修改后的数据回传给原列表
+ adapter.mList.forEachIndexed { index, iDragData ->
+ if(iDragData is SimpleData){
+ Log.d(TAG, "onAfterSwap: $index -> ${(iDragData as SimpleData).id}")
+ }
+ }
+
}
override fun onMergeData(fromPosition: Int, toPosition: Int) {
@@ -49,7 +58,7 @@ class FolderHandlerImpl(private val recyclerView: RecyclerView, private val adap
// 添加文件夹标识
val folderId = toData.getFolderId()
fromData.setFolderId(folderId)
- toData.list.add(fromData)
+ toData.list.add(fromData as SimpleData)
notifyDataSetChanged()
mergedListener?.invoke(toData)
} else { // 场景2:目标位置是文件夹
@@ -60,8 +69,8 @@ class FolderHandlerImpl(private val recyclerView: RecyclerView, private val adap
folderTab.setFolderId(folderId)
fromData.setFolderId(folderId)
toData.setFolderId(folderId)
- folderTab.list.add(toData)
- folderTab.list.add(fromData)
+ folderTab.list.add(toData as SimpleData)
+ folderTab.list.add(fromData as SimpleData)
// 添加文件夹数据,将选中的item移除
list.add(toPosition, folderTab)
list.remove(toData)
diff --git a/app/src/main/java/com/ds/drag/demo/handler/FolderInnerHandlerImpl.kt b/app/src/main/java/com/ds/drag/demo/handler/FolderInnerHandlerImpl.kt
new file mode 100644
index 0000000..4e36171
--- /dev/null
+++ b/app/src/main/java/com/ds/drag/demo/handler/FolderInnerHandlerImpl.kt
@@ -0,0 +1,58 @@
+package com.ds.drag.demo.handler
+
+import androidx.recyclerview.widget.RecyclerView
+import com.ds.drag.core.FolderData
+import com.ds.drag.core.IDragData
+import com.ds.drag.core.SimpleData
+import com.ds.drag.core.callback.IDragHandler
+import com.ds.drag.demo.SimpleAdapter
+
+/**
+ * author : linzheng
+ * e-mail : z.hero.dodge@gmail.com
+ * time : 2022/7/11
+ * desc : 合并成文件夹
+ * version: 1.0
+ */
+class FolderInnerHandlerImpl(private val recyclerView: RecyclerView,private val adapter: SimpleAdapter, private val listAdapter: SimpleAdapter) : IDragHandler {
+
+ companion object {
+ const val TAG = "DragHandlerImpl"
+ }
+
+ var mergedListener: ((data: IDragData) -> Unit)? = null
+
+ override fun swapPosition(fromPosition: Int, toPosition: Int): Boolean {
+ return recyclerView?.isEnabled
+ }
+
+ override fun onBeforeSwap(fromPosition: Int, toPosition: Int) {
+
+ }
+
+ override fun onAfterSwap(fromPosition: Int, toPosition: Int) {
+ recyclerView.adapter?.notifyItemMoved(fromPosition, toPosition)
+ //todo 文件夹展开内的图标换位后更新文件夹预览页面
+ var list= (listAdapter.getDragData().get(listAdapter.getDragData().size-1) as FolderData).list
+ list.clear()
+ list.addAll(adapter.getDragData() as List)
+ listAdapter.notifyItemChanged(listAdapter.getDragData().size-1);
+ }
+
+ override fun onMergeData(fromPosition: Int, toPosition: Int) {
+ TODO("Not yet implemented")
+ }
+
+ override fun onStartDrag(viewHolder: RecyclerView.ViewHolder?) {
+ TODO("Not yet implemented")
+ }
+
+ override fun onStopDrag(performMerge: Boolean) {
+ TODO("Not yet implemented")
+ }
+
+
+
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/ds/drag/demo/handler/MultiplyHandlerImpl.kt b/app/src/main/java/com/ds/drag/demo/handler/MultiplyHandlerImpl.kt
index 3367a5b..a4e785d 100644
--- a/app/src/main/java/com/ds/drag/demo/handler/MultiplyHandlerImpl.kt
+++ b/app/src/main/java/com/ds/drag/demo/handler/MultiplyHandlerImpl.kt
@@ -3,10 +3,10 @@ package com.ds.drag.demo.handler
import android.annotation.SuppressLint
import android.util.Log
import androidx.recyclerview.widget.RecyclerView
+import com.ds.drag.core.IDragData
+import com.ds.drag.core.SimpleData
import com.ds.drag.core.callback.IDragHandler
-import com.ds.drag.demo.IDragData
import com.ds.drag.demo.SimpleAdapter
-import com.ds.drag.demo.SimpleData
/**
* author : linzheng
@@ -43,8 +43,8 @@ class MultiplyHandlerImpl(private val recyclerView: RecyclerView, private val ad
return
}
- val value1 = (fromData as? SimpleData)?.value
- val value2 = (toData as? SimpleData)?.value
+ val value1 = (fromData as? SimpleData)?.id
+ val value2 = (toData as? SimpleData)?.id
if (value1 != null && value2 != null) {
val newValue = value1 * value2
val data = SimpleData(newValue)
diff --git a/app/src/main/res/drawable/bmlxd.png b/app/src/main/res/drawable/bmlxd.png
new file mode 100644
index 0000000..4169d7a
Binary files /dev/null and b/app/src/main/res/drawable/bmlxd.png differ
diff --git a/app/src/main/res/drawable/glbm.png b/app/src/main/res/drawable/glbm.png
new file mode 100644
index 0000000..70e7717
Binary files /dev/null and b/app/src/main/res/drawable/glbm.png differ
diff --git a/app/src/main/res/drawable/glyg.png b/app/src/main/res/drawable/glyg.png
new file mode 100644
index 0000000..036068b
Binary files /dev/null and b/app/src/main/res/drawable/glyg.png differ
diff --git a/app/src/main/res/drawable/gzhb.png b/app/src/main/res/drawable/gzhb.png
new file mode 100644
index 0000000..5692398
Binary files /dev/null and b/app/src/main/res/drawable/gzhb.png differ
diff --git a/app/src/main/res/drawable/gztz.png b/app/src/main/res/drawable/gztz.png
new file mode 100644
index 0000000..11436bc
Binary files /dev/null and b/app/src/main/res/drawable/gztz.png differ
diff --git a/app/src/main/res/drawable/kqdk.png b/app/src/main/res/drawable/kqdk.png
new file mode 100644
index 0000000..d2bb1eb
Binary files /dev/null and b/app/src/main/res/drawable/kqdk.png differ
diff --git a/app/src/main/res/drawable/qtsx.png b/app/src/main/res/drawable/qtsx.png
new file mode 100644
index 0000000..0d549ab
Binary files /dev/null and b/app/src/main/res/drawable/qtsx.png differ
diff --git a/app/src/main/res/drawable/rwmb.png b/app/src/main/res/drawable/rwmb.png
new file mode 100644
index 0000000..38c1963
Binary files /dev/null and b/app/src/main/res/drawable/rwmb.png differ
diff --git a/app/src/main/res/drawable/se_folder_bg.xml b/app/src/main/res/drawable/se_folder_bg.xml
index 361655e..62f8642 100644
--- a/app/src/main/res/drawable/se_folder_bg.xml
+++ b/app/src/main/res/drawable/se_folder_bg.xml
@@ -4,16 +4,16 @@
-
-
-
+
+
-
-
-
+
+
diff --git a/app/src/main/res/drawable/spsx.png b/app/src/main/res/drawable/spsx.png
new file mode 100644
index 0000000..a149038
Binary files /dev/null and b/app/src/main/res/drawable/spsx.png differ
diff --git a/app/src/main/res/drawable/txl.png b/app/src/main/res/drawable/txl.png
new file mode 100644
index 0000000..4fbb819
Binary files /dev/null and b/app/src/main/res/drawable/txl.png differ
diff --git a/app/src/main/res/drawable/wdyp.png b/app/src/main/res/drawable/wdyp.png
new file mode 100644
index 0000000..e4e2ab7
Binary files /dev/null and b/app/src/main/res/drawable/wdyp.png differ
diff --git a/app/src/main/res/drawable/zdlc.png b/app/src/main/res/drawable/zdlc.png
new file mode 100644
index 0000000..82dcc9b
Binary files /dev/null and b/app/src/main/res/drawable/zdlc.png differ
diff --git a/app/src/main/res/layout/activity_folder.xml b/app/src/main/res/layout/activity_folder.xml
index 46ac829..6a00486 100644
--- a/app/src/main/res/layout/activity_folder.xml
+++ b/app/src/main/res/layout/activity_folder.xml
@@ -44,7 +44,7 @@
android:orientation="horizontal">
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_simple_handler.xml b/app/src/main/res/layout/activity_simple_handler.xml
index 69db966..ba1faac 100644
--- a/app/src/main/res/layout/activity_simple_handler.xml
+++ b/app/src/main/res/layout/activity_simple_handler.xml
@@ -8,7 +8,7 @@
tools:ignore="MissingDefaultResource">
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/empty.xml b/app/src/main/res/layout/empty.xml
new file mode 100644
index 0000000..967bba5
--- /dev/null
+++ b/app/src/main/res/layout/empty.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_folder_data_layout.xml b/app/src/main/res/layout/item_folder_data_layout.xml
index 9f6ff26..3942aec 100644
--- a/app/src/main/res/layout/item_folder_data_layout.xml
+++ b/app/src/main/res/layout/item_folder_data_layout.xml
@@ -1,22 +1,64 @@
-
+ android:layout_height="104dp"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
-
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:orientation="vertical"
+ android:paddingVertical="5dp"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent">
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_folder_item_layout.xml b/app/src/main/res/layout/item_folder_item_layout.xml
index 85902b1..14519dc 100644
--- a/app/src/main/res/layout/item_folder_item_layout.xml
+++ b/app/src/main/res/layout/item_folder_item_layout.xml
@@ -1,21 +1,45 @@
-
-
-
+
+ android:orientation="vertical"
+ android:paddingVertical="5dp"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent">
+
+
+
+
-
\ No newline at end of file
+
+
diff --git a/app/src/main/res/layout/item_preview_data_layout.xml b/app/src/main/res/layout/item_preview_data_layout.xml
index ccbfb2e..54bcafa 100644
--- a/app/src/main/res/layout/item_preview_data_layout.xml
+++ b/app/src/main/res/layout/item_preview_data_layout.xml
@@ -1,30 +1,49 @@
-
+ android:layout_height="104dp"
+ android:background="@drawable/se_folder_bg"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
-
-
+ android:gravity="center"
+ android:paddingVertical="5dp"
+ android:orientation="vertical"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent">
-
-
\ No newline at end of file
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/item_simple_data_infolder_layout.xml b/app/src/main/res/layout/item_simple_data_infolder_layout.xml
new file mode 100644
index 0000000..802c68e
--- /dev/null
+++ b/app/src/main/res/layout/item_simple_data_infolder_layout.xml
@@ -0,0 +1,12 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_simple_data_layout.xml b/app/src/main/res/layout/item_simple_data_layout.xml
index 1d56feb..062b289 100644
--- a/app/src/main/res/layout/item_simple_data_layout.xml
+++ b/app/src/main/res/layout/item_simple_data_layout.xml
@@ -1,31 +1,46 @@
-
-
-
-
+
+ android:gravity="center"
+ android:paddingVertical="5dp"
+ android:orientation="vertical"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent">
+
-
+
-
\ No newline at end of file
+
+
diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml
new file mode 100644
index 0000000..64ffb38
--- /dev/null
+++ b/app/src/main/res/values/ids.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/core/build.gradle b/core/build.gradle
index ab53c25..fb0c207 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -22,8 +22,8 @@ android {
}
}
compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_8
- targetCompatibility JavaVersion.VERSION_1_8
+ sourceCompatibility JavaVersion.VERSION_11
+ targetCompatibility JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = '1.8'
@@ -40,6 +40,7 @@ dependencies {
compileOnly 'androidx.core:core-ktx:1.7.0'
compileOnly 'androidx.appcompat:appcompat:1.1.0'
compileOnly "androidx.recyclerview:recyclerview:1.1.0"
+
}
diff --git a/app/src/main/java/com/ds/drag/demo/DataItem.kt b/core/src/main/java/com/ds/drag/core/DataItem.kt
similarity index 77%
rename from app/src/main/java/com/ds/drag/demo/DataItem.kt
rename to core/src/main/java/com/ds/drag/core/DataItem.kt
index f0b3a0c..cf9d7bd 100644
--- a/app/src/main/java/com/ds/drag/demo/DataItem.kt
+++ b/core/src/main/java/com/ds/drag/core/DataItem.kt
@@ -1,4 +1,4 @@
-package com.ds.drag.demo
+package com.ds.drag.core
import java.util.concurrent.CopyOnWriteArrayList
@@ -37,10 +37,13 @@ interface IDragData {
/**
* 简单数据结构
*/
-class SimpleData(val value: Int) : IDragData {
-
+class SimpleData(val id: Int) : IDragData {
+ var unreadcount: Int = 0
+ var iconResId: Int = 0
+ var titleName: String = ""
var tempFolderId: String? = null
+
override fun inFolder(): Boolean {
return false
}
@@ -70,12 +73,24 @@ class FolderData : IDragData {
private var id: String? = null
// 文件夹内的数据列表
- val list = CopyOnWriteArrayList()
+ val list = CopyOnWriteArrayList()
override fun inFolder(): Boolean {
return false
}
+ /**
+ * 获取未读数据
+ */
+ fun getUnreadcount():Int{
+ var count=0;
+ if(list!=null){
+ for (simpleData in list) {
+ count+=simpleData.unreadcount
+ }
+ }
+ return count;
+ }
override fun setFolderId(folderId: String?) {
this.id = folderId
}
@@ -85,7 +100,7 @@ class FolderData : IDragData {
}
override fun isCanDrag(): Boolean {
- return true
+ return false
}
}
@@ -97,7 +112,6 @@ class FolderData : IDragData {
class PreviewData : IDragData {
var realData: SimpleData? = null
-
override fun inFolder(): Boolean {
return false
}
diff --git a/core/src/main/java/com/ds/drag/core/callback/DragTouchCallback.kt b/core/src/main/java/com/ds/drag/core/callback/DragTouchCallback.kt
index f4c1276..506c2da 100644
--- a/core/src/main/java/com/ds/drag/core/callback/DragTouchCallback.kt
+++ b/core/src/main/java/com/ds/drag/core/callback/DragTouchCallback.kt
@@ -6,7 +6,10 @@ import android.util.Log
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.ItemTouchHelper.ACTION_STATE_DRAG
import androidx.recyclerview.widget.RecyclerView
+import com.ds.drag.core.FolderData
import com.ds.drag.core.IDragAdapter
+import com.ds.drag.core.IDragData
+import com.ds.drag.core.IDragItem
import kotlin.math.abs
/**
@@ -32,6 +35,7 @@ class DragTouchCallback(
) : ItemTouchHelper.Callback() {
companion object {
+ const val defaultFolderId = "闲置功能"
const val TAG = "DragTouchCallback"
}
// 合并逻辑的处理
@@ -61,9 +65,16 @@ class DragTouchCallback(
if (horizontal) {
dragFlags = dragFlags.or(ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT)
}
+ if(vertical && horizontal){
+ dragFlags = dragFlags.or(ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT)
+ }
}
val swipeFlags = 0
- return makeMovementFlags(dragFlags, swipeFlags)
+// if((recyclerView.adapter as IDragAdapter).getDragData().get(viewHolder.adapterPosition) is FolderData){
+// return makeMovementFlags(0, 0)
+// }else{
+ return makeMovementFlags(dragFlags, swipeFlags)
+// }
}
override fun getAnimationDuration(recyclerView: RecyclerView, animationType: Int, animateDx: Float, animateDy: Float): Long {
@@ -179,14 +190,32 @@ class DragTouchCallback(
}
Log.d(TAG, "findMergeTarget: position = ${target?.adapterPosition}")
if (target != null) {
- onStashMergeHolder(selected, target)
+ /**
+ * 1. 判断当前拖入的图标类型,如果是文件夹类型,则不触发合并
+ * {@link #com.ds.drag.core.callback.DragTouchCallback.defaultFolderId}
+ */
+ //判断当前拖入的图标类型,如果是文件夹类型,则不触发合并
+ var targetItem= dragAdapter.getDragData().get(target.adapterPosition);
+ if(targetItem is FolderData){ //拖入目标是文件夹.目前只能拖入默认创建的文件夹
+ // if( (target as FolderData ).getFolderId().equals(defaultFolderId)){ //
+ onStashMergeHolder(selected, target)
+ // }
+ }
+
} else {
onClearMergeHolder()
}
winnerSetX.clear()
winnerSetY.clear()
}
-
+ fun 判断文件夹ID(): String? {
+ dragAdapter.getDragData().forEach {
+ if (it is FolderData) {
+ return it.getFolderId();
+ }
+ }
+ return null
+ }
/**
* 找到可以触发合并的ViewHolder,暂存对应的ViewHolder信息;
@@ -259,8 +288,8 @@ class DragTouchCallback(
mDragHandler?.onStopDrag(performMerge)
}
}
-
-
+ //第一个合并的文件夹id
+ var firstFolderId:String?=null
/**
* 执行合并操作,并触发回调
*/
@@ -281,7 +310,8 @@ class DragTouchCallback(
override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
val fromPosition = viewHolder.adapterPosition
val toPosition = target.adapterPosition
- val swap = mDragHandler?.swapPosition(fromPosition, toPosition) ?: false
+ //todo 如果目标是文件夹则不交换位置
+ val swap = mDragHandler?.swapPosition(fromPosition, toPosition)?: false && dragAdapter.getDragData().get(toPosition) !is FolderData
if (swap) { // 交换位置
mDragHandler?.onBeforeSwap(fromPosition, toPosition)
val list = dragAdapter.getDragData()
diff --git a/core/src/main/java/com/ds/drag/core/callback/IDragHandler.kt b/core/src/main/java/com/ds/drag/core/callback/IDragHandler.kt
index f557956..6743e8b 100644
--- a/core/src/main/java/com/ds/drag/core/callback/IDragHandler.kt
+++ b/core/src/main/java/com/ds/drag/core/callback/IDragHandler.kt
@@ -27,7 +27,7 @@ interface IDragHandler {
fun onAfterSwap(fromPosition: Int, toPosition: Int)
/**
- * 合并逻辑
+ * 合并逻辑,返回合并后的文件夹id
*/
fun onMergeData(fromPosition: Int, toPosition: Int)
diff --git a/settings.gradle b/settings.gradle
index 250a262..9f1e468 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -3,6 +3,7 @@ pluginManagement {
gradlePluginPortal()
google()
mavenCentral()
+ jcenter()
}
}
dependencyResolutionManagement {
@@ -11,6 +12,7 @@ dependencyResolutionManagement {
google()
maven { url 'https://jitpack.io' }
mavenCentral()
+ jcenter()
}
}
rootProject.name = "RecyclerViewDrag"