- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 StaggeredGridLayoutManager
在我的代码中。
先看看这个:
我面临这些问题:
In 1st attempt, I move the tile '1' directly upwards by one step and then stop. Everything looks good and the tile labled as '1' replaces label '2'.
In 2nd attempt, I drag the tile labeled '3' up but do not stop. Still it automatically gets replaced by '1' which is present just above '3'. Something is trouble here.
In my 3rd and 4th attempt, I try to drag my tile up & sideways. Once I do it the tile automatically gets right shifted and out of the frame(even though my touch is still holding it). It can be visible only when I drag it left. Weird!
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) {
}
}
更新
NoteAdapter.java
中。 ,所以我强调错误的方法。检查他的答案。
@Override
public int getItemViewType(int position) {
return position;
}
最佳答案
问题:
从 getItemViewType()
返回项目位置的RecyclerView
适配器;而您只有一种项目 View 类型。
简短回答:
你不应该覆盖 getItemViewType()
将其保持为默认值,或者您可以使其返回 0 以指示适配器存在单个 View 类型。
长答案:
当适配器第一次附加到 RecyclerView 时,RecyclerView 的 LayoutManager 需要知道每个 item 位置的布局类型;并为此调用 getItemViewType(position)
适配器中的每个位置;所以如果适配器列表有 10 个项目,那么它会被调用 10 次;每次调用它时,它都会返回这个特定项目的类型。
当getItemViewType(position)
未覆盖所有项的返回值为 0;这表明所有项目都具有相同的类型。
通过在返回 0 时记录它:
2021-01-13 11:05:25.941 : getItemViewType: Pos = 0 Return: 0
2021-01-13 11:05:25.950 : onBindViewHolder: Pos: 0
2021-01-13 11:05:25.954 : getItemViewType: Pos = 1 Return: 0
2021-01-13 11:05:25.959 : onBindViewHolder: Pos: 1
2021-01-13 11:05:25.962 : getItemViewType: Pos = 2 Return: 0
2021-01-13 11:05:25.970 : onBindViewHolder: Pos: 2
2021-01-13 11:05:25.974 : getItemViewType: Pos = 3 Return: 0
2021-01-13 11:05:25.979 : onBindViewHolder: Pos: 3
2021-01-13 11:05:25.982 : getItemViewType: Pos = 4 Return: 0
2021-01-13 11:05:25.988 : onBindViewHolder: Pos: 4
2021-01-13 11:05:26.000 : getItemViewType: Pos = 0 Return: 0
2021-01-13 11:05:26.001 : getItemViewType: Pos = 1 Return: 0
2021-01-13 11:05:26.001 : getItemViewType: Pos = 2 Return: 0
2021-01-13 11:05:26.001 : getItemViewType: Pos = 3 Return: 0
2021-01-13 11:05:26.001 : getItemViewType: Pos = 4 Return: 0
但是当你改为返回
position
来自
getItemViewType(position)
;那么您拥有的项目类型与您拥有的职位数量一样多(即列表的大小)。
2021-01-13 11:11:30.123 : getItemViewType: Pos = 0 Return: 0
2021-01-13 11:11:30.145 : onBindViewHolder: Pos: 0
2021-01-13 11:11:30.149 : getItemViewType: Pos = 1 Return: 1
2021-01-13 11:11:30.160 : onBindViewHolder: Pos: 1
2021-01-13 11:11:30.164 : getItemViewType: Pos = 2 Return: 2
2021-01-13 11:11:30.172 : onBindViewHolder: Pos: 2
2021-01-13 11:11:30.175 : getItemViewType: Pos = 3 Return: 3
2021-01-13 11:11:30.179 : onBindViewHolder: Pos: 3
2021-01-13 11:11:30.183 : getItemViewType: Pos = 4 Return: 4
2021-01-13 11:11:30.190 : onBindViewHolder: Pos: 4
2021-01-13 11:11:30.199 : getItemViewType: Pos = 0 Return: 0
2021-01-13 11:11:30.199 : getItemViewType: Pos = 1 Return: 1
2021-01-13 11:11:30.200 : getItemViewType: Pos = 2 Return: 2
2021-01-13 11:11:30.200 : getItemViewType: Pos = 3 Return: 3
2021-01-13 11:11:30.200 : getItemViewType: Pos = 4 Return: 4
现在
RecyclerView
处于稳定状态(即填充了所有项目),我们将拖动一个项目并将其放在另一个项目上。
getItemViewType()
时的日志返回 0
2021-01-13 11:14:26.620 : getItemViewType: Pos = 0 Return: 0
2021-01-13 11:14:26.620 : getItemViewType: Pos = 1 Return: 0
2021-01-13 11:14:26.620 : getItemViewType: Pos = 2 Return: 0
2021-01-13 11:14:26.621 : getItemViewType: Pos = 3 Return: 0
2021-01-13 11:14:26.621 : getItemViewType: Pos = 4 Return: 0
这里
getItemViewType
每个位置只调用一次,那是因为您只有一个 View 类型。并且没有调用
onBindViewHolder
正如我们刚才所说的
notifyItemMoved
使
RecyclerView
只有调用获取缓存/回收版本,因为在这种情况下所有 View 类型都是相同的。
getItemViewType()
时的日志返回
position
2021-01-13 11:12:13.659 : getItemViewType: Pos = 0 Return: 0
2021-01-13 11:12:13.660 : getItemViewType: Pos = 1 Return: 1
2021-01-13 11:12:13.660 : getItemViewType: Pos = 2 Return: 2
2021-01-13 11:12:13.660 : getItemViewType: Pos = 2 Return: 2
2021-01-13 11:12:13.665 : onBindViewHolder: Pos: 2
2021-01-13 11:12:13.667 : getItemViewType: Pos = 3 Return: 3
2021-01-13 11:12:13.668 : getItemViewType: Pos = 3 Return: 3
2021-01-13 11:12:13.673 : onBindViewHolder: Pos: 3
2021-01-13 11:12:13.675 : getItemViewType: Pos = 4 Return: 4
2021-01-13 11:12:13.675 : getItemViewType: Pos = 4 Return: 4
2021-01-13 11:12:13.681 : onBindViewHolder: Pos: 4
这里
getItemViewType
被多次调用,因为每个项目都有其唯一的 View 类型,它需要重新计算该 View 类型,并使用
onBindViewHolder
重新绘制(或重新计算布局)项目对于
from
(第 2 项)和
to
(项目 4)项目和中间项目(项目 3)。
关于android - StaggeredGridLayoutManager 中 itemTouchHelperCallback 中的困惑图 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65578247/
我有一个程序可以打开一个窗口并快速改变背景颜色并随机弹出矩形和椭圆形。我的代码有效,但我不知道为什么,因为我没有在我的代码中调用 repaint() 函数。当我使用我个人的 update() 函数包含
var allRapidSpells = $$('input[value^=RSW]'); 谁能告诉我这是做什么的? 最佳答案 我敢猜测您正在使用 MooTools ,一个 JavaScript 框架
我有一个抽象父类,它有多个子类。我希望 child 能够拥有一个对于该 child 的每个实例都相同的变量。我不想将构造函数传递给 child 来告诉它它的名字,因为当它可以被硬编码时,这看起来很愚蠢
我刚刚在 Git 存储库上做了一些糟糕的事情,我不知道如何解决这个问题。我什至不知道我是怎么把它弄成这样的……! 在存储库(托管在 git hub 上)上,有 3 个我感兴趣的分支:master、br
我是 GIT 的新手,在理解提交日志图时遇到问题。 我感觉每条平行线都是一个分支。虽然我的源代码只有 2 个分支。我在下面提供的提交日志图中看到 3-4 条平行线(Microsoft Team Ser
我是 WPF 的新手,ScrollViewer 让我很沮丧。要么我只是没有“得到”它,要么它是一种有限的控制。 这是我的挫折: 水平滚动错误 水平滚动条仅在列表底部可见(我必须滚动到底部才能看到) 坏
那么 $('table.selectable td.capable input:text') 比 $('table.selectable td input:text') 更好吗?换句话说,指定一个类会
我刚刚完成了计算机图形学类(class),我们必须对光线追踪器进行编程。尽管所有结果都是正确的,但我对 OpenMP 的使用感到困惑(顺便说一句,这不是类(class)的一部分)。我有这个循环(C++
与 PatternSynonyms ( explicitly bidirectional form ),pattern-to-expr 方程实际上形成了一个函数,但拼写为大写(假设您最终得到正确类型的
我是 javascript/coffeescript 新手。 有人可以解释一下为什么这个 CoffeeScript/JavaScript 会毫无延迟地快速通过吗?我对第一种情况的想法是,它是对 upd
如果我调用document.getElementsByClassName('cl'),我会得到一个 HTMLCollection。它似乎包含 Element 对象而不是 HTMLElement 对象,
这是我本月的 azure payasyougo 使用费用。 我很难理解为什么我要为标准中型应用服务付费,我认为它会包含在计算时间中?我只运行一个云服务,这对于一个没有做太多事情的云服务来说似乎有点陡峭
除了the issue I am already having之外,我还在I saw a video on it之后安装了HBase(尚未安装)之前,还安装了Zookeeper。在安装它时,我遇到了许
我正在将 XSLT 与 regexp:match exslt 函数一起使用。上述函数采用 JavaScript Regex 模式。因此,我尝试匹配一组数字 1 到 3 OR 5 到 7 OR 9 到
我想知道为什么这段代码会给出消息:SyntaxError:意外的标记其他。 var compare = function(choice1,choice2){ if(choice1===choice2)
我尝试使用复选框和 JQuery 过滤日历上的事件, $(document).ready(function () { $('.scrollable-menu :checkbox').click(f
假设我们有一个用户想要一个名为:“test/lasdhjal.txt”,无论如何。现在,如果我将其放入新的文件(输入)中;对象里面,它会认为 test/是一个文件夹,而它是名称的一部分。我能做什么呢?
问题是 stash 的更改不会留在我 stash 它们的分支中。其他分支存储将被覆盖示例: 我愿意: git checkout iss4 // made some changes gi
我是一个 java 新手,并且在 StackOverflow 错误/在类之间访问文件的能力方面遇到了一个非常令人困惑的问题。我知道根本原因可能是我进行了一些递归调用,但修复它的语法却让我无法理解。我认
public X createData(int n) { int[] values = new int[n]; Random rand = new Random(); for
我是一名优秀的程序员,十分优秀!