如何绕过丢失的方法ListView.performItemLongClick?

时间:2011-10-27 13:16:20

标签: android listview

我正在使用listview,需要模拟其中一个列表项的长按,但不存在performItemLongClick方法。 由于View同时执行了clickClick和performLongClick,并且由于ListView已经有performItemClick,因此它似乎也应该有performItemLongClick。 他们可能只是忘记实施或揭露它吗?

无论如何,我的问题是,如何最好地解决这个问题? 我尝试(ab)使用performItemClick并使用id参数来判断它是单击还是长按,但是单击事件显然是在up动作上触发的,所以现在我得到一个longclick,然后立即点击。

我知道我可以在长按一下设置一个标志并忽略下面的点击,但这不是我要找的那种解决方案。我认为这里有人有更好的方法。

由于

6 个答案:

答案 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); 
} `