首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Searching Xamarin.Droid通过RecyclerView进行搜索

使用Searching Xamarin.Droid通过RecyclerView进行搜索
EN

Stack Overflow用户
提问于 2017-07-12 08:03:31
回答 1查看 86关注 0票数 1

我可以通过我的recyclerView搜索,但结果是,当点击搜索项目是受布局位置的影响。例如,我有

  • 任天堂
  • 任天堂加

当我搜索任天堂时,任天堂只出现在第一位。当我点击任天堂时,它会给我提供Mac的详细信息。当我搜索像Nint这样的东西时,它会显示任天堂和任天堂,这是很酷的。但后来,由于任天堂加显然是在第二位,当我点击它,它给我详细的任天堂。为什么搜索不影响布局位置?

活性

代码语言:javascript
复制
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;
            }
        }

适配器

代码语言:javascript
复制
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();           
            }
        }

更新

代码语言:javascript
复制
  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);


                }
EN

回答 1

Stack Overflow用户

发布于 2017-07-12 18:16:22

在您的RecyclerView.Adapter代码中,当您单击某个项目时,您需要取消订阅和订阅Click事件。然后,要执行一个操作,需要调用RecyclerView (而不是Adapter)方法GetChildAdapterPosition。

示例:

代码语言:javascript
复制
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();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45051845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档