暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

从RecyclerView认识适配器设计模式

WTech 2018-03-24
1253



一个只会讲英语的人和一个只会讲中文的人是没有办法沟通的,那么如何让他们可以听得懂对方的话?找个翻译来就解决了。翻译可以将英文、中文互相转化。适配器设计模式就像上面的例子。适配器相当于翻译,解决两边由于接口不兼容而不能互相通信的问题。适配器是多种多样的,就像不同的翻译做不同的语言的翻译。

RecylerView就是用了适配器来完成数据的展示的RecylerView继承ViewGroup,ViewGroup是特殊的视图类,因为它是用来装其他视图控件的。RecyclerViewitemView就是被装进ViewGroup容器中的,这些itemView存放在RecyclerView的一个抽象内部类ViewHolder中的itemView里。我们要派生一个ViewHolder的子类,将自定义视图存在里面。

来看年RecylerView的适配器模式:

RecyclerView说:我只提供ViewHolderitemView这个场地给你展示数据,不负责布局问题 ,除此之外,你都不用管,包在我身上。

DATA数据说:我只提供数据,我也不往你那放数据或设置布局什么的。

谈话陷入了僵局,这时,Adapter适配器站了出来……

Adapter适配器说:把数据给我,我来完成数据在RecyclerView提供的ViewHolderitemView上的显示。

很快一个数据就漂亮地出现在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


文章转载自WTech,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论