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

通过RecyclerView - Xamarin.Droid搜索
EN

Stack Overflow用户
提问于 2017-07-09 16:16:20
回答 1查看 1.7K关注 0票数 0

我一直在寻找通过recyclerView搜索的Xamarin方法。有人能给我介绍一下如何用Xamarin的方法来做这个演示吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-10 11:56:16

我编写了一个关于如何实现这个特性的简单演示,效果类似于。您可以在这个GitHub仓库中看到它。

有关更多信息,您可以阅读文档:用ListView对SearchView进行滤波 in Xamarin.Android和Xaver Kapeller的回答 in a RecyclerView with SearchView

谢谢Xaver Kapeller的回答,他关于通过RecyclerView搜索的回答很棒,所以我决定把它翻译成Xamarin,以帮助更多的人。

  1. 设置SearchView

在文件夹中,res/menu创建一个名为main.xml的新文件。在其中添加一个项并将actionViewClass设置为android.support.v7.widget.SearchView。由于使用的是支持库,所以必须使用支持库的命名空间来设置actionViewClass属性。xml文件应该如下所示:

代码语言:javascript
复制
 <?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
     <item android:id="@+id/action_search"
           android:title="Search"
           android:icon="@android:drawable/ic_menu_search"
           app:showAsAction="always|collapseActionView"
           app:actionViewClass="android.support.v7.widget.SearchView" />
  </menu>

在您的Activity中,您必须像往常一样膨胀此菜单xml,然后您可以查找包含SearchViewMenuItem,并在QueryTextChange上添加一个委托,我们将使用该委托来侦听输入到SearchView的文本的更改。

代码语言:javascript
复制
public override bool OnCreateOptionsMenu(IMenu menu)
    {
        MenuInflater.Inflate(Resource.Menu.main, menu);

        var item = menu.FindItem(Resource.Id.action_search);
        var searchView = MenuItemCompat.GetActionView(item);
        _searchView = searchView.JavaCast<Android.Support.V7.Widget.SearchView>();

        _searchView.QueryTextChange += (s, e) => _adapter.Filter.InvokeFilter(e.NewText);

        _searchView.QueryTextSubmit += (s, e) =>
        {
            // Handle enter/search button on keyboard here
            Toast.MakeText(this, "Searched for: " + e.Query, ToastLength.Short).Show();
            e.Handled = true;
        };

        MenuItemCompat.SetOnActionExpandListener(item, new SearchViewExpandListener(_adapter));

        return true;
    }

    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;
        }
    }
  1. 设置Adapter

首先,添加将用于此示例的模型类:

代码语言:javascript
复制
public class Chemical
{
    public string Name { get; set; }

    public int DrawableId { get; set; }
}

这只是您的基本模型,它将在RecyclerView中显示文本。这是显示布局的布局:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:padding="5dp">
    <ImageView
        android:id="@+id/chemImage"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentLeft="true"
        android:layout_margin="5dp" />
    <TextView
        android:id="@+id/chemName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/chemImage"
        android:layout_centerInParent="true"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp" />
 </RelativeLayout>

这是用于ViewHolder类的ChemicalHolder

代码语言:javascript
复制
    public class ChemicalHolder : RecyclerView.ViewHolder
    {
        public ImageView Image { get; private set; }
        public TextView Caption { get; private set; }

        public ChemicalHolder(View itemView) : base(itemView)
        {
            Image = itemView.FindViewById<ImageView>(Resource.Id.chemImage);
            Caption = itemView.FindViewById<TextView>(Resource.Id.chemName);
        }
    }
  1. 实现RecyclerView.Adapter
代码语言:javascript
复制
public class RecyclerViewAdapter : RecyclerView.Adapter, IFilterable
{
    private List<Chemical> _originalData;
    private List<Chemical> _items;
    private readonly Activity _context;

    public Filter Filter { get; private set; }

    public RecyclerViewAdapter(Activity activity, IEnumerable<Chemical> chemicals)
    {
        _items = chemicals.OrderBy(s => s.Name).ToList();
        _context = activity;

        Filter = new ChemicalFilter(this);
    }

    public override long GetItemId(int position)
    {
        return position;
    }


    public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
    {
        View itemView = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.Chemical, parent, false);
        ChemicalHolder vh = new ChemicalHolder(itemView);
        return vh;
    }

    public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
    {
        ChemicalHolder vh = holder as ChemicalHolder;

        var chemical = _items[position];

        vh.Image.SetImageResource(chemical.DrawableId);
        vh.Caption.Text = chemical.Name;
    }

    public override int ItemCount
    {
        get { return _items.Count; }
    }

    public class ChemicalHolder{...

    private class ChemicalFilter{//Implement the Filter logic
 }
  1. 实现过滤逻辑 私有类ChemicalFilter :筛选器{私有只读RecyclerViewAdapter _adapter;公共ChemicalFilter(RecyclerViewAdapter适配器){ _adapter =适配器;}受保护的覆盖FilterResults PerformFiltering(ICharSequence约束){ var returnObj =新FilterResults();var结果=新列表();if (_adapter._originalData == null) _adapter._originalData = _adapter._items;if (约束==空)返回returnObj;if (_adapter._originalData != null && _adapter._originalData.Any()) { //比较约束到所有被小写的名称。//它们包含它们,它们被添加到结果中。results.AddRange( _adapter._originalData.Where(化学results.AddRange} //讨厌的.NET到Java包装),小心这个!returnObj.Values = FromArray(results.Select(r => r.ToJavaObject()).ToArray();returnObj.Count = results.Count;constraint.Dispose();返回returnObj;}保护覆盖PublishResults(ICharSequence约束,FilterResults结果){ see (var值= results.Values) _adapter._items = values.ToArray() .Select(r => r.ToNetObject().ToList();_adapter.NotifyDataSetChanged();//不要这样做,查看GREF计数上升的constraint.Dispose();results.Dispose();}}
  2. 使用它来实现这个特性 SupportActionBar.SetDisplayShowHomeEnabled(true);;SetContentView(Resource.Layout.Main)DrawableId = Resource.Drawable.Icon},新化学{Name = "Biotin",DrawableId = Resource.Drawable.Icon},新化学{Name = "Chromichlorid",DrawableId = Resource.Drawable.Icon},新化学{Name = "Natriumselenit",DrawableId = Resource.Drawable.Icon},新化学{Name =“Mangano硫酸盐”,DrawableId = Resource.Drawable.Icon},新化学品{Name = "Natriummolybdate",DrawableId = Resource.Drawable.Icon},新化学{Name = "Ergocalciferol",DrawableId = Resource.Drawable.Icon},新化学{Name =“氰基钴胺”,DrawableId =Resource.Drawable.Icon };_recyclerView = FindViewById(Resource.Id.recyclerView);_adapter =新RecyclerViewAdapter(此为化学品);_LayoutManager =新LinearLayoutManager(此);RecyclerViewAdapter _recyclerView.SetAdapter(_adapter);//
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44998483

复制
相关文章

相似问题

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