(转载请注明出处:http://www.kennethyo.me/post/android/recyclerviewchu-ji-shi-yong)

RecyclerView是Android在v7包中包含了一个新的widget,RecyclerView是一个ListView进阶版,但不继承与AdapterView,相比ListViewRecyclerView更加灵活和先进。

1,导入RecyclerView

首先要保证SDK ToolsAndroid Support Repository为最新版。如下图:



其次,在你的demo工程里选中Project Structure按钮,并且选择app —— Dependencies —— “+” —— Library dependency,去添加支持包,如下图:


最后,在新的对话框里选中com.android.support:recyclerview-v7:21.0.0,点击OK。如下图:


这里就顺利的导入了RecyclerView

2,使用RecyclerView

在布局文件中使用RecyclerView,跟其他自定义控件一样,如下:

 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:id="@+id/recyclerView"        android:layout_width="match_parent"        android:layout_height="match_parent" />

因为日常开发中,我们大多数都是按照UI去布局每个item,所以这里我没与图省事用Android自带的布局。如下:

<?xml version="1.0" encoding="utf-8"?> xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent">                    android:id="@+id/textView"            android:layout_width="match_parent"            android:layout_height="48dp"            android:textStyle="bold"            android:background="@android:color/holo_blue_light"            android:textColor="@android:color/holo_red_light"            android:gravity="center_vertical"            android:paddingLeft="@dimen/activity_horizontal_margin"            android:text="New Text" />

下面就是代码了:

@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);        //LinearLayoutManager可以自定义实现不同的动画效果和布局效果        //这里设置为LinearLayoutManager.HORIZONTAL变成为了一个可以横向滑动的ListView,赞不赞?        LinearLayoutManager layoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);        recyclerView.setLayoutManager(layoutManager);        recyclerView.setHasFixedSize(false);//adapter的改变不会改变RecyclerView的大小        String[] strings = new String[50];        for (int i = 0;i<50;i++){            strings[i] = String.valueOf(i);        }        StringRecyclerAdapter adapter = new StringRecyclerAdapter(strings);        recyclerView.setAdapter(adapter);    }

可以明确看到的是,RecyclerView通过(RecyclerView) findViewById(R.id.recyclerView)初始化之后,不仅要像ListView一样要放入Adapter进行数据和布局的适配,而且还要额外添加一个LinearLayoutManager

这个Manager就是我们的布局管理工具类,这里不仅可以用常规的竖直方向布局,还有横向的滑动的布局,以后再也不会因为没有横向滑动的ListView去头疼自定义了。

通过自定义LinearLayoutManager也可以实现不同的动画效果,和移动效果。
RecyclerView的Adapter和ListView的Adapter也是不同的,RecyclerView的Adapter要继承RecyclerView.Adapter,并且ViewHolder要继承与ViewHolder.RecyclerView,具体代码如下:

public class StringRecyclerAdapter extends RecyclerView.Adapter<StringRecyclerAdapter.ViewHolder> {    private String[] strings;    public StringRecyclerAdapter(String[] strings) {        this.strings = strings;    }    @Override    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {        View view = View.inflate(viewGroup.getContext(), R.layout.adapter_string_recylcer, null);       //这里发现不给item布局添加LayoutParams,会直接默认为WRAP_CONTENT,WRAP_CONTENT布局。        view.setPadding(20, 0,0, 0);        view.setFocusable(true);        RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(                ViewGroup.LayoutParams.MATCH_PARENT,                ViewGroup.LayoutParams.WRAP_CONTENT);        lp.leftMargin = 10;        lp.rightMargin = 5;        lp.topMargin = 20;        lp.bottomMargin = 15;        view.setLayoutParams(lp);        ViewHolder viewHolder = new ViewHolder(view);        return viewHolder;    }    @Override    public void onBindViewHolder(ViewHolder viewHolder, int i) {        viewHolder.textView.setText(StringRecyclerAdapter.class.getSimpleName() + getValueAt(i));    }    public String getValueAt(int i) {        return strings[i];    }    @Override    public int getItemCount() {        return this.strings == null ? 0 : strings.length;    }    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {        public TextView textView;        public ViewHolder(View itemView) {            super(itemView);            textView = (TextView) itemView.findViewById(R.id.textView);            //因为RecyclerView没用setOnItemClickListener,所以在这里实现了点击事件            //况且,现在有越来越多的设计,会在每个item点击不同位置,有不同的响应            textView.setOnClickListener(this);        }        @Override        public void onClick(View v) {            Toast.makeText(v.getContext(),((TextView)v).getText(),Toast.LENGTH_SHORT).show();        }    }}

onCreateViewHolder方法中,我们需要把加载布局和ViewHolder绑定起来,这里有个问题,不知道是Android的bug,还是故意这么设计的,需要我们主动写代码给item设置LayoutParams
onBindViewHolder中负责数据绑定。
这里有一个问题,RecyclerView没有setOnItemClickListener方法,所以我在里面对TextView添加了点击事件,现在有越来越多的设计,会在每个item点击不同位置,有不同的响应。


Demo链接

更多相关文章

  1. 怎么给Android(安卓)控件添加边框(样式)?
  2. ListView中添加Button后,Button的点击事件和ListView的点击事件冲
  3. 【转】 Android上调用google map api v2
  4. Android(安卓)notification点击跳转到Activity,点击返回跳转,前一
  5. Android(安卓)Studio 3.5.1 在项目的build.gradle中添加百分比布
  6. eclipse ADT在线安装 https://dl-ssl.google.com/android/eclips
  7. Android(安卓)修改默认输入法
  8. android UI开发之RecyclerView(一)简单实现
  9. android去除状态栏和下面视图之前的黑线

随机推荐

  1. 【转】android编译系统的makefile文件And
  2. Android之路——第一个Android小程序(Andr
  3. Android多点触控揭秘
  4. android 由于使用Intent传送敏感数据(user
  5. 文章收集
  6. Android开发笔记——查询通话记录及短信
  7. android内嵌H5页面
  8. Android关于GET和POST发送请求
  9. SubscriptionController
  10. 新版 Android Studio 编译输出中文乱码问