适配器组件提供数据信息,UI组件渲染这些信息,换而言之,一个适配器告诉UI显示哪些信息。因此如果我们想显示通讯信息,我们需要给RecyclerView一个适配器。该适配器必须继承RecyclerView.Adapter。传递MyHolder类实现ViewHolder模式。
public class MyAdapter extends RecyclerView.Adapter<MyHolder> { ..... }现在我们需要覆盖两个方法以至于能实现我们的逻辑。onCreateViewHolder会在新的ViewHolder实例创建的时候被调用,onBindViewHolder在SO试图绑定数据的时候调用,换句话说,数据显示在UI中时调用。
在这个案例中,适配器帮我们把RecyclerView和CardView结合,之前我们定义的卡片布局将作为RecyclerView的通讯录列表的行。在做这个之前,我们需要定义好数据模型(例如:哪些信息需要显示),为了达到这个目的,我们可以定义一个简单类:
public class ContactInfo { protected String name; protected String surname; protected String email; protected static final String NAME_PREFIX = "Name_"; protected static final String SURNAME_PREFIX = "Surname_"; protected static final String EMAIL_PREFIX = "email_"; }最后,准备创建适配器,如果你还记得之前说过的ViewHolder模式的话,我们需要编写代码来实现它。
public static class ContactViewHolder extends RecyclerView.ViewHolder { protected TextView vName; protected TextView vSurname; protected TextView vEmail; protected TextView vTitle; public ContactViewHolder(View v) { super(v); vName = (TextView) v.findViewById(R.id.txtName); vSurname = (TextView) v.findViewById(R.id.txtSurname); vEmail = (TextView) v.findViewById(R.id.txtEmail); vTitle = (TextView) v.findViewById(R.id.title); } }从代码中看出,在类的构造方法中,我们获取到了定义在卡片布局的试图的引用,现在编写适配器代码:
public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactViewHolder> { private List<ContactInfo> contactList; public ContactAdapter(List<ContactInfo> contactList) { this.contactList = contactList; } @Override public int getItemCount() { return contactList.size(); } @Override public void onBindViewHolder(ContactViewHolder contactViewHolder, int i) { ContactInfo ci = contactList.get(i); contactViewHolder.vName.setText(ci.name); contactViewHolder.vSurname.setText(ci.surname); contactViewHolder.vEmail.setText(ci.email); contactViewHolder.vTitle.setText(ci.name + " " + ci.surname); } @Override public ContactViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View itemView = LayoutInflater. from(viewGroup.getContext()). inflate(R.layout.card_layout, viewGroup, false); return new ContactViewHolder(itemView); } public static class ContactViewHolder extends RecyclerView.ViewHolder { ... } }在代码实现中,绑定数据给试图的时候我们覆盖了onBindViewHolder。注意我们再没有去查找UI组件只是简单地引用存储在CcontactViewHolder中的信息。在onCreateViewHolder返回了ContactViewHolder填充布局的行(这个例子中的CardView)。
运行app,你会看到如下结果:
完整代码可以在github中查看