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"