5.0新控件RecyclerView,它直接提供了回收复用的功能,并且还提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator 实现 ListView,GirdView,瀑布流等效果。
首先,由于 RecyclerView 属于 v7-支持库,因此我们在使用之前需要先添加依赖:
dependencies {
implementation 'com.android.support:recyclerview-v7:28.0.0'
}
和listview使用一样
public class DemoActivity extends BaseActivity {
//获取RecyclerView对象
private RecyclerView mRecyclerView;
private List mEntityList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo);
// 初始化控件
mRecyclerView = findViewById(R.id.demo_recycler_view);
initData();
initRecyclerView();
}
private void initData(){
mEntityList = new ArrayList<>();
for(int i = 'A'; i <= 'z'; i++){
BaseEntity entity = new BaseEntity();
entity.setText("" + (char)i);
mEntityList.add(entity);
}
}
/**
* 初始化RecyclerView
*/
private void initRecyclerView(){
// 定义一个线性布局管理器
LinearLayoutManager manager = new LinearLayoutManager(this);
// 设置布局管理器
mRecyclerView.setLayoutManager(manager);
// 设置adapter
DemoAdapter adapter = new DemoAdapter(DemoActivity.this, mEntityList);
mRecyclerView.setAdapter(adapter);
}
}
定义适配器
public class DemoAdapter extends RecyclerView.Adapter {
private Context mContext;
private List mEntityList;
//传入上下文和list数据
public DemoAdapter (Context context, List entityList){
this.mContext = context;
this.mEntityList = entityList;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//创建复用对象 viewHolder
View view = LayoutInflater.from(mContext).inflate(R.layout.item_demo, parent, false);
return new DemoViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
BaseEntity entity = mEntityList.get(position);
((DemoViewHolder)holder).mText.setText(entity.getText());
}
@Override
public int getItemCount() {
return mEntityList.size();
}
/**
*覆写ViewHolder 并绑定布局和组件对象
**/
private class DemoViewHolder extends RecyclerView.ViewHolder{
private TextView mText;
public DemoViewHolder(View itemView) {
super(itemView);
mText = (TextView) itemView.findViewById(R.id.item_text);
}
}
}
以上就是基本使用方法
效果
LayoutManager:RecyclerView 会根据 Layout Manager 提供的视图来填充自身,常用的布局管理器有LinearLayoutManager(线性布局管理器,支持横向或纵向选择)、GridLayoutManager(网格布局管理器)、StaggeredGridLayoutManager (瀑布流布局管理器)等。
ViewHolder:列表中的视图由 ViewHolder 实例展示。 ViewHolder 用于对控件的实例进行缓存,负责显示子项。例如,如果列表显示了音乐集合,那么每个 ViewHolder 可能代表一个专辑。
Adapter:ViewHolder 对象由 Adapter 管理。Adapter 按需创建 ViewHolder,并为其绑定数据。绑定意味着根据 Adapter 中的位置为子视图填充对应的数据。
点击和长按事件监听
//创建 点击监听 长按监听 回调
public interface OnItemClickLitener{
void onItemClick(View view, int position);
void onItemLongClick(View view , int position);
}
private OnItemClickLitener mOnItemClickLitener;
public void setOnItemClickLitener(OnItemClickLitener onItemClickLitener){
this.mOnItemClickLitener = onItemClickLitener;
}
@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int position) {
BaseEntity entity = mEntityList.get(position);
((DemoViewHolder)holder).mText.setText(entity.getText());
if(mOnItemClickLitener != null){
//设置点击监听
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int pos = holder.getLayoutPosition();
mOnItemClickLitener.onItemClick(holder.itemView, pos);
}
});
//设置长按监听
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
int pos = holder.getLayoutPosition();
mOnItemClickLitener.onItemLongClick(holder.itemView, pos);
return false;
}
});
}
}
小tips
为什么要自己实现点击监听呢?
对比ListView 中对于点击事件的处理,其实是有很大弊端的,它的 setOnItemClickListener() 方法是为子项注册点击事件,这就导致只能识别到这一整个子项,对于子项中的组件比如按钮就束手无策了。为此,RecyclerView 直接放弃了这个为子项注册点击事件的监听方法,所有点击事件都有具体 View 去注册,好处显而易见,我可以按需为组件注册点击事件,不存在点击不到的组件。
item动画
动画也是 RecyclerView 很强大的一点,我们可以通过实现 ItemAnimator 这个抽象类来定制我们想要的动画。
官方为我们提供了一种默认的实现 DefaultItemAnimator ,借助这个类,我们就可以加入 Item 的添加和删除动画,实现起来很简单,只需要加入下面这一行代码即可:
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView属于高级组件了,入门和熟练使用都不是那么容易了,所以大家在学习时,要注意结合着实际使用效果去理解,方便大家全方位的解读这个组件,谢谢大家!