RecyclerView作为ListView的学习
RecylcerView是MD新增的控件,他可以有效替换ListView,GridView,因为他提供了高度的解耦,灵活,插拔式的使用体验,本文主要总结他作为ListView使用的知识
1.基本使用
首先配置gradle,引入RecyclerView
compile 'com.android.support:appcompat-v7:24.0.0'
compile 'com.android.support:design:24.0.0'
然后在布局中添加RecyclerView,在代码中对其进行使用,其中适配器继承于RecyclerView.Adapter,适配器中使用的ViewHolder继承于RecyclerView.ViewHolder,使用非常方便。基础使用函数如下:
mRecyclerView =(RecyclerView) findViewById(R.id.recycler_list_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));//布局管理
mRecyclerView.setAdapter(new ListViewAdapter()); //适配器
mRecyclerView.setItemAnimator(new DefaultItemAnimator()); //增加,删除动画
mRecyclerView.addItemDecoration(new DividerItemDecoration()); //分割线
2.RecyclerView的Item中的控件的点击监听
因为RecyclerView没有像ListView一样带有setOnItemClickListener(),所以需要我们自己在adapter去定义onClickListener,有两个定义监听接口的方式,一种是直接在adapter中监听,由RecyclerView实现对应处理;一种是定义在ViewHoder中监听,在adapter中监听到以后再由adapter中的监听接口传给RecyclerView。
这两种点击监听要视情况使用,如果只是对整体的itenView进行监听,就可以使用第一种,但是如果是对ItemView中的组件进行监听和对应处理,则用第二种,通常使用第二种的场景多一点。
若使用第二种,先在ViewHolder中创建监听接口
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView tv;
Button btn;
public ViewHolder(View itemView) {
super(itemView);
tv = (TextView) itemView.findViewById(R.id.show_tv);
btn = (Button) itemView.findViewById(R.id.delete_btn);
tv.setOnClickListener(this);
btn.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.show_tv:
mListener.showBtn(getPosition());
break;
case R.id.delete_btn:
mListener.deleteItem(getPosition());
break;
default:
break;
}
}
interface IViewHolderClicks {
void showBtn(int position);
void deleteItem(int position);
}
IViewHolderClicks mListener;
public void setIViewHolderClicks(IViewHolderClicks listener) {
mListener = listener;
}
}
然后在Adapter中实现接口,并做对应的处理,就可完成点击列表文字出现按钮,点击按钮删除对应位置item
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.list_iten, parent, false);
ViewHolder holder = new ViewHolder(view);
holder.setIViewHolderClicks(this);
return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.tv.setText(mList.get(position) + "");
if (position == mLastPosition) {
holder.btn.setVisibility(View.VISIBLE);
} else {
holder.btn.setVisibility(View.GONE);
}
}
@Override
public int getItemCount() {
return mList.size();
}
@Override
public void showBtn(int position) {
mLastPosition = position;
notifyDataSetChanged();
}
@Override
public void deleteItem(int position) {
mLastPosition = -1;
mList.remove(position);
notifyItemRemoved(position);
}
3.为作为ListView的RecyclerView添加headView和footView
添加下拉刷新可以通过使用v4提供的SwipeRefreshLayout组件实现功能,也可以通过设置viewtype来实现添加headview。
添加上拉加载更多,则是通过添加footview,配合public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 函数中通过设置viewtype来实现。
4.代码实例
实现功能:通过SwipeRefreshLayout实现下拉刷新,添加footview通过viewType判断实现上拉加载更多。
源码地址:RecyclerListView