
一个只会讲英语的人和一个只会讲中文的人是没有办法沟通的,那么如何让他们可以听得懂对方的话?找个翻译来就解决了。翻译可以将英文、中文互相转化。适配器设计模式就像上面的例子。适配器相当于翻译,解决两边由于接口不兼容而不能互相通信的问题。适配器是多种多样的,就像不同的翻译做不同的语言的翻译。
RecylerView就是用了适配器来完成数据的展示的。RecylerView继承ViewGroup,ViewGroup是特殊的视图类,因为它是用来装其他视图控件的。RecyclerView的itemView就是被装进ViewGroup容器中的,这些itemView存放在RecyclerView的一个抽象内部类ViewHolder中的itemView里。我们要派生一个ViewHolder的子类,将自定义视图存在里面。
来看年RecylerView的适配器模式:
RecyclerView说:我只提供ViewHolder的itemView这个场地给你展示数据,不负责布局问题 ,除此之外,你都不用管,包在我身上。
DATA数据说:我只提供数据,我也不往你那放数据或设置布局什么的。
谈话陷入了僵局,这时,Adapter适配器站了出来……
Adapter适配器说:把数据给我,我来完成数据在RecyclerView提供的ViewHolder的itemView上的显示。
很快一个数据就漂亮地出现在RecylerView上了,皆大欢喜。
使用RecyclerView的步骤:
(1)目标:展示数据的容器,在布局文件定义RecyclerView。
(2)被适配的对象:数据,就是RecyclerView的展示的数据。
(3)适配器:将数据按RecyclerView的要求转化。
举个例子:
第一步:在布局文件定义RecyclerView。
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.wong.testrecyclerview.MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</android.support.constraint.ConstraintLayout>
第二步:初始化数据。
final String[] data = {"中华人民共和国","","美利坚合众国","中国人民解放军","香港特别行政区","澳门特别行政区","大不列颠","金字塔"};
第三步:创建适配器来撮合两者。
(1)定义itemview布局。RecyclerView接受一个视图,至于视图的布局它是不关心的,给什么视图,它就显示什么。所以这个布局需要我们自己定义。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="60dp">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>
(2)定义一个ViewHolder,用来绑定和存放我们定义的itemview布局。
class MyViewHolder extends RecyclerView.ViewHolder {
public TextView textView;
public MyViewHolder(View itemView) {
super(itemView);
textView = (TextView)itemView.findViewById(R.id.textView);
}
}
(3)利用(1)(2)构建适配器,并连接数据与容器
RecyclerView.Adapter adapter = new RecyclerView.Adapter() {
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item,parent,false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
MyViewHolder myViewHolder = (MyViewHolder)holder;
myViewHolder.textView.setText(data[position]);
}
@Override
public int getItemCount() {
return data.length;
}
};
recyclerview.setLayoutManager(new LinearLayoutManager(MainActivity.this));
recyclerview.setAdapter(adapter);
本文到此。
更多精彩内容请关注公众号:山楂干Linux





