Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过RecyclerView进行搜索-XamarinDroid_C#_Android_Xamarin_Android Recyclerview_Xamarin.android - Fatal编程技术网

C# 通过RecyclerView进行搜索-XamarinDroid

C# 通过RecyclerView进行搜索-XamarinDroid,c#,android,xamarin,android-recyclerview,xamarin.android,C#,Android,Xamarin,Android Recyclerview,Xamarin.android,我可以通过我的recyclerView进行搜索,但接下来发生的事情是,单击时的搜索项目受到布局位置的影响。比如我有 MacBookPro 任天堂 任天堂升级版 当我搜索任天堂时,任天堂只出现在第一位。当我点击任天堂时,它给了我MacBookPro的详细信息。当我搜索像任天堂这样的东西时,它会显示任天堂和任天堂升级版,很酷。但是,由于任天堂plus现在明显处于第二位,当我点击它时,它会给我关于任天堂的详细信息。为什么搜索不影响布局位置 活动 public override bool OnCre

我可以通过我的recyclerView进行搜索,但接下来发生的事情是,单击时的搜索项目受到布局位置的影响。比如我有

  • MacBookPro

  • 任天堂

  • 任天堂升级版

当我搜索任天堂时,任天堂只出现在第一位。当我点击任天堂时,它给了我MacBookPro的详细信息。当我搜索像任天堂这样的东西时,它会显示任天堂和任天堂升级版,很酷。但是,由于任天堂plus现在明显处于第二位,当我点击它时,它会给我关于任天堂的详细信息。为什么搜索不影响布局位置

活动

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 = 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);

         }
适配器

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();           
            }
        }
在获取person[position]时,您使用筛选列表中项目的位置从未筛选列表中获取项目

您需要将筛选索引(位置)与筛选项一起使用,以访问正确的对象。尝试通过适配器访问项目列表以获得正确的项目,如下所示:

var item = adapter.GetItem(position);
Detail.PutExtra(DetailActivity.EXTRA_ID, item.Uid);

请问如何使用过滤后的索引?因为我的代码中有你突出显示的行,你的答案与你刚才说的有什么关系?请在发布之前确保答案清晰。你是如何将Uid映射到项目的?我不理解你的答案
var item = adapter.GetItem(position);
Detail.PutExtra(DetailActivity.EXTRA_ID, item.Uid);