前言:
上一篇[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的數據刷新和加載功能,控件是沒有提供默認的方法的,需要我們自己來寫,下篇文章會重點分析一下。