2017-07-12 14 views
2

私はrecyclerViewで検索できますが、クリックしたときの検索項目はレイアウトの影響を受けます。たとえば、私は検索アイコン - Xamarin.Droidを使用してRecyclerViewを検索する

  • マックブックプロ

  • 任天堂

  • 任天堂プラス

を持っている私は任天堂を検索すると、任天堂は唯一の第一の位置に表示されています。任天堂をクリックすると、代わりにMacBook Proの詳細が表示されます。 Nintのようなものを検索すると、NintendoとNintendo plusが表示されます。しかし、その後、任天堂プラスは明らかに2位に入っているので、それをクリックするとニンテンドーの詳細がわかります。検索がレイアウトの位置に影響しないのはなぜですか?

活動

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

アダプタ

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

あなたRecyclerView.Adapterコードで更新

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


       } 

答えて

-1

、あなたのnをアイテムをクリックしたときのClickイベントを購読解除して購読することができます。次に、アクションを実行するには、RecyclerView(アダプタではない)メソッドGetChildAdapterPositionを呼び出す必要があります。

例:

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

私の更新をご覧ください。私はこの行位置= rv.GetChildAdapterPosition((Android.Views.View)sender)でエラーポイントを取得します。キャスト付き –

+0

@Zlatan OnItemClickメソッドのパラメータは、(object sender、int position)の代わりに(object sender、EventArgs e)です。また、RecyclerViewをアダプタに渡していますか(アダプタの変数はrvですか)? – Alexandre

+0

rvは私のアダプターの変数ではなく、自分の活動の中の変数です。 OnItemClickメソッドもアダプタではなく、自分のアクティビティにあります –

関連する問題