RecyleView 的使用
首先要先导包
可以在gradle中直接输入
compile
'com.android.support:recyclerview-v7:24.2.1'
也可进行下面的操作
导入包后,我们就可以使用RecycleView了
我们先建一个
acvtivity_recyclerview.xml
<LinearLayout
xmlns:
android
=
"http://schemas.android.com/apk/res/android"
android
:orientation=
"vertical"
android
:layout_width=
"match_parent"
android
:layout_height=
"match_parent"
>
<android.support.v7.widget.RecyclerView
android
:id=
"@+id/tvRecyclerView"
android
:layout_width=
"match_parent"
android
:layout_height=
"wrap_content"
/>
</LinearLayout>
我们新建一个
item.xml中,就是显示在列表中的内容,看下图解析
在item。xml中有用到CardView(当然你可以选择不用,只是为了美观);
如果需要用到CardView,也需要在build.gradle中导入CardView的包
compile
'com.android.support:cardview-v7:24.2.1'
item.xml源码
<LinearLayout
xmlns:
android
=
"http://schemas.android.com/apk/res/android"
android
:orientation=
"vertical"
android
:layout_width=
"match_parent"
android
:layout_height=
"match_parent"
>
<android.support.v7.widget.CardView
android
:layout_margin=
"16dp"
android
:layout_width=
"match_parent"
android
:layout_height=
"80dp"
>
<LinearLayout
android
:layout_width=
"match_parent"
android
:layout_height=
"match_parent"
>
<ImageView
android
:layout_width=
"70dp"
android
:background=
"@mipmap/word"
android
:layout_height=
"70dp"
/>
<LinearLayout
android
:layout_width=
"match_parent"
android
:orientation=
"vertical"
android
:layout_height=
"match_parent"
>
<TextView
android
:layout_width=
"match_parent"
android
:layout_height=
"0dp"
android
:layout_weight=
"1"
android
:text=
"我是大辣鸡的男神"
android
:textSize=
"22sp"
/>
<TextView
android
:layout_width=
"match_parent"
android
:layout_height=
"wrap_content"
android
:text=
"1996/7/26"
android
:layout_marginRight=
"26dp"
android
:gravity=
"right"
/>
<TextView
android
:layout_width=
"match_parent"
android
:text=
"下载"
android
:layout_marginTop=
"16dp"
android
:gravity=
"right"
android
:layout_marginRight=
"6dp"
android
:textColor=
"@color/colorPrimary"
android
:layout_height=
"wrap_content"
/>
</LinearLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
</LinearLayout>
好了,布局我们已经写好,接下来是java代码的问题了。在使用RecycleView的时候,当然和ListView一样,需要用到Adapter。
Adapter
是将数据绑定到UI界面上的桥接类。Adapter负责创建显示每个项目的子View和提供对下层数据的访问。
在多数情况下,你不需要创建自己的Adapter。Android提供了一系列Adapter来将数据绑定到UI Widget上。
因为Android负责提供数据和选择用于显示每个项目的View,所以Adapter能快速地修改要绑定的控件的外观和功能。
如果你还觉得太抽象,等下就回明了。
首先,辣鸡你要分析这个item里面,有什么内容,需要做什么。例如,item里面有标题,日期,下载选项,还有一个图片。由于下载的文件格式可能很多种,那么我们需要给每一种都赋予一个不一样的图片。例如,Word的,显示word的图片,ppt显示ppt 的图片。这样就很明了了。还有,不同文件标题也是不一样的。
显示图片,当然是判断文件的后缀咯,所以需要有一个变量来保存文件后缀(其实也可以不要,你可以思考一下)然后下载的文件也需要有文件路径,所以现在应该有的
四个变量
应该是
标题 Title 日期 Date 地址 Url 文件后缀 Suffix
那么,如果你还是每一个文件信息就创建四个变量,不仅代码看起来不好看,还很占内存。所以,我们需要把这四个成员给封装成一个类。我就叫他FileInfo把(其实叫laji还好)
好了,现在我们可以进行Adapter的编写,辣鸡
你需要一个继承自RecyclerView.Adapter的适配器,作用是将数据与每一个item的界面进行绑定。
我们就把这适配器就做LaJiAdapter吧
/**
* Created by jian on 2016/11/26.
*/
public class
RecycleViewAdapter
extends
RecyclerView.Adapter<RecycleViewAdapter.myViewHoder>{
private
Context
context
;
//上下文。这个说起来有点抽象,等你来实验室给你说
private
List<FileInfo>
fileInfos
;
//列表的信息用List来保存,不会用没关系,我等等会说。
public
RecycleViewAdapter
(Context context
,
List<FileInfo> fileInfos) {
this
.
context
= context
;
this
.
fileInfos
= fileInfos
;
}
//创建一个ViewHolder
@Override
public
myViewHoder
onCreateViewHolder
(ViewGroup parent
, int
viewType) {
View v = LayoutInflater.
from
(parent.getContext()).inflate(R.layout.
item_recyclerview
, null, false
)
;
return new
myViewHoder(v)
;
}
//为Viewhoder绑定数据,position个就是表示是第几个。0代表列表的第一个
@Override
public void
onBindViewHolder
(myViewHoder holder
, int
position) {
FileInfo fileInfo =
fileInfos
.get(position)
;
//获取当前位置上的文件信息
holder.
tvTitle
.setText(fileInfo.getmTitle())
;
holder.
tvDate
.setText(fileInfo.getmDate())
;
holder.
tvDownload
.setOnClickListener(
new
View.OnClickListener() {
@Override
public void
onClick
(View v) {
//点击下载后应该做什么???
}
})
;
}
@Override
public int
getItemCount
() {
return
fileInfos
.size()
;
//列表显示的长度
}
class
myViewHoder
extends
RecyclerView.ViewHolder{
TextView
tvTitle
;
//标题
TextView
tvDate
;
//时间
TextView
tvDownload
;
//下载
public
myViewHoder
(View itemView) {
super
(itemView)
;
tvTitle
= (TextView) itemView.findViewById(R.id.
tvTitle
)
;
tvDate
= (TextView) itemView.findViewById(R.id.
tvDate
)
;
tvDownload
= (TextView) itemView.findViewById(R.id.
tvDownload
)
;
}
}
}
PS:
RecyclerView子View宽度不能全屏的问题,在Adapter的onCreateViewHolder创建子view的时候要把parent传进去;
正确写法
LayoutInflater.from(context).inflate(R.layout.
item_view
,parent,false);
错误写法
LayoutInflater.from(context).inflate(R.layout.item_view,null);
Activity中的代码
/**
* Created by jian on 2016/11/26.
*/
public class
RecycleViewActivity
extends
AppCompatActivity {
private
RecyclerView
recyclerView
;
private
List<FileInfo>
fileInfos
;
@Override
protected void
onCreate
(
@Nullable
Bundle savedInstanceState) {
super
.onCreate(savedInstanceState)
;
setContentView(R.layout.
activity_recylerview
)
;
initView()
;
initData()
;
}
//绑定数据
private void
initData
() {
fileInfos
=
new
ArrayList<>()
;
//先用个假数据吧
for
(
int
i =
0
;
i<
10
;
i++){
FileInfo fileInfo =
new
FileInfo(
"标题标题"
,
"1996/7/26"
,null,null
)
;
//最后面的url和后缀设为空 ,因为还没有嘛
fileInfos
.add(fileInfo)
;
}
RecycleViewAdapter adapter =
new
RecycleViewAdapter(
this,
fileInfos
)
;
recyclerView
.setAdapter(adapter)
;
//把适配器绑定给recycleView
recyclerView
.setLayoutManager(
new
LinearLayoutManager(
this
))
;
//设置为列表显示
}
private void
initView
() {
recyclerView
= (RecyclerView) findViewById(R.id.
RecyclerView
)
;
}
}
等待更新.......