我正在使用listview,需要模拟其中一个列表项的长按,但不存在performItemLongClick方法。 由于View同时执行了clickClick和performLongClick,并且由于ListView已经有performItemClick,因此它似乎也应该有performItemLongClick。 他们可能只是忘记实施或揭露它吗?
无论如何,我的问题是,如何最好地解决这个问题? 我尝试(ab)使用performItemClick并使用id参数来判断它是单击还是长按,但是单击事件显然是在up动作上触发的,所以现在我得到一个longclick,然后立即点击。
我知道我可以在长按一下设置一个标志并忽略下面的点击,但这不是我要找的那种解决方案。我认为这里有人有更好的方法。
由于
答案 0 :(得分:2)
令人遗憾的是,超过3年后仍然没有performItemLongClick()方法。
我知道这是一种解决方法,但你可以试试这个 - 为我工作:
AdapterView.OnItemLongClickListener listener = adapterView.getOnItemLongClickListener();
if (listener != null) {
listener.onItemLongClick(adapterView, view, position, id);
}
最后三个参数与我们缺少的performItemLongClick(...)方法相同。
答案 1 :(得分:1)
我遇到了同样的问题,我认为最好的解决方案就是使用Robotium在Android中进行测试。它清理了我用于简单方法的许多代码行。如需制作长项目,只需solo.clickLongInList(position)
即可。
答案 2 :(得分:0)
截至2014年1月24日,原始问题后两年半,API仍然不支持(级别19 / Android 4.4)。
由于没有人提供任何替代方案,因此必须回答这个问题。
答案 3 :(得分:0)
这是我基于发送触摸事件的解决方案。因此,它不仅调用长单击侦听器处理程序,而且实际上对项目执行长单击:
fun ListView.performItemLongClick(position: Int) {
val itemView = this.adapter.getView(position, null, this)
val coords = intArrayOf(0, 0)
itemView.getLocationOnScreen(coords)
this.performTouch(
x = coords[0].toFloat() + 1f,
y = coords[1].toFloat() + 1f,
MotionEvent.ACTION_DOWN
)
Shadows.shadowOf(Looper.getMainLooper()).idleFor(
ViewConfiguration.getLongPressTimeout().toLong(),
TimeUnit.MILLISECONDS
)
}
fun View.performTouch(x: Float, y: Float, action: Int) {
val downTime = SystemClock.uptimeMillis() - 100
val eventTime = SystemClock.uptimeMillis()
this.dispatchTouchEvent(
MotionEvent.obtain(
downTime,
eventTime,
action,
x,
y,
0
)
)
}
此功能针对机器人使用进行了优化,因此在退出此功能之前,请先长按一下。为了在生产注释中使用此行:Shadows.shadowOf...
用法:
val listView = findViewById(...)
listView.performItemLongClick(3)
答案 4 :(得分:-2)
使用
lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> av, View v, int pos, long id) {
return onLongListItemClick(v,pos,id);
}
});
答案 5 :(得分:-2)
或尝试contextmenu,首先注册listview registerForContextMenu(getListView());
@Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
AdapterView.AdapterContextMenuInfo info;
try {
info = (AdapterView.AdapterContextMenuInfo) menuInfo;
} catch (ClassCastException e) {
Log.e(TAG, "bad menuInfo", e);
return;
}
long l = getListAdapter().getItemId(info.position);
} `