关注RecyclerView也有一段时间了,由于种种原因一直没有自己亲自动手实践一下,现在首先向大家介绍一下RecyclerView,作为替代ListView使RecyclerView标准化了ViewHolder,ListView中convertView是复用的。
以前我们是自己写ViewHolder,Google这次将其标准化,在RecyclerView中,是把ViewHolder作为缓存的单位了,然后convertView作为ViewHolder的成员变量保持在ViewHolder中,也就是说,假设没有屏幕显示10个条目,则会创建10个ViewHolder缓存起来,每次复用的是ViewHolder,所以他把getView这个方法变为了onCreateViewHolder。
总之,RecyclerView比listview更简洁了,ViewHolder更适合多种子布局的列表(现在的项目貌似都有多种子的item,比如listview中间加广告之类的)。RecyclerView不提供setOnItemClickListener方法,你可以在ViewHolder中添加事件。总之,RecyclerView比listview更简洁了。
RecyclerView可以实现横向、纵向滑动视图
使用RecyclerView,必须使用指定一个adapter、定义一个布局管理器。创建adapter必须继承自RecyclerView.Adapter。实施的细节需要看数据类型和需要的视图。
RecyclerView widget
RecyclerView 提供了 LayoutManager,RecylerView 不负责子 View 的布局,我们可以自定义 LayoutManager 来实现不同的布局效果,目前只提供了LinearLayoutManager。 LinearLayoutManager 可以指定方向,默认是垂直, 可以设置成水平。
注意: 必须为RecyclerView 设置LayoutManager,否则回报空指针异常
代码中使用RecyclerView
-------------------------------------------------
首先 添加 android-support-v7-recyclerview.jar
xml布局
<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" >
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical" />
</RelativeLayout>
MainActivity.java
package com.zyh.testrecyclerview;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
public class MainActivity extends Activity {
private RecyclerView mRecyclerView;
private MyRecycleAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
private void initView() {
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
}
private void initData() {
//初始化数据
List<String> list = new ArrayList<String>();
for(int i=0;i<100;i++){
list.add("我是测试条目:"+i);
}
//设置LayoutManager
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
// layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); //水平方向listview
mRecyclerView.setLayoutManager(layoutManager );
//创建Adapter
adapter = new MyRecycleAdapter(list);
mRecyclerView.setAdapter(adapter);
}
}
MyRecycleAdapter.java
package com.zyh.testrecyclerview;
import java.util.List;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class MyRecycleAdapter extends RecyclerView.Adapter<MyRecycleAdapter.ViewHolder> {
private List<String> list;
public MyRecycleAdapter(List<String> list) {
this.list = list;
}
@Override
public int getItemCount() {
return list.size();
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.mTextView.setText(list.get(position));
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int position) {
// 创建一个View,简单起见直接使用系统提供的布局,就是一个TextView
View view = View.inflate(viewGroup.getContext(), android.R.layout.simple_list_item_1, null);
// 创建一个ViewHolder
ViewHolder holder = new ViewHolder(view);
return holder;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView mTextView;
public ViewHolder(View itemView) {
super(itemView);
mTextView = (TextView) itemView;
}
}
}