Ich bin in der Lage, meine RecyclerView durchsuchen, aber was passiert ist, ist das Suchelement, wenn geklickt wird durch die Layout-Position betroffen. Zum Beispiel habe ichSuche durch RecyclerView- XamarinDroid
Mac Book Pro
Nintendo
Nintendo Plus
Wenn ich Nintendo zu suchen, kommt Nintendo erscheint nur in der ersten Position. Wenn ich auf Nintendo klicke, bekomme ich stattdessen die Details von Mac Book Pro. und wenn ich nach etwas wie Nint
suche, wird es Nintendo und Nintendo plus anzeigen, was cool ist. Aber da Nintendo plus jetzt anscheinend auf der 2. Position ist, wenn ich darauf klicke, gibt es mir die Details von Nintendo. Warum beeinflusst die Suche die Layout-Position nicht?
Aktivität
public override bool OnCreateOptionsMenu(IMenu menu)
{
MenuInflater.Inflate(Resource.Menu.top_menus, menu);
var item = menu.FindItem(Resource.Id.search);
var searchview = (Android.Support.V7.Widget.SearchView)MenuItemCompat.GetActionView(item);
searchview.QueryTextChange += (s, e) => adapter.Filter.InvokeFilter(e.NewText);
searchview.QueryTextSubmit += (s, e) =>
{
adapter.NotifyDataSetChanged();
Toast.MakeText(this, "Searched for: " + e.Query, ToastLength.Short).Show();
e.Handled = true;
};
MenuItemCompat.SetOnActionExpandListener(item, new SearchViewExpandListener(adapter));
return base.OnCreateOptionsMenu(menu);
}
private class SearchViewExpandListener : Java.Lang.Object, MenuItemCompat.IOnActionExpandListener
{
private readonly IFilterable _adapter;
public SearchViewExpandListener(IFilterable adapter)
{
_adapter = adapter;
}
public bool OnMenuItemActionCollapse(IMenuItem item)
{
_adapter.Filter.InvokeFilter("");
return true;
}
public bool OnMenuItemActionExpand(IMenuItem item)
{
return true;
}
}
Adapter
public class GameFilter : Filter
{
public readonly GameAdapter _adapter;
public GameFilter(GameAdapter adapter)
{
_adapter = adapter;
}
protected override FilterResults PerformFiltering(ICharSequence constraint)
{
var returnObj = new FilterResults();
var results = new List<Games>();
if (_adapter._originalData == null)
_adapter._originalData = _adapter.games;
if (constraint == null) return returnObj;
if (_adapter._originalData != null && _adapter._originalData.Any())
{
results.AddRange(
_adapter._originalData.Where(
games => games.Name.ToLower().Contains(constraint.ToString())));
}
returnObj.Values = FromArray(results.Select(r => r.ToJavaObject()).ToArray());
returnObj.Count = results.Count;
constraint.Dispose();
return returnObj;
}
protected override void PublishResults(ICharSequence constraint, FilterResults results)
{
using (var values = results.Values)
_adapter.games = values.ToArray<Java.Lang.Object>()
.Select(r => r.ToNetObject <Games>()).ToList();
_adapter.NotifyDataSetChanged();
constraint.Dispose();
results.Dispose();
}
}
Aktivität
adapter = new Adapter(person,this);
rv.SetLayoutManager(new LinearLayoutManager(this));
rv.SetItemAnimator(new DefaultItemAnimator());
rv.SetAdapter(adapter);
adapter.ItemClick -= OnItemClick;
adapter.ItemClick += OnItemClick;
adapter.NotifyDataSetChanged();
void OnItemClick(object sender, int position)
{
Intent Detail = new Intent(this, typeof(DetailActivity));
Detail.PutExtra(DetailActivity.EXTRA_ID, person[position].Uid);
StartActivity(Detail);
}
Wie verwende ich den gefilterten Index bitte? Weil ich deine hervorgehobene Linie in meinem Code habe –
Wie bezieht sich deine Antwort auf, was du gerade gesagt hast? – Switz
Stellen Sie sicher, Klarheit in Ihrer Antwort vor der Veröffentlichung bitte – XamarinDevil