Xamarin.Android RecyclerView基础
示例
这是使用的示例AndroidSupportLibraryV7RecyclerView。通常建议使用支持库,因为它们提供了新功能的向后兼容版本,提供了框架中未包含的有用的UI元素,并提供了可用于应用程序的一系列实用程序。
要获取RecyclerView,我们将安装必要的Nuget软件包。首先,我们将搜索v7recyclerview。向下滚动直到看到XamarinAndroidSupportLibrary-v7RecyclerView。选择它,然后单击“添加软件包”。
或者,AndroidSupportLibraryV7RecyclerView可以作为Xamarin组件使用。为了添加组件,请Components在SolutionExplorer中的Android项目中右键单击,然后单击GetMoreComponents。
在出现的“组件存储”窗口中,搜索RecyclerView。在搜索列表中,选择AndroidSupportLibraryV7RecyclerView。然后点击AddtoApp。组件被添加到项目中。
下一步是将RecyclerView添加到页面。在axml(布局)文件中,我们可以添加RecyclerView如下内容。
<android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent" />
对于基本的标准实现,RecyclerView至少需要设置两个帮助器类:Adapter和ViewHolder。Adapter放大项目布局并将数据绑定到RecyclerView中显示的视图。ViewHolder查找并存储视图引用。视图持有者还有助于检测项目视图的点击。
这是适配器类的基本示例
public class MyAdapter : RecyclerView.Adapter { string [] items; public MyAdapter (string [] data) { items = data; } // 创建新视图(由布局管理器调用) public overrideRecyclerView.ViewHolderOnCreateViewHolder (ViewGroup parent, int viewType) { // 设置视图的大小,边距,填充和布局参数 var tv = new TextView (parent.Context); tv.SetWidth(200); tv.Text= ""; var vh = new MyViewHolder (tv); return vh; } // 替换视图的内容(由布局管理器调用) public override void OnBindViewHolder (RecyclerView.ViewHolder viewHolder, int position) { var item = items [position]; // 用该元素替换视图的内容 var holder = viewHolder as MyViewHolder; holder.TextView.Text = items[position]; } public override int ItemCount { get { return items.Length; } } }
在该OnCreateViewHolder方法中,我们首先为View充气,并创建ViewHolder类的实例。该实例必须返回。当需要新的ViewHolder实例时,适配器将调用此方法。不会为每个单元格调用此方法。一旦RecyclerView具有足够的单元格来填充视图,它将重新使用从View中滚动出来的旧单元格来存储其他单元格。
OnBindViewHolder适配器调用该回调以在指定位置显示数据。此方法应更新itemView的内容以反映给定位置的项目。
由于单元格仅包含一个TextView,因此我们可以使用一个简单的ViewHolder,如下所示。
public class MyViewHolder :RecyclerView.ViewHolder { public TextView TextView { get; set; } public MyViewHolder (TextView v) : base (v) { TextView = v; } }
下一步是连接Activity。
RecyclerView mRecyclerView; MyAdapter mAdapter; protected override void OnCreate (Bundle bundle) { base.OnCreate(bundle); SetContentView (Resource.Layout.Main); mRecyclerView = FindViewById<RecyclerView> (Resource.Id.recyclerView); // 插入线性布局管理器: var layoutManager = new LinearLayoutManager (this) { Orientation =LinearLayoutManager.Vertical}; mRecyclerView.SetLayoutManager(layoutManager); mRecyclerView.HasFixedSize= true; var recyclerViewData = GetData(); // 插入我的适配器: mAdapter = new MyAdapter (recyclerViewData); mRecyclerView.SetAdapter(mAdapter); } string[] GetData() { string[] data; . . . return data; }
LayoutManager类负责在RecyclerView中测量和放置项目视图,并确定何时回收用户不再可见的项目视图的策略。在之前RecyclerView,我们必须ListView像在垂直滚动列表中那样使用单元格排列,并在GridView二维可滚动网格中显示项目。但是现在我们可以通过设置不同的LayoutManger来使用RecyclerView实现这两个目标。LinearLayoutManager像在ListView中一样GridLayoutManager排列单元格,并以Grid方式排列单元格。