前言:
上一篇[material design(一)CardView的使用详解](http://blog.csdn.net/fine1938768839/article/details/68925736介绍了material design的第一个控件cradview,这个控件使用起来十分简单,但是效果却非常好,这篇文章是介绍material design的一个最重要最强大的控件—–recycleview。
优势:
- 更大强大。recycleview可以一秒变换listview,gridview以及流式布局。
- 更大可靠。recycleview强制使用viewholder,内部做了优化,使得控件效率更高。
- 可扩展性高。recyclevview做到了真正的解耦合,可以配置多种参数。
- 继承自NestedScrollingChild,控件交互效果更多样
5.。。。
本篇文章主要是介绍recycleview的基本使用方法,主要包括加载数据,间隔设置,增删动画以及点击事件等等。。
使用:
1.看activity中代码:
public class ListViewActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private ListViewAdapter mListViewAdapter;
private List<ListBean> mBeen=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view);
mRecyclerView= (RecyclerView) findViewById(R.id.recycle_view);
//关键,LayoutManager是用来区别listivew,gradview不同效果的。
LinearLayoutManager manager=new LinearLayoutManager(this);
//默认是垂直,也可以设置成水平
manager.setOrientation(LinearLayoutManager.VERTICAL);
//加载manager,体现了松耦合
mRecyclerView.setLayoutManager(manager);
for(int i=0;i<30;i++){
mBeen.add(new ListBean("zhangsan"+i+i));
}
mListViewAdapter=new ListViewAdapter();
//加载适配器
mRecyclerView.setAdapter(mListViewAdapter);
mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
mListViewAdapter.setData(mBeen);
}
}
mRecyclerView.setLayoutManager(manager);很重要,listview的效果就是LinearLayoutManager,gridview效果就是GridLayoutManager,StaggeredGridLayoutManager是瀑布流的效果。
mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));这是设置item的间隔,默认是没有间隔的。
mRecyclerView.setItemAnimator(new DefaultItemAnimator());这是设置数据变动的动画效果。
2.adapter
public class ListViewAdapter extends RecyclerView.Adapter<ListViewAdapter.ViewHolder> {
private Context mContext;
private List<ListBean> mData=new ArrayList<>();
private LayoutInflater inflater;
public List<ListBean> getData() {
return mData;
}
public void setData(List<ListBean> data) {
mData = data;
notifyDataSetChanged();
}
public void addData(List<ListBean> data){
mData.addAll(data);
notifyDataSetChanged();
}
/**
* 复用item布局
* @param parent Recycleview
* @param viewType type类型
* @return 内部类viewhodler对象
*/
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if(mContext==null){
mContext=parent.getContext();
inflater=LayoutInflater.from(mContext);
}
View view= inflater.inflate(R.layout.listview_item,parent,false);
Log.i("sssss1",parent.toString()+" "+viewType);
return new ListViewAdapter.ViewHolder(view);
}
/**
*
* @param holder onCreateViewHolder返回的holder
* @param position 位置
*/
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
Log.i("sssss2",holder.toString()+" "+position);
ListBean bean=mData.get(position);
holder.mTextView.setText(bean.getName());
//点击事件
holder.mTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addData(position);
}
});
//长按事件
holder.mTextView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
removeData(position);
return false;
}
});
}
@Override
public int getItemViewType(int position) {
return super.getItemViewType(position);
}
@Override
public int getItemCount() {
return mData.size();
}
/**
* ViewHolder的内部类,View为item的布局,其他小的控件
* 可以findviewbyid获得,这个view就是textview
*/
static class ViewHolder extends RecyclerView.ViewHolder{
private TextView mTextView;
public ViewHolder(View itemView) {
super(itemView);
mTextView= (TextView) itemView;
}
}
//增加数据,调用notifyItemInserted才有动画
public void addData(int position) {
mData.add(position, new ListBean("Insert One"));
notifyItemInserted(position);
}
//删除数据,调用notifyItemRemoved才有动画
public void removeData(int position) {
mData.remove(position);
notifyItemRemoved(position);
}
}
数据绑定和listview的用法差不多,点击事件需要我们自己写,同时增删数据调用的方法也需要注意。
实际上,以上两个类就可以把recycleview集成到我们项目中去了,但是对于recycleview的数据刷新和加载功能,控件是没有提供默认的方法的,需要我们自己来写,下篇文章会重点分析一下。