首页 > 代码库 > RecyclerView初级使用
RecyclerView初级使用
(转载请注明出处:http://www.kennethyo.me/post/android/recyclerviewchu-ji-shi-yong)
RecyclerView
是Android在v7包中包含了一个新的widget,RecyclerView
是一个ListView
进阶版,但不继承与AdapterView
,相比ListView
,RecyclerView
更加灵活和先进。
1,导入RecyclerView
首先要保证SDK Tools
和Android 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链接
RecyclerView初级使用