Ошибка CS0115 «OnBindViewHolder (Object, int)»: не найдено подходящего метода для переопределения

Связываю эту библиотеку:

https://github.com/mancj/MaterialSearchBar

И в целом это работает, однако у меня возникает проблема, когда я пытаюсь добавить поддержку RecyclerView, я добавил следующие библиотеки:

И я получил следующие ошибки:

Я попытался последовать этому совету по созданию нескольких частичных классов:

привязка xamarin.android Thorw 'не реализует унаследованные абстрактный член RecyclerView.Adapter.OnCreateViewHolder (ViewGroup, int)

Но это не сработало, и я начал получать дубликаты, лично я считаю, что основная проблема здесь:

Код серьезности Описание Ошибка состояния подавления строки файла проекта CS0115 'SuggestionsAdapter.OnBindViewHolder (Object, int)': не найдено подходящего метода для переопределения Xamarin-MaterialSearchBar C: \ Users \ feder \ source \ repos \ Xamarin-MaterialSearchBar \ Xamarin-MaterialSearchBar \ obj \ Release \ created \ src \ Com.Mancj.Materialsearchbar.Adapter.SuggestionsAdapter.cs 666 Активно

Это конфигурация моего VS 2019:

img1

img1

Единственные зависимости в Gradle проекта следующие:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    testImplementation 'junit:junit:4.12'
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:recyclerview-v7:28.0.0'
    implementation 'com.android.support:cardview-v7:28.0.0'
}

Если вам нужен скомпилированный файл aar и проект для его тестирования.

Как видите, все они у меня есть. Есть идеи, что мне не хватает? Спасибо.


person Federico Navarrete    schedule 23.06.2019    source источник


Ответы (2)


попробуй это,

1. добавьте строки ниже в Xamarin-MaterialSearchBar - Transforms - Metadata.xml.

<remove-node path="/api/package[@name='com.mancj.materialsearchbar.adapter']/class[@name='SuggestionsAdapter']/method[@name='onBindViewHolder']" />

2. в Xamarin-MaterialSearchBar - Дополнения , создайте частичный класс DefaultSuggestionsAdapter

namespace Com.Mancj.Materialsearchbar.Adapter
{
  partial class DefaultSuggestionsAdapter
   {
     public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
      {
        throw new NotImplementedException();
      }

     public override void OnBindSuggestionHolder(Object p0, Object p1, int p2)
      {
        throw new NotImplementedException();
      }
   }
}

Вы также можете обратиться к: Класс Java Binding Abstract не создается.

person Leo Zhu - MSFT    schedule 24.06.2019
comment
Привет, я заметил, что эта идея сложна, потому что такие методы, как OnBindSuggestionHolder, SingleViewHeight или OnBindViewHolder из SuggestionsAdapter, отсутствуют в сгенерированном коде, потому что они присутствуют в аварийном коде. Есть идеи, почему? Я бы сказал, что и в другом случае происходит то же самое. - person Federico Navarrete; 24.06.2019
comment
Я изменил ваши расширения с java.lang.Object на RecyclerView.Adapter, а затем я получаю ту же ошибку, я предполагаю, что связыватель заменяет наследование от RecyclerView.Adapter на java.lang.Object - person Federico Navarrete; 24.06.2019
comment
не могли бы вы поделиться своим проектом? Это поможет быстрее находить ошибки - person Leo Zhu - MSFT; 25.06.2019
comment
Привет, проект находится здесь: dropbox.com/home/MaterialSearchBar, но он используется, вы иметь этот код в Java: @Override public void onBindViewHolder (V-держатель, позиция int) {onBindSuggestionHolder (предложенияs.get (позиция), держатель, позиция); } Однако, как ни странно, связыватель не может его найти, и это основной метод Recycler developer.android.com/reference/android/support/v7/widget/ - person Federico Navarrete; 25.06.2019
comment
Спасибо, потому что это странно, я не могу понять, почему он не может переопределить метод, который является базовым методом RecyclerView.Adapter. - person Federico Navarrete; 25.06.2019
comment
Он не работает, он сообщает мне: Частичный класс с одной частью, а затем я получил две ошибки: OnBindSuggestionHolder нет подходящего метода для переопределения, а следующий: не реализует унаследованный абстрактный класс. У меня также есть сомнения, мы удаляем onBindViewHolder из базового класса, но добавляем его в унаследованный. Меня беспокоит то, что если вы хотите создать собственный адаптер, я думаю, мы должны использовать базовый класс, также я думаю, что ваше предположение верное RecyclerView.ViewHolder по этому поводу, потому что VS создает что-то странное по умолчанию. - person Federico Navarrete; 26.06.2019
comment
Думаю, я заставил это работать, я получил от вас идею, но я переписал класс Java на C #. Спасибо! - person Federico Navarrete; 26.06.2019

Как исправить эту проблему? Технически это не так просто, лучшее решение, и нужно выполнить 6 шагов:

  1. Добавьте следующие пакеты NuGet:

    Это минимальные требования, содержащиеся в build.gradle.

  2. Удалите класс SuggestionsAdapter из будущей библиотеки из своего Metadata.xml с помощью этого фрагмента кода (вдохновленного Лео Чжу - ответ MSFT).

    <remove-node path="/api/package[@name='com.mancj.materialsearchbar.adapter']/class[@name='SuggestionsAdapter']" />

    Почему? Поскольку этот раздел кода неправильно перенесен на C # связывателем; возможно, причина в том, что V представляет собой RecyclerView.ViewHolder и слишком общий для связывателя. Вы можете увидеть исходный код здесь: SuggestionsAdapter.java

    Кроме того, вы можете спросить, почему я решил перенести объект SuggestionsAdapter через DefaultSuggestionsAdapter. На то есть 2 причины:

    • SuggestionsAdapter is the base class.
    • DefaultSuggestionsAdapter вызывает коды XML, к которым вы не можете получить доступ из C #, вы можете увидеть их в строках 34, 55 и 56.
  3. Создайте свою библиотеку.

  4. Создайте новую папку в ваших дополнениях под названием Адаптер, где вам нужно создать класс под названием SuggestionsAdapter.

  5. Перенесите код с Java на C #.

    namespace Com.Mancj.Materialsearchbar.Adapter
    {
        public abstract class SuggestionsAdapter<S, V> : RecyclerView.Adapter, IFilterable
        {
            private readonly LayoutInflater Inflater;
            protected List<S> Suggestions = new List<S>();
            protected List<S> Suggestions_clone = new List<S>();
            protected int MaxSuggestionsCount = 5;
    
            public void AddSuggestion(S r)
            {
                if (MaxSuggestionsCount <= 0)
                {
                    return;
                }
    
                if (r == null)
                {
                    return;
                }
                if (!Suggestions.Contains(r))
                {
                    if (Suggestions.Count >= MaxSuggestionsCount)
                    {
                        Suggestions.RemoveAt(MaxSuggestionsCount - 1);
                    }
                    Suggestions.Insert(0, r);
                }
                else
                {
                    Suggestions.Remove(r);
                    Suggestions.Insert(0, r);
                }
                Suggestions_clone = Suggestions;
                NotifyDataSetChanged();
            }
    
            public void SetSuggestions(List<S> suggestions)
            {
                Suggestions = suggestions;
                Suggestions_clone = suggestions;
                NotifyDataSetChanged();
            }
    
            public void ClearSuggestions()
            {
                Suggestions.Clear();
                Suggestions_clone = Suggestions;
                NotifyDataSetChanged();
            }
    
            public void DeleteSuggestion(int position, S r)
            {
                if (r == null)
                {
                    return;
                }
                //delete item with animation
                if (Suggestions.Contains(r))
                {
                    NotifyItemRemoved(position);
                    Suggestions.Remove(r);
                    Suggestions_clone = Suggestions;
                }
            }
    
            public List<S> GetSuggestions()
            {
                return Suggestions;
            }
    
            public int GetMaxSuggestionsCount()
            {
                return MaxSuggestionsCount;
            }
    
            public void SetMaxSuggestionsCount(int maxSuggestionsCount)
            {
                MaxSuggestionsCount = maxSuggestionsCount;
            }
    
            protected LayoutInflater GetLayoutInflater()
            {
                return Inflater;
            }
    
            public SuggestionsAdapter(LayoutInflater inflater)
            {
                Inflater = inflater;
            }
    
            public abstract int GetSingleViewHeight();
    
            public int GetListHeight()
            {
                return ItemCount * GetSingleViewHeight();
            }
    
            public abstract void OnBindSuggestionHolder(S suggestion, RecyclerView.ViewHolder holder, int position);
    
            public override int ItemCount => Suggestions.Count;
    
            public Filter Filter => null;
    
            public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
            {
                OnBindSuggestionHolder(Suggestions[position], holder, position);
            }
    
            public interface IOnItemViewClickListener
            {
                void OnItemClickListener(int position, View v);
                void OnItemDeleteListener(int position, View v);
            }
        }
    }
    
  6. Создайте снова свой проект и все! Ваша библиотека полностью работает.

Если вы хотите проверить результат.

person Federico Navarrete    schedule 26.06.2019