Как правильно настроить дженерики на Recyclerview SelectionTracker? - PullRequest
0 голосов
/ 21 июня 2019

У меня есть Recyclerview, и я использую SelectionTracker. У меня есть предупреждение:

Unchecked assignment: 'androidx.recyclerview.selection.ItemDetailsLookup.ItemDetails' to 'androidx.recyclerview.selection.ItemDetailsLookup.ItemDetails<java.lang.Long>'

Это я не могу исправить. Если я удалю <Long> из класса ItemDetailsLookup, предупреждение переместится в SelectionTracker Builder. Я прикрепил свой код ниже.

Это мои переопределенные классы:


    class ListItemSelectionPredicate extends SelectionTracker.SelectionPredicate<Long> {
        @Override
        public boolean canSetStateForKey(@NonNull Long key, boolean nextState) {
            return selectionEnabled;
        }

        @Override
        public boolean canSetStateAtPosition(int pos, boolean nextState) {
            return selectionEnabled;
        }

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

    class ListItemKeyProvider extends ItemKeyProvider<Long> {

        private RecyclerView mRecyclerView;

        ListItemKeyProvider(RecyclerView recyclerView) {
            super(ItemKeyProvider.SCOPE_MAPPED);

            mRecyclerView = recyclerView;
        }

        @Override
        public Long getKey(int pos) {
            return listAdapter.getItemId(pos);
        }

        @Override
        public int getPosition(@NonNull Long key) {
            ListAdapter.ViewHolder viewHolder
                    = (ListAdapter.ViewHolder) mRecyclerView.findViewHolderForItemId(key);

            return viewHolder.getLayoutPosition();
        }
    }

    class ListItemDetailsLookup extends ItemDetailsLookup<Long> {

        private RecyclerView mRecyclerView;

        ListItemDetailsLookup(RecyclerView recyclerView) {
            mRecyclerView = recyclerView;
        }

        @Override
        public ItemDetails<Long> getItemDetails(@NonNull MotionEvent e) {
            View view = mRecyclerView.findChildViewUnder(e.getX(), e.getY());

            return view == null
                    ? null
                    : ((ListAdapter.ViewHolder) mRecyclerView.getChildViewHolder(view)).getItemDetails();
        }
    }

Предупреждение в этой строке:

            return view == null
                    ? null
                    : ((ListAdapter.ViewHolder) mRecyclerView.getChildViewHolder(view)).getItemDetails();

Вот мое создание экземпляра SelectionTracker, созданного один раз в onCreate.


        listTracker = new SelectionTracker.Builder<>(
                "list-item-selection"
                , listRecycler
                , new StableIdKeyProvider(listRecycler)
                , new ListItemDetailsLookup(listRecycler)
                , StorageStrategy.createLongStorage())
                .withSelectionPredicate(
                        new ListItemSelectionPredicate()
                )
                .build();

Вот мой метод getItemDetails, он вложен в мой класс viewHolder.


        ItemDetailsLookup.ItemDetails<Long> getItemDetails() {
            return new ItemDetailsLookup.ItemDetails<Long>() {

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

                @Override
                public Long getSelectionKey() {
                    return getItemId();
                }
            };
        }

Предупреждение о приведении типов (я полагаю?) Не должно появляться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...