RecyclerView初级使用

来源:互联网 发布:手机怎么登网页淘宝 编辑:程序博客网 时间:2024/06/06 13:09

(转载请注明出处: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,跟其他自定义控件一样,如下:

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

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

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent">        <TextView            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" /></LinearLayout>

下面就是代码了:

@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<VH extends ViewHolder>,并且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链接

0 0
原创粉丝点击