android - 带有 hasStableIds 的适配器,使用 GUID 或字符串作为 ID

标签 android listview android-arrayadapter baseadapter

我正在实现自定义 ArrayAdapter<T> , 我想设置 hasStableIds为真。但是我的 T 项目的 ID 是 StringsgetItemId方法返回 longs

所以,我目前正在做的是:

@Override
public boolean hasStableIds() {
    return true;
}

@Override
public long getItemId(int position) {
    return this.getItem(position).getId().hashCode();
}

在哪里getId()返回一个字符串。

这是使用字符串 ID 的正确解决方案吗?
特别是,对于这种情况,字符串 ID 是 GUID,是否有更好的选择?

最佳答案

您不想使用 hashCode(),因为这样,两个不同的 GUID 可能会产生相同的 ID。

只需编写一个映射。像这样的……

private static class GuidToIdMap {
    private final Map<String, Long> guidToIdMapping = new HashMap<String, Long>();
    private final Map<Long, String> idToGuidMapping = new HashMap<Long, String>();

    private long idGenerator = 0;

    public long getIdByGuid(final String guid) {
        if ( ! guidToIdMapping.containsKey(guid)) {
            final long id = idGenerator++;
            guidToIdMapping.put(guid, id);
            idToGuidMapping.put(id,   guid);
        }
        return guidToIdMapping.get(guid);
    }

    public String getGuidById(final long id) {
        if (idToGuidMapping.containsKey(id)) {
            return idToGuidMapping.get(id);
        }
        return null;
    }
}


private final GuidToIdMap guidToIdMap = new GuidToIdMap();

@Override
public boolean hasStableIds() {
    return true;
}

@Override
public long getItemId(int position) {
    final String guid = this.getItem(position).getId();
    return guidToIdMap.getIdByGuid(guid);
}

// Use guidToIdMap.getGuidById(id) where the Android Framework passes you the generated id

性能影响可以忽略不计....

关于android - 带有 hasStableIds 的适配器,使用 GUID 或字符串作为 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26169319/

相关文章:

android - 将Firebase与Kotlin协同程序一起使用:取消作业时不会取消任务

android - 如何使用 MediaRecorder 获取每个录音频率?

android - 将 Xamarin 表单更新到 5.0.0.2401 后,Xamarin 表单 android 抛出空异常

android - 在 Activity 完成之前处理时如何在android Activity 中显示加载消息或对话框或图像?

Android ListView- setListAdapter 和 getListAdapter 出错?

带有进度条的 Android 自定义适配器

android - 在 fragment 中为 ListView 设置适配器

java - Android Volley 多部分参数名称

c# - ListView 鼠标点击事件

android - "getView"- 项目的位置不断变化,我必须点击两次 "Item"