问题是我想在项目被拖动到 RecyclerView 时对其执行提升。
根据文档的说明,我应该在ItemTouchHelper.Callback#onChildDraw 中自定义拖动视图的行为,因为它说
如果您想自定义视图对用户交互的响应方式,这是一个覆盖的好地方。
然后我应该清除ItemTouchHelper.Callback#clearView 中的自定义,因为它说
当用户与元素的交互结束并且它也完成了它的动画时,由 ItemTouchHelper 调用。
但问题是onChildDraw总是会再调用一次clearView。
所以即使我清除了 中的自定义行为clearView,它仍然会在 中被重新调用onChildDraw。那么这样做的目的是clearView什么?
这是我的代码:
class MyItemTouchCallback extends ItemTouchHelper.Callback {
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
return makeFlag(ItemTouchHelper.ACTION_STATE_DRAG, ItemTouchHelper.UP | ItemTouchHelper.DOWN);
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
mAdapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, …Run Code Online (Sandbox Code Playgroud) 今天我阅读了一些关于 Handler 和 Looper 如何协同工作的博客和源代码。
根据我所学到的,通过使用ThreadLocal魔法,我们可以在每个线程上只有一个 Looper 。通常Handler是在主线程中启动的,否则你必须手动启动或说,prepare将Looper放在一个单独的线程上,然后循环起来。
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
Run Code Online (Sandbox Code Playgroud)
真正让我困惑的是loop()主线程。当我在 Looper 的源代码中读到这个时。处理消息队列然后分派消息以供回调处理是一个无限循环。
根据这个/sf/answers/363578701/,Handler 和它的 Looper 在同一个线程中运行。
如果主线程出现死循环,岂不是阻塞了整个UI系统?
我知道我一定是傻到错过了什么。但如果有人能透露这背后的秘密,那就太好了。
public static void loop() {
final Looper me = myLooper();
if (me == null) {
throw new RuntimeException("No Looper; Looper.prepare() wasn't called …Run Code Online (Sandbox Code Playgroud)