0

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

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

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

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

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

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

4

1 回答 1

0

ImageButton当我在ListView.

解决方案是更新各个行而不是调用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;
}

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

于 2014-11-13T07:11:28.220 回答