Непроверенный вызов submitList (List <T>) как члена необработанного типа ListAdapter - PullRequest
0 голосов
/ 06 мая 2019

Я копировал приложение Sunflower для архитектуры Android и пока что работает медленно, но успешно, хотя мой код работает, он показывает непроверенное сообщение, поэтому я выполнил запрошенную команду и говорит:this:

[unchecked] непроверенный вызов submitList (List) как члена необработанного типа ListAdapter, где T - переменная типа: T расширяет объект, объявленный в классе ListAdapter

Это, вероятно, не важно, но меня это раздражает, у того, что я использую в качестве ссылки, никогда не было <> вокруг ListAdapter или чего-либо еще и не было предупреждения, поэтому я не уверен, почему мой.

Мой фрагмент:

public class NewsFeedFragment extends Fragment {

    private PinViewModel viewModel;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        FragmentNewsFeedBinding binding = FragmentNewsFeedBinding.inflate(inflater, container, false);
        PinViewModelFactory factory = InjectorUtils.providePinListViewModelFactory(getContext());
        ListAdapter adapter = new PinListAdapter();
        binding.pinList.setAdapter(adapter);
        this.viewModel = ViewModelProviders.of(this, factory).get(PinViewModel.class);
        subscribeUi(adapter);
        return binding.getRoot();
    }

    private void subscribeUi(ListAdapter adapter) {
        this.viewModel.pins.observe(getViewLifecycleOwner(), pins -> {
            if (pins != null) {
                adapter.submitList(pins);
            }
        });
    }
}

Моя модель представления:

public class PinViewModel extends ViewModel {

    private PinRepository pinRepository;

    public LiveData<List<Pin>> pins;

    PinViewModel(@NonNull PinRepository pinRepository) {
        this.pinRepository = pinRepository;
        this.pins = this.pinRepository.getPins();
    }
}

Мой адаптер:

public class PinListAdapter extends ListAdapter<Pin, PinListAdapter.ViewHolder>{

    public PinListAdapter() {
        super(new PinDiffCallback());
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new ViewHolder(ListItemPinBinding.inflate(
                LayoutInflater.from(parent.getContext()), parent, false));
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Pin pin = getItem(position);
        holder.bind(pin);
        holder.itemView.setTag(pin);
    }

    static class ViewHolder extends RecyclerView.ViewHolder {
        private ListItemPinBinding binding;

        ViewHolder(@NonNull ListItemPinBinding binding) {
            super(binding.getRoot());
            this.binding = binding;
        }

        void bind(Pin item) {
            binding.setPin(item);
            binding.executePendingBindings();
        }
    }

    static class PinDiffCallback extends DiffUtil.ItemCallback<Pin> {

        @Override
        public boolean areItemsTheSame(@NonNull Pin oldItem, @NonNull Pin newItem) {
            return oldItem.getId() == (newItem.getId());
        }

        @Override
        public boolean areContentsTheSame(@NonNull Pin oldItem, @NonNull Pin newItem) {
            return oldItem == newItem;
        }
    }
}

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Вы используете

ListAdapter adapter = new PinListAdapter();

Это отбрасывает информацию о типе PinListAdapter. В частности, информация общего типа ListAdapter<Pin, PinListAdapter.ViewHolder>. Поэтому ваш subscribeUi не знает, что ваш ListAdapter принимает список Pin объектов, и вы получаете сообщение об ошибке.

Вы можете изменить свой адаптер на PinListAdapter, и вы получите необходимую информацию о типе.

0 голосов
/ 06 мая 2019

Этот пример написан на Kotlin, а не на Java ...

Неясно, что такое List<T> pins;это, вероятно, должно быть List<Pin> pins:

if (pins != null && pins instanceof List<Pin>) {
    adapter.submitList(pins);
}
...