android:RecyclerView基本用法

引言

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);
        }
    }
}

以上就是基本使用方法

效果

常用api

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属于高级组件了,入门和熟练使用都不是那么容易了,所以大家在学习时,要注意结合着实际使用效果去理解,方便大家全方位的解读这个组件,谢谢大家!

发布了58 篇原创文章 · 获赞 10 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_34203714/article/details/101201301