RecyclerView 基础用法


date : 2019/10/13
author : lrcoder


分析

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

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

1. 数据来源

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

// 创建数据源
List 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 {

    // 因为是Demo,没有刻意写一个JavaBean类,使用String类型代替一下
    List mString;
    Context context;

    // 构造函数,用于外部创建Adapter时可以对其传入数据
    public RecyclerViewAdapter(Context context, List 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 基础用法)