参考:
(Android dev summit 2015):
https://www.youtube.com/watch?v=imsr8NrIAMs
1、简介
RecyclerView 是新推出的来代替ListView的控件。RecyclerView 标准化了ViewHolder类似于ListViewcontentView用来做视图缓存。
优点:
- 可以通过设置L ayoutManager来实现ListView、grideView和瀑布流效果。
- 而且还可以设置横向和纵向显示。
- 自带ItemAnimation动画。
通过LayoutManager来设置三种显示效果。
LinearLayoutManager:listView,可以横竖方向切换
GrideLayoutManager:GrideView效果
StaggereGrideLayoutMagager:瀑布流效果。
cursor_recyclerview.setLayoutManager(new LinearLayoutManager(this));// 默认纵向 cursor_recyclerview.setLayoutManager(new GridLayoutManager(this, 3));//3:列数 types_recyclerview.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL))
2、实现方式。
a、 首先到导入RecyclerView的support包。
compile
'com.android.support:recyclerview-v7:23.3.0'
b、代码实现:
refresh_ly = (SwipeRefreshLayout) findViewById(R.id.refresh_ly);
//横向和纵向
layoutManager = new LinearLayoutManager(this);
recyclerview.setLayoutManager(layoutManager);
recyclerview.setHasFixedSize(true);//如果每个item的类型是一样的,可以设置为true加快运行效率
c、adapter的是实现,
RecyclerVidew的adapter中,OncreaterViewHolder()中创建视图,在onBindViewHolder中设置数据。
public class MyRecyclerViewAdapterextends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> {
private List<String> mList;
private Context mContext;
private RecyclerView recyclerview;
private RecyclerViewActivity recyclerViewActivity;
public MyRecyclerViewAdapter(Context context, List<String> list, RecyclerView recyclerview) {
mList = list;
mContext = context;
this.recyclerview = recyclerview;
this.recyclerViewActivity = (RecyclerViewActivity) context;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerviewitem, null);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
if (mList != null && mList.size() > position)
holder.menu_title.setText(mList.get(position));
holder.setItemOnClickListener(new MyClicekListener() {
@Override
public void onClick(View view, int position, boolean isLongClick) {
if (position != RecyclerView.NO_POSITION) {
if (isLongClick) {
Toast.makeText(mContext, "长按" + mList.get(position), Toast.LENGTH_SHORT).show();
} else {// 单击
switch (recyclerViewActivity.getCheckMode()) {
case R.id.rb_itemclick:
Toast.makeText(mContext, "点击" + mList.get(position), Toast.LENGTH_SHORT).show();
break;
case R.id.rb_itemadd:
addItem(view);
break;
case R.id.rb_itemdelete:
deleteItem(view);
break;
case R.id.rb_itemchange:
achangeItem(view);
break;
}
}
}
}
});
}
@Override
public int getItemCount() {
return mList.size();
}
/**
* 删除item
*
* @param view 要删除的item
*/
private void deleteItem(View view) {
int pos = recyclerview.getChildAdapterPosition(view);
if (pos != RecyclerView.NO_POSITION) {
mList.remove(pos);
notifyItemRemoved(pos);
}
}
/**
* 添加item
*
* @param view 添加item在这个控件之上
*/
private void addItem(View view) {
int pos = recyclerview.getChildAdapterPosition(view);
if (pos != RecyclerView.NO_POSITION) {
mList.add(pos, "新加的item" + mList.size());//添加的位置,和添加的内容
notifyItemInserted(pos);
}
}
/**
* 添加item
*
* @param view 添加item在这个控件之上
*/
private void achangeItem(View view) {
int pos = recyclerview.getChildAdapterPosition(view);
if (pos != RecyclerView.NO_POSITION) {
mList.set(pos, " 改变的item" + pos);//添加的位置,和添加的内容
notifyItemChanged(pos);
}
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
private TextView menu_title;
private MyClicekListener mOnClickListener;
public ViewHolder(View itemView) {
super(itemView);
menu_title = (TextView) itemView.findViewById(R.id.menu_title);
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
}
public void setItemOnClickListener(MyClicekListener onClickListener) {
mOnClickListener = onClickListener;
}
@Override
public void onClick(View v) {
mOnClickListener.onClick(v, getAdapterPosition(), false);
}
@Override
public boolean onLongClick(View v) {
mOnClickListener.onClick(v, getAdapterPosition(), true);
return true;
}
}
}
a、多类型Item
基本上的逻辑实现跟一般的一样,就是要注意下类型的区分,RecyclerViewAdapter没有了以前的getTypes等方法,而是在OnCreateViewHolder里面有类型参数。
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPES1) {
return new ImageViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerviewimageitem, null));
} else {
return new TextViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerviewitem, null));
}
}
b、cursorAdapter的实现。
RecyclerView没有CursorAdapter,所以要自己写一个adapter,具体参考Demo中Init方法,就是仿照ListView的CursorAdapter写的。大体上一致,就是注册了两个观察者去监听数据库的变化。然后把刷新方法改成notifyDataSetChange()即可。
c、动画。
RecyclerView自带默认动画,要想修改可以通过
recyclerview.setItemAnimator(isChecked ? mDefaultItemAnimator : mDefaultItemAnimator);去修改。不想自己写,可以上github上找开源动画。
一些动画开源参考: