[英]Searching through RecyclerView using Search Icon - Xamarin.Droid
I am able to search through my recyclerView but then what happens is, the search item when clicked is being affected by the layout postion. 我可以通过recyclerView进行搜索,但是随后发生的是,单击时的搜索项受到布局位置的影响。 For instance i have
例如我有
Mac Book Pro Mac Book Pro
Nintendo 任天堂
Nintendo plus 任天堂plus
When i search Nintendo, Nintendo comes only appears in the 1st position. 当我搜索Nintendo时,Nintendo只会出现在第一位置。 When i click on Nintendo, it gives me the details of Mac Book Pro instead.
当我单击Nintendo时,它将显示Mac Book Pro的详细信息。 and when i search for something like
Nint
, it will display Nintendo and Nintendo plus which is cool. 当我搜索类似
Nint
,它将显示Nintendo和Nintendo plus,这很酷。 But then, since Nintendo plus is apparently in the 2nd position now, when i click on it, it gives me the details of Nintendo. 但是然后,由于Nintendo plus现在显然位于第二位置,因此当我单击它时,它为我提供了Nintendo的详细信息。 Why is the search not affecting the layout position please?
为什么搜索不影响布局位置?
Activity 活动
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();
}
}
update 更新
void OnItemClick(object sender, int position)
{
position = rv.GetChildAdapterPosition((Android.Views.View)sender);
Intent peaceHeroDetail = new Intent(this, typeof(DetailActivity));
Detail.PutExtra(PeaceHeroDetailActivity.EXTRA_NAME, test[position].Name);
StartActivity(Detail);
}
In your RecyclerView.Adapter code, you need to unsubscribe and subscribe the Click event for when you click on an item. 在您的RecyclerView.Adapter代码中,当您单击某个项目时,需要取消订阅和订阅Click事件。 Then, to perform an action, you need to call the RecyclerView (not Adapter) method GetChildAdapterPosition.
然后,要执行操作,您需要调用RecyclerView(而不是Adapter)方法GetChildAdapterPosition。
Example: 例:
public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
Item item = this.myItems[position];
((ViewHolderItem)holder).Name.Text = item.Name;
((ViewHolderItem)holder).Picture.SetImageBitmap(item.Picture);
// Unsubscribe and subscribe the method, to avoid setting multiple times.
((ViewHolderItem)holder).Item.Click -= Item_Click;
((ViewHolderItem)holder).Item.Click += Item_Click;
}
private void Item_Click(object sender, EventArgs e)
{
int position = this.recyclerView.GetChildAdapterPosition((View)sender);
Item itemClicked = this.myItems[position];
if(itemClicked.Name == "Nintendo"){
Toast.MakeText(this.context, "Nintendo", ToastLength.Long).Show();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.