RecyclerView使用实例
1.什么是RecyclerView
RecyclerView是一个比listview更灵活的控件,推荐用于替代listview
2.使用RecyclerView
Demo代码下载
效果图:
2.1.activity_main.xml布局
在activity_main中加入RecyclerView
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycle_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:drawSelectorOnTop="false" />
</RelativeLayout>
2.2.MainAcitivty
在MainActivity中对该View进行设置
mRecyclerView = (RecyclerView) findViewById(R.id.recycle_view);
//设置RecyclerView垂直滚动
LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(llm);
//初始化数据
initData();
//MyAdapter是一个继承自RecyclerView.Adapter的适配器
mAdapter = new MyAdapter(list);
mRecyclerView.setAdapter(mAdapter);
2.3.MyAdapter
MyAdapter是一个继承自RecyclerView.Adapter的适配器。继承RecyelerView.Adapter需要重载三个函数:
public int getItemCount();//获取Adapter中数据的数量
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i);//为每个RecyelerView中的每个Item生成一个View
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i);//设置item中的数据
2.3.1.onCreateViewHolder
onCreateViewHolder返回一个RecyclerView.ViewHolder,其中封装了一个view,该view即为item的视图
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recycle_item_layout, null);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
view.setLayoutParams(lp);
return new PersonViewHolder(view);
}
recycle_item_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rootView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<TextView
android:id="@+id/tvAge"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#00ff00" />
<TextView
android:id="@+id/tvName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ff00ff" />
</LinearLayout>
这里personView是一个继承自RecyclerView.ViewHolder的类
class PersonViewHolder extends RecyclerView.ViewHolder {
public TextView tvAge;
public TextView tvName;
public int position;
public PersonViewHolder(View itemView) {
super(itemView);
tvAge = (TextView) itemView.findViewById(R.id.tvAge);
tvName = (TextView) itemView.findViewById(R.id.tvName);
}
}
2.3.2.onBindViewHolder
数据填充,为第i个item填充响应的数据。这里的personList为MyAdapter的成员函数,一个含有Person数据的List,用于保存要在各item中显示的数据。通过MyAdapter的构造函数完成初始化:
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
PersonViewHolder holder = (PersonViewHolder) viewHolder;
holder.position = i;
Person person = personList.get(i);
holder.tvAge.setText(person.getAge() + "");
holder.tvName.setText(person.getName());
}
2.4.点击item时的响应函数
可在PersonViewHolder中设置
public PersonViewHolder(View itemView) {
super(itemView);
tvAge = (TextView) itemView.findViewById(R.id.tvAge);
tvName = (TextView) itemView.findViewById(R.id.tvName);
View rootView = itemView.findViewById(R.id.rootView);
rootView.setOnClickListener(XXX);
rootView.setOnLongClickListener(XXX);
}