[置顶] RecyclerView使用详解(一)

时间:2021-09-01 05:29:51

RecyclerView架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果。

与ListView的区别

ListView中convertView是复用的,在RecyclerView中,是把ViewHolder作为缓存的单位了,然后convertView作为ViewHolder的成员变量保持在ViewHolder中,也就是说,假设没有屏幕显示10个条目,则会创建10个ViewHolder缓存起来,每次复用的是ViewHolder,所以他把getView这个方法变为了onCreateViewHolder。

展示一个列表,实现简单交互

现在对RecyclerView的进行简单的使用。在使用RecyclerView之前,先要引入类库~

 compile 'com.android.support:design:25.3.0'
compile 'com.android.support:recyclerview-v7:25.3.0'

MainActivity.java

public class MainActivity extends AppCompatActivity {

@BindView(R.id.title)
TextView title;
@BindView(R.id.recycle_view)
RecyclerView recycleView;

private List<String> datas = new ArrayList<String>();
private HomeAdapter homeAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
initData();
initView();
}

/**
* 模拟数据,填充adapter
*/

private void initData() {
for (int i = 0; i < 20; i++) {
datas.add("数据是 " + i);
}
homeAdapter = new HomeAdapter(this, datas);
}

/**
* 初始化view
*/

private void initView() {
recycleView.setLayoutManager(new LinearLayoutManager(this));
recycleView.setAdapter(homeAdapter);
}
}

这里仅仅模拟一些数据,并对RecyclerView进行初始化(设置布局管理器、设置Adapter)。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="45dp"
android:paddingLeft="10dp"
android:background="@color/gainsboro"
android:gravity="center_vertical"
android:text="这是标题"/>


<android.support.v7.widget.RecyclerView
android:id="@+id/recycle_view"
android:layout_width="match_parent"
android:layout_height="match_parent">

</android.support.v7.widget.RecyclerView>
</LinearLayout>

为了更好的重用,这里单独写了HomeAdapter类~

HomeAdapter.java

/**
* Created by jinzifu on 2017/4/14.
*/


public class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder> {
private Context context;
private List<String> datas;

public HomeAdapter(Context context, List<String> datas) {
this.context = context;
this.datas = datas;
}

/**
* 加载条目布局
*
* @param parent
* @param viewType
* @return
*/

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.item_recycle_list, parent, false));
}

/**
* 将视图与数据进行绑定
*
* @param holder
* @param position
*/

@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
holder.title.setText(datas.get(position));
Log.d("onBindViewHolder", "索引=" + position);
holder.layout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "你点击了" + position, Toast.LENGTH_SHORT).show();
}
});
}

@Override
public int getItemCount() {
return datas.size();
}


class MyViewHolder extends RecyclerView.ViewHolder {
private TextView title;
private LinearLayout layout;

public MyViewHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.item_title);
layout = (LinearLayout) itemView.findViewById(R.id.item_layout);
}
}
}

这里通过HomeAdapter的构造方法引入上下文和数组,并进行简要的视图逻辑。
item_recycle_list.xml仅仅是一个textview展示,此处省略~

运行效果
[置顶]        RecyclerView使用详解(一)

发现问题了没?

列举下上面出现的问题:
1. 列表展示没有分割线;
2. HomeAdapter里模板类代码很多,有进一步封装的必要;
3. HomeAdapter里视图交互支持有限,如缺少onClickListener等;

接下来我们一步一步优化,我先约会去~