美文网首页
RecyclerView 基础用法

RecyclerView 基础用法

作者: 良人_Coder | 来源:发表于2019-10-14 11:50 被阅读0次

    date : 2019/10/13
    author : lrcoder


    分析

    RecyclerView 使用的时候需要关注三点:

    • 数据来源
    • 界面布局
    • 适配器设置

    1. 数据来源

    一般来说,android中的数据存放List集合中,数据读取的方式可能会涉及到线程的耗时操作,需要适当的进行异步操作。对于android中的异步操作,这里不作过多分析。

    // 创建数据源
    List<String> mList = new ArrayList<>();
    
    // 获取数据数据的部分抽取出来
    private void initList() {
    // TODO: 2019/10/13 初始化数据(数据库、sharepreference、都可以。)
        mList.add("demo");
        mList.add("test");
    }
    

    2. 界面布局

    RecyclerView 支持纵向排列,横向排列和瀑布流排列。这也是RecyclerView的使用特点,需要指定一个布局管理器,具体代码:

    // 1. 找到recyclerView
    RecyclerView recyclerView = this.findViewById(R.id.recyclerView);
    // 2. 创建一个布局管理器
    LinearLayoutManager lm = new LinearLayoutManager(this.getApplicationContext());
    // 3. 设置布局为竖直(默认)
    lm.setOrientation(LinearLayoutManager.VERTICAL);
    // 4. 将其设置为该recyclerView的布局管理器
    recyclerView.setLayoutManager(lm);
    // 5. 为该recyclerView声明一个适配器, 并绑定数据源
    RecyclerViewAdapter adapter = new RecyclerViewAdapter(getApplicationContext(), mList);
    // 6. 将这个适配器与recyclerView进行绑定
    recyclerView.setAdapter(adapter);
    
    • 这里,如果需要的是横向排列,可以将第3步中的布局设置为LinearLayoutManager.HORIZONTAL

    • 如果需要的是瀑布流形式,可以将第2步的布局管理器换为StaggeredGridLayoutManager

    StaggeredGridLayoutManager lm = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
    

    这里,StaggeredGridLayoutManager的第一个参数为 3 列,第二个参数为竖直排列

    3. 适配器设置(划重点)

    RecyclerView 中自带ViewHolder 视图处理的方法,但是我们需要手动将视图和界面进行绑定,同时在Adapter中进行数据绑定、点击事件设置,先上码:

    // 自定义的Adapter继承RecyclerView.Adapter,正如ListView中的Adapter,我们需要对其写一个ViewHolder的内部类,在recyclerView中,我们需要在RecyclerView.Adapter中指定我们定义的这个ViewHolder
    public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHoldr> {
    
        // 因为是Demo,没有刻意写一个JavaBean类,使用String类型代替一下
        List<String> mString;
        Context context;
    
        // 构造函数,用于外部创建Adapter时可以对其传入数据
        public RecyclerViewAdapter(Context context, List<String> mString) {
            this.mString = mString;
            this.context = context;
        }
    
        // 绑定视图
        @NonNull
        @Override
        public ViewHoldr onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    
            // 将视图和item布局进行绑定
            // 为什么声明的是View?可以参考RecyclerView.ViewHolder继承的方法,其中需要传入一个View类型的参数
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.item, parent, false);
    
            // 声明其中的控件
            ViewHoldr viewHoldr = new ViewHoldr(view);
            return viewHoldr;
        }
    
        // 绑定数据
        @Override
        public void onBindViewHolder(@NonNull ViewHoldr holder, int position) {
    
            // 将数据和控件进行绑定
            String str = mString.get(position);
            holder.mTextView.setText(str);
            
            // 设置点击事件
            holder.mTextView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(context.getApplicationContext(), "i am clicked", Toast.LENGTH_LONG).show();
                }
            });
        }
    
        @Override
        public int getItemCount() {
            // 获取数据个数
            return mString.size();
        }
    
        // 1. 内部类申明为静态,防止内存泄漏(oom)
        // 2. 为item视图中的每个控件进行申明
        static class ViewHoldr extends RecyclerView.ViewHolder {
    
            TextView mTextView;
    
            public ViewHoldr(@NonNull View itemView) {
                super(itemView);
                mTextView = itemView.findViewById(R.id.textView);
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:RecyclerView 基础用法

          本文链接:https://www.haomeiwen.com/subject/ooxrmctx.html