RecyclerView 的由来
- 根据谷歌官方的说明:A flexible view for providing a limited window into a large data set。能够在有限的窗口中展示大数据几个的灵活滑动视图。
- 集合了ListView ,和GirdView,并且标准化了ViewHolder,逻辑被封装了,复用更方便。
- 可以通过布局管理器LayoutManager可以控制item的布局样式,可以设置item的出场动画,设置分割线样式,达到高解耦
RecyclerView 的用法
- RecyclerView 是Support Library的一部分。所以只需要在app/build.gradle中添加以下依赖,便能立即使用或者引用v7包:
compile 'com.android.support:recyclerview-v7:25.3.1'
- xml中引入:
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
- 相关配置
//设置布局管理器
mRecyclerView.setLayoutManager(layoutManager);
//设置adapter
```
mRecyclerView.setAdapter(adapter);
```
//设置item增加、移除动画
```
mRecyclerView.setItemAnimator(new DefaultItemAnimator);
```
//添加分割线
```
mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(),DividerItemDecoration.HORIZONTAL_LIST));
```
public class HomeActivity extends ActionBarActivity
{
private RecyclerView mRecyclerView;
private List<String> mDatas;
private HomeAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_single_recyclerview);
initData();
mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setAdapter(mAdapter = new HomeAdapter());
}
protected void initData()
{
mDatas = new ArrayList<String>();
for (int i = 'A'; i < 'z'; i++)
{
mDatas.add("" + (char) i);
}
}
class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder>
{
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
MyViewHolder holder = new MyViewHolder(LayoutInflater.from(
HomeActivity.this).inflate(R.layout.item_home, parent,
false));
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position)
{
holder.tv.setText(mDatas.get(position));
}
@Override
public int getItemCount()
{
return mDatas.size();
}
class MyViewHolder extends ViewHolder
{
TextView tv;
public MyViewHolder(View view)
{
super(view);
tv = (TextView) view.findViewById(R.id.id_num);
}
}
}
}
1,设置ReceyclerView.ViewHolder
跟listview一样的,用来存放item的对象的,来解决list的优化问题,不用在去设置tag标记了,例子代码如下:
public static class MyViewHolder extends RecyclerView.ViewHolder{
TextView tv;
//ViewHolder是示例Adapter的内部类
public MyViewHolder(View itemView) {
super(itemView);
tv = (TextView) itemView.findViewById(R.id.tv);
}
}
2,设置分割线
listview里面是有设置分割线的属性的android:dividerHeight="10dp"
,但是ReceyclerView是没有支持divider这样的属性,当然你也可以去item里添加分割线或增加margin,但是ReceyclerView更加强大的是可以通过方法自定义分割线mRecyclerView.addItemDecoration()
,常用的:
// 给纵向显示RecyclerView设置分割线
recyclerView.addItemDecoration(new DividerItemDecoration(activity,DividerItemDecoration.VERTICAL));
// 给横向显示RecyclerView设置分割线
recyclerView.addItemDecoration(new DividerItemDecoration(activity,DividerItemDecoration.HORIZONTAL));
其他的不同样式可以自定义类去继承RecyclerView.ItemDecortion,比如:
public class SimpleDividerItemDecoration extends RecyclerView.ItemDecoration {
private Drawable mDivider;
public SimpleDividerItemDecoration(Context context) {
mDivider = context.getResources().getDrawable(R.drawable.line_divider);
}
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
int left = parent.getPaddingLeft();
int right = parent.getWidth() - parent.getPaddingRight();
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
int top = child.getBottom() + params.bottomMargin;
int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
}
3,设置动画效果ItemAnimator
ItemAnimator能帮助Item实现独立的动画。而触发于以下三种事件:
(1)某条item数据被插入到数据集合中
(2)从数据集合中移除某条数据
(3)更改数据集合中的某条数据
可以通过以下代码为item增加动画效果:
recyckerView.setItemAnimator(new DefaultItemAnimator());
在adapter中去添加 插入inserted方法和移除remove方法 如下:
public void addData(int position){
mDatas.add("数据集合");//数据添加
notifyItemInseted(position);
}
public void removeData(int position){
mDatas.remove(position);//数据移除
notifyItemRemoved(position)
}
瀑布流效果实现几步OK:
1,
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,
StaggeredGridLayoutManager.VERTICAL));
设置为错位网格布局管理器StaggeredGridLayoutManager,并设置方向为竖直。
2,在adapter中去设置错位高度
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position)
{
LayoutParams lp = holder.ll.getLayoutParams();
lp.height = mHeights.get(position);
holder.ll.setLayoutParams(lp);
holder.ll.setText(mDatas.get(position));
........
........
}
横向的recyclerView的实现:
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplication()); linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
recyclerView.setLayoutManager(linearLayoutManager);
剩下的适配步骤同上
一般横向滑动是不需要scrollbars的,也不需要过度滑动的阴影效果,5.0以上需要以下设置:
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_img"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never"
android:scrollbars="none" />
listview配置如下:
<ListView
android:id="@+id/lv_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollFooter="@android:color/transparent"
android:overScrollHeader="@android:color/transparent"
android:overScrollMode="never"
android:scrollbars="none">
用法也就这些了!对于添加头布局和脚布局最好用到开源库RefreshLoadMoreLayout去添加。
自定义对于网格布局的脚布局存在错位问题。