问题
I'm binding this library:
https://github.com/mancj/MaterialSearchBar
And generally it works, however, I have an issue when I try to add the support of the RecyclerView, I added the following libraries:
And I got the following errors:
I tried to follow this advice of creating some partial classes:
xamarin.android binding thorw 'does not implement inherited abstract member 'RecyclerView.Adapter.OnCreateViewHolder(ViewGroup, int)'
But it didn't work and I started to get duplicates, personally, I believe the main issue is here:
Severity Code Description Project File Line Suppression State Error CS0115 'SuggestionsAdapter.OnBindViewHolder(Object, int)': no suitable method found to override Xamarin-MaterialSearchBar C:\Users\feder\source\repos\Xamarin-MaterialSearchBar\Xamarin-MaterialSearchBar\obj\Release\generated\src\Com.Mancj.Materialsearchbar.Adapter.SuggestionsAdapter.cs 666 Active
This is the configuration of my VS 2019:
The only dependencies in the Gradle of the project are the following ones:
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'
}
If you want the compiled aar file and the project to test it.
Which as you can see I have them all. Any idea, what am I missing? Thanks.
回答1:
try this,
1.add below lines in your Xamarin-MaterialSearchBar - Transforms - Metadata.xml
<remove-node path="/api/package[@name='com.mancj.materialsearchbar.adapter']/class[@name='SuggestionsAdapter']/method[@name='onBindViewHolder']" />
2.in your Xamarin-MaterialSearchBar - Additions,create a partial class 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 could also refer to : Java Binding Abstract class not being generated.
回答2:
How to fix this issue? Technically, it's not so simple, the best solution and there are 6 steps to follow:
Add the following NuGet Packages:
- Xamarin.Android.Support.v7.AppCompat
- Xamarin.Android.Support.v7.CardView
- Xamarin.Android.Support.v7.RecyclerView
These are the minimum requirements found in the build.gradle.
Remove the class
SuggestionsAdapter
from the future library from your Metadata.xml with this piece of code (inspired by the Leo Zhu - MSFT' answer).<remove-node path="/api/package[@name='com.mancj.materialsearchbar.adapter']/class[@name='SuggestionsAdapter']" />
Why? Because this section of the code is not properly ported to C# by the binder; perhaps, the reason is that the V represents the RecyclerView.ViewHolder and it's too generic for the binder. You can see the original code here: SuggestionsAdapter.java
Also, you might ask why I chose to migrate the SuggestionsAdapter over the DefaultSuggestionsAdapter. There are 2 reasons:
- SuggestionsAdapter is the base class.
- DefaultSuggestionsAdapter calls XML codes that you cannot access from C#, you can see them in the lines 34, 55 and 56.
Build your library.
Create a new folder in your Additions called Adapter where you need to create a class called SuggestionsAdapter.
Migrate the code from Java to 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); } } }
Build your project again and that's all! Your library is fully working.
If you want to check the result.
来源:https://stackoverflow.com/questions/56725489/error-cs0115-onbindviewholderobject-int-no-suitable-method-found-to-ove