RecyclerView的使用方法和瀑布流的实现

来源:互联网 发布:java wait 例子 编辑:程序博客网 时间:2024/05/29 07:50

RecyclerView的功能十分强大,通过一个RecyclerView可以变换成为listview、gridview、瀑布流,下面就详细介绍一个RecyclerView的具体使用方法
项目示例截图:


1、首先找到RecyclerView的一个jar包,这个jar包要和你的sdk版本尽量是一致的,要不然有可能会出现找不到资源的错误,jar包路径在

..\sdk\extras\android\support\v7\recyclerview\libs(sdk安装路径下的文件夹)
找到jar包之后可以直接拷贝到项目的libs文件下,然后就可以使用RecyclerView了

2、创建布局文件,示例中的布局文件只放置了一个RecyclerView,代码如下

(注意:要使用<android.support.v7.widget.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="com.example.recyclerviewdemo.MainActivity" >    <<span style="color:#ff6666;">android.support.v7.widget.RecyclerView</span>        android:id="@+id/recyclerview"        android:layout_width="match_parent"        android:layout_height="match_parent" /></RelativeLayout>

3、为RecyclerView的每一个item设置一个布局,这里就简单的使用一个TextView来充当item,内容设置为wrap_content

<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="wrap_content"    android:background="#ffcc00"    android:layout_margin="5dp"    tools:context="com.example.recyclerviewdemo.MainActivity" >    <TextView        android:id="@+id/textView1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentLeft="true"        android:layout_alignParentTop="true"        android:text="TextView" /></RelativeLayout>

4、为RecyclerView设置一个Adapter来实现数据和视图的一个绑定

(RecyclerView的adapter需要继承RecyclerView.Adapter<MyViewholder>这里的MyViewholder是重写的一个Viewholder,RecyclerView的adapter必须结合Viewholder来使用,这对布局的优化起了很大的作用)

RecyclerView的adapter主要有两个方法和一个Viewholder类组成

a、onCreateViewHolder方法,主要是实现把布局文件实例化出来,然后放进我们的Viewholder内部类中进行控件的实例化

public MyViewholder onCreateViewHolder(ViewGroup arg0, int arg1) {// TODO Auto-generated method stubView view = inflater.inflate(R.layout.item, arg0, false);MyViewholder myViewholder = new MyViewholder(view);return myViewholder;}

b、onBindViewHolder方法,主要是将数据和我们的控件绑定在一起,实现数据绑定

public void onBindViewHolder(final MyViewholder arg0, int arg1) {// TODO Auto-generated method stubarg0.textView.setText(list.get(arg1));}

c、ViewHolder内部类,这里我们重写了一个MyViewholder内部类,继承了Viewholder,实现控件的实例化

class MyViewholder extends ViewHolder {TextView textView;public MyViewholder(View arg0) {super(arg0);textView = (TextView) arg0.findViewById(R.id.textView1);}}
通过上面几个方法的完成,我们就可以将数据通过构造方法传入adapter中,实现数据和视图的绑定

5、在MainActivity中,我们需要实例化我们的adapter和RecyclerView

控件的实例化和平时一样,主要讲一下RecyclerView和listveiw等不同的点,RecyclerView主要是通过LayoutManager来进行管理的,通过LayoutManager来实现不同的样式,下面我们来分别介绍一下,通过RecyclerView来实现listview和gridview和瀑布流三种样式

a、实现listview功能

通过使用LinearLayoutManager我们可以实现listveiw的样式

LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);recyclerView.setLayoutManager(layoutManager);
这里是设置了一个垂直方向的listview

b、通过使用GridLayoutManager我们可以实现GridView样式

recyclerView.setLayoutManager(new GridLayoutManager(this, 3,GridLayoutManager.HORIZONTAL, false));
上面参数表示了分3列显示数据,方向为水平方向

c、通过使用StaggeredGridLayoutManager我们可以实现瀑布流样式

recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
通过上面简单的设置我们就可以实现不同的显示样式,方法非常简单

6、上面已经介绍了比较核心的使用代码,下面把项目的源码发布一下

6.1  MainActivity代码

public class MainActivity extends ActionBarActivity {private RecyclerView recyclerView;private List<String> lists;private MyAdapter mAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initData();initView();}//private void initView() {// TODO Auto-generated method stubrecyclerView = (RecyclerView) findViewById(R.id.recyclerview);recyclerView.setAdapter(mAdapter);LinearLayoutManager layoutManager = new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false);recyclerView.setLayoutManager(layoutManager);                //此处是为了添加一个分隔线// recyclerView.addItemDecoration(new DividerItemDecoration(// getApplicationContext(), DividerItemDecoration.VERTICAL_LIST));}private void initData() {// TODO Auto-generated method stublists = new ArrayList<String>();for (int i = 0; i < 20; i++) {if (i % 2 == 0) {lists.add("ggggggggggggggggffffffffffffffggggggggggggggggffffffffffffffggggggggggggggggfffffffffffffffffffffffffkkkkk"+ i);} else {lists.add("gggggggggggggggg" + i);}}mAdapter = new MyAdapter(getApplicationContext(), lists);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// TODO Auto-generated method stubgetMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// TODO Auto-generated method stubswitch (item.getItemId()) {case R.id.listview:recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL, false));break;case R.id.gridview:recyclerView.setLayoutManager(new GridLayoutManager(this, 3));break;case R.id.horizengridview:recyclerView.setLayoutManager(new GridLayoutManager(this, 2,GridLayoutManager.HORIZONTAL, false));break;case R.id.pubuliu:recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));break;case R.id.add:mAdapter.add(1);break;case R.id.delete:mAdapter.delete(1);break;}return true;}}

6.2  MyAdapter代码

public class MyAdapter extends RecyclerView.Adapter<MyViewholder> {private LayoutInflater inflater;private Context context;private List<String> list;public MyAdapter(Context context, List<String> list) {// TODO Auto-generated constructor stubthis.context = context;this.list = list;inflater = LayoutInflater.from(context);}@Overridepublic int getItemCount() {// TODO Auto-generated method stubreturn list.size();}@Overridepublic void onBindViewHolder(final MyViewholder arg0, int arg1) {// TODO Auto-generated method stubarg0.textView.setText(list.get(arg1));}@Overridepublic MyViewholder onCreateViewHolder(ViewGroup arg0, int arg1) {// TODO Auto-generated method stubView view = inflater.inflate(R.layout.item, arg0, false);MyViewholder myViewholder = new MyViewholder(view);return myViewholder;}public void add(int pos) {list.add(pos, "插入新的");this.notifyItemInserted(pos);}public void delete(int pos) {list.remove(pos);this.notifyItemRemoved(pos);}}class MyViewholder extends ViewHolder {TextView textView;public MyViewholder(View arg0) {super(arg0);// TODO Auto-generated constructor stubtextView = (TextView) arg0.findViewById(R.id.textView1);}}

7、注意:本示例,RecyclerView无法响应单击事件,下个博文会介绍怎么给RecyclerView添加单击响应事件,请查看下一个博文


0 0