Ошибка CS0115 «... OnBindViewHolder (Object, int)»: не найден подходящий метод для переопределения - PullRequest
0 голосов
/ 23 июня 2019

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

https://github.com/mancj/MaterialSearchBar

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

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

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

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

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

Код серьезности Описание Состояние подавления строки файла проекта Ошибка CS0115 'SuggestionsAdapter.OnBindViewHolder (Object, int)': не найден подходящий метод для переопределения Xamarin-MaterialSearchBar C: \ Users \ feder \ source \ repos \ Xamarin-MaterialSearchBar \ Xamarin-MaterialSearchBar \ obj \ Release \ генерируемый \ 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 и проект протестировали его.

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

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

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

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

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

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

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

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

    Кроме того, вы можете спросить, почему я выбрал перенос адаптера Suggestions через DefaultSuggestionsAdapter . Есть 2 причины:

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

  4. Создайте новую папку в ваших дополнениях с именем Adapter , где вам нужно создать класс с именем 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. Создайте свой проект снова и все! Ваша библиотека полностью работает.

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

0 голосов
/ 24 июня 2019

попробуйте,

1.добавьте строки ниже в вашем Xamarin-MaterialSearchBar - Преобразованиях - 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();
      }
   }
}

Youможет также ссылаться на: Класс привязки Java не создается.

...