2017-07-13 4 views
0

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

     } 

Antwort

-1
Detail.PutExtra(DetailActivity.EXTRA_ID, person[position].Uid); 

Wenn Sie die Person [Position] erhalten, verwenden Sie die Position des Elements in der gefilterten Liste, um ein Element aus der ungefilterten Liste zu übernehmen.

Sie müssen den gefilterten Index (Position) mit den gefilterten Elementen verwenden, um auf das richtige Objekt zuzugreifen. Versuchen Sie, über den Adapter auf die Artikelliste zuzugreifen, um den richtigen Artikel wie folgt zu erhalten:

+0

Wie verwende ich den gefilterten Index bitte? Weil ich deine hervorgehobene Linie in meinem Code habe –

+0

Wie bezieht sich deine Antwort auf, was du gerade gesagt hast? – Switz

+0

Stellen Sie sicher, Klarheit in Ihrer Antwort vor der Veröffentlichung bitte – XamarinDevil