【问题标题】:How to have my ListView catch onLongClick() (not onItemLongClick)如何让我的 ListView 捕获 onLongClick()(不是 onItemLongClick)
【发布时间】:2014-11-12 11:39:45
【问题描述】:

我有一个ListView,它以高速(每秒 3 次)刷新。

我需要长按这样的ListView(以及父布局); ListView 的高度设置为 wrap_content

我可以捕捉到对父布局的长按,但我希望对任何项目的长按都由父布局处理。

OnItemLongClick 刷新率高,效果不好,我试过onLongClickListenerListView,但是长按没有触发。

行被设置为不可点击、不可聚焦以及行中包含的所有项目。

问题是如果位置/项目无关紧要,如何处理ListView 中任意位置的长按?

【问题讨论】:

  • 为什么要经常刷新这个?也许有更好的方法来解决这个问题。
  • 并非如此,数据正以高速率通过蓝牙传输,用户需要看到演变。也许我必须编写布局容器并使用 onInterceptTouchEvent ?

标签: android listview long-click


【解决方案1】:

当我在ListView 中更新我的下载进度时,我遇到了类似的问题(点击ImageButtons)。

解决方案是更新各个行而不是调用adapter.notifyDataSetChanged()(据我了解,它会干扰您的点击/触摸监听器)。所以要做到这一点,我的问题是准确地找到行。为此,我需要两件事:

  1. URL 字符串映射到我的Transfer 对象 (mPathToTransfers),
  2. URL 列表 (mPathKeys)。

这是来自我的适配器的一些代码:

protected LinkedHashMap<String, BaseTransfer> mPathToTransfers;
protected List<String> mPathKeys;

@Override
public int getCount() {
    mPathKeys = new ArrayList<String>(mPathToTransfers.keySet());
    return mPathToTransfers.size();
}

@Override
public BaseTransfer getItem(int position) {
    return mPathToTransfers.get(mPathKeys.get(position));
}

/**
 * Update transfer (download) progress in ListView's specific row
*/
public void setItemTransferredSize(String path, long transferredSize, ListView lv) {
    if (mPathToTransfers.containsKey(path)) {
        BaseTransfer dItem = (BaseTransfer) mPathToTransfers.get(path);
        dItem.setTransferredSize(transferredSize);

        Holder holder = getViewHolderForTransfer(path, lv);
        if (holder != null)
            setTransferProgressUpdate(holder, dItem);
    }
}

/**
 * Use to get the View Holder of the row of the transfer
 *
 * @param path
 * @param lv
 * @return {@linkplain Holder} for row, if it is visible, null otherwise
 */
private Holder getViewHolderForTransfer(String path, ListView lv) {
    int rowIndex = mPathKeys.indexOf(path);
    if (lv.getFirstVisiblePosition() <= rowIndex && lv.getLastVisiblePosition() >= rowIndex)
        return (Holder) lv.getChildAt(rowIndex - lv.getFirstVisiblePosition()).getTag();
    else
        return null;
}

如果您有歧义,请在下面的 cmets 中提问(或在您问题的 cmets 中)。 :)

【讨论】:

  • 在我的应用程序中,我可以获得的最大行数为 15,最小为 0。确实,我可以为可能的行使用带有元素的简单布局。感谢您的提示。
  • 我不认为所有 15 将同时可见,至少在小型 3.2" 设备上是不可见的。我已经测试过这种方法,它适用于我的 14 或 15 次下载(我正在滚动并且进度更新良好)。但是如果您正在寻找更简单的解决方案,您可能不得不牺牲我的解决方案的通用行为。
  • @francky 如果您确实找到了解决方案,请将其发布为您自己和他人将来参考的答案。
猜你喜欢
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 2012-09-22
相关资源
最近更新 更多