StaggeredGridLayoutManager

时间:2021-01-05 11:46:34

标签: android kotlin android-recyclerview staggered-gridview

我在代码中使用了 StaggeredGridLayoutManager

先看看这个:

my

我面临以下问题:

<块引用>

在第一次尝试中,我将瓷砖“1”直接向上移动一步,然后停止。一切看起来都不错,标记为“1”的磁贴替换了标记“2”。

<块引用>

在第二次尝试中,我将标有“3”的图块向上拖动但没有停止。它仍然会自动被 '1' 替换,它就在 '3' 上方。这里有问题。

<块引用>

在我的第 3 次和第 4 次尝试中,我尝试向上和横向拖动我的磁贴。一旦我这样做了,瓷砖会自动右移并移出框架(即使我的触摸仍在握住它)。只有当我向左拖动它时才能看到它。奇怪!

现在看看我的代码

在我的 MainActivity 的 onCreateMethod

val layoutmanager = StaggeredGridLayoutManager(if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) 3 
                                              else 2, StaggeredGridLayoutManager.VERTICAL)
layoutmanager.gapStrategy = StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS
recyclerView.layoutManager = layoutmanager
noteAdapter = NoteAdapter(myList, this)
recyclerView.adapter = noteAdapter

我的ItemTouchHelperCallback方法

private val itemTouchHelperCallback =
            object :
                    ItemTouchHelper.SimpleCallback(0, 0
                    ) {

                override fun isLongPressDragEnabled(): Boolean {
                    return true
                }

                override fun isItemViewSwipeEnabled(): Boolean {
                    return true
                }

                override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {
                    val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN or
                            ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
                    val swipeFlags = ItemTouchHelper.START or ItemTouchHelper.END
                    return makeMovementFlags(dragFlags, swipeFlags)
                }

                override fun onMove(
                        recyclerView: RecyclerView,
                        viewHolder: RecyclerView.ViewHolder,
                        target: RecyclerView.ViewHolder
                ): Boolean {
                    val fromPosition = viewHolder.adapterPosition
                    val toPosition = target.adapterPosition

                    if (fromPosition < toPosition) {
                        for (i in fromPosition until toPosition) {
                            Collections.swap(myList, i, i + 1)
                        }
                    } else {
                        for (i in fromPosition downTo toPosition + 1) {
                            Collections.swap(myList, i, i - 1)
                        }
                    }
                    noteAdapter.notifyItemMoved(fromPosition, toPosition)


                    return false
                }
                override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
                    
                }

            }

更新

@Zain 发现真正的问题隐藏在我的 NoteAdapter.java 中,所以我强调了错误的方法。检查他的回答。

 @Override
    public int getItemViewType(int position) {
        return position;
    }

0 个答案:

没有答案