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