RecylerView是Android5.0推出的新控件,相较于ListView和GridView,RecylerView有以下几个特点:
1.不关心Item是否显示在正确的位置上,如何显示。利用LayoutManager来控制RecylerView的显示风格
2.不关心Item之间如何分割。 利用ItemDecoration来设置分割线的效果
3.不关心Item增加与删除的动画效果。利用ItemAnimator来控制动画效果
4.仅仅关注如何回收和复用View。
在RecyLerView中,强制我们使用ViewHolder的模式,这一点要记得。
1.建立布局文件
(1). 建立每个Item的布局
(2). 建立主布局
2.实现RecylerView的Adapter
package com.example.android_recylerview;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
/**
* Created by 前世诀别的一纸书 on 2017/2/23.
*/
public class MyAdapter extends RecyclerView.Adapter {
private LayoutInflater mInflater = null;
private List mDatas = null;
public MyAdapter(Context context, List datas)
{
this.mDatas = datas;
this.mInflater = LayoutInflater.from(context);
}
//创建ViewHolder
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.item_layout, parent, false);
MyViewHolder viewHolder = new MyViewHolder(view);
return viewHolder;
}
//绑定ViewHolder
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.mTextView.setText(mDatas.get(position));
}
@Override
public int getItemCount() {
return mDatas.size();
}
class MyViewHolder extends RecyclerView.ViewHolder
{
public TextView mTextView = null;
public MyViewHolder(View itemView) {
super(itemView);
mTextView = (TextView) itemView.findViewById(R.id.id_textView);
}
}
}
4.在MainActivity中使用RecylerView
//设置布局管理
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL, false); // LinearLayout的布局
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 4); // GridView的布局
StaggeredGridLayoutManager gridLayoutManager1 = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.HORIZONTAL); // 水平的GridView的布局
mRecylerView.setLayoutManager(gridLayoutManager1);
//设置分割线
//mRecylerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
5.将GridView变为瀑布流
以下的代码是在eclipse上实现的,我没在Android studio 上实现成功。。。。
同时Myadapter上里面定义一个List类型的数组,用来存储每个Item的高度,而初始化List数组是利用随机数来初始化的.
for(int i = 0; i < mDatas.size(); i++)
{
mHeights.add((int) (100 + Math.random() * 400));
}
初始化成功后,在onBindVIewHolder中使用
//绑定ViewHolder
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
ViewGroup.LayoutParams layoutParams = holder.mTextView.getLayoutParams();
layoutParams.height = mHeights.get(position);
holder.mTextView.setLayoutParams(layoutParams);
holder.mTextView.setText(mDatas.get(position));
}
6.增加和删除Item的功能
在menu文件下,增加几个Item,将这几个Item加在ActionBar上面。
7.为RecylerView添加动画
这个动画是系统给我们的,是系统实现的。
mRecylerView.setItemAnimator(new DefaultItemAnimator());
8.为Item增加点击事件
由于RecylerView没有为内部的Item实现点击事件,因此我们需要自己来完成点击事件的监听
思路:在Adapter内部定义一个接口,供外部来使用,同时在Adapter内部为每一个Item实现点击事件,事件调用接口里面的方法。
public interface OnItemClickListener
{
void OnItemClick(View view, int pos);
void OnItemLongClick(View view, int pos);
}
private OnItemClickListener mItemOnClickListener = null;
public void setOnItemClickListener(OnItemClickListener itemOnClickener)
{
this.mItemOnClickListener = itemOnClickener;
}
在onBindViewHolder方法里面定义每一个接口的监听事件
@Override
public void onBindViewHolder(final MyViewHolder arg0, final int arg1) {
arg0.mTextView.setText(mDatas.get(arg1));
if(mItemOnClickListener != null)
{
arg0.itemView.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
int oldPosition = arg0.getPosition();
mItemOnClickListener.OnItemClick(arg0.itemView, oldPosition);
}
});
arg0.itemView.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int oldPosition = arg0.getPosition();
mItemOnClickListener.OnItemLongClick(arg0.itemView, arg1);
return false;
}
});
}
}