Android:如何实现自定义ItemKeyProvider?

时间:2018-11-26 14:26:10

标签: android android-recyclerview androidx

我正在尝试为recyclerview实现新的内部选择机制,该机制在androidx软件包(androidx.recyclerview.selection)中可用,因为它现在也是official tutorial的一部分。

我只关注this example而不是使用Item类对象,而是使用了一个简单的String列表,该列表填充了我的recyclerview。这行之有效,只是现在关键是字符串本身,如果我对多个项目使用相同的文本,它将使选择混乱。我已经尝试实现一些特殊的text + position组合,但似乎没有用。当然,我可以将文本包装在类对象中并且可以工作,但是我想知道如何自己实现键。

public class MyItemKeyProvider extends ItemKeyProvider {
    private final String[] itemList;

    public MyItemKeyProvider(int scope, String[] itemList) {
        super(scope);
        this.itemList = itemList;

// doesn't work:
//        itemsKeys = new String[itemList.length];
//        for(int i = 0; i < itemList.length; i++){
//            itemsKeys[i] = itemList[i] + i;
//        }
    }

    @Nullable
    @Override
    public String getKey(int position) {
        return itemList[position];
    }

    @Override
    public int getPosition(@NonNull Object key) {
        return Arrays.asList(itemList).indexOf(key);
    }
}

在我的ViewHolder中:

    @Override
    public ItemDetailsLookup.ItemDetails getItemDetails() {
        int pos = getAdapterPosition();
        return new MyItemDetail(pos, data[pos]); // + pos doesn't work
    }

和ItemDetail:

public class MyItemDetail extends ItemDetailsLookup.ItemDetails {
    private final int adapterPosition;
    private final String selectionKey;

    public MyItemDetail(int adapterPosition, String selectionKey) {
        this.adapterPosition = adapterPosition;
        this.selectionKey = selectionKey;
    }

    @Override
    public int getPosition() {
        return adapterPosition;
    }

    @Nullable
    @Override
    public Object getSelectionKey() {
        return selectionKey;
    }
}

0 个答案:

没有答案