前期
首先我并没有学习过ListView,但是RecyclerView更加强大,虽然我暂时用不到其动画功能,并且两者都能实现目前我需要的功能,但学了稍为复杂的RecyclerView想要入手ListView也不是件难事,因此,我选择RecyclerView来显示对应项目。
RecyclerView运行原理
- 1.RecyclerView通过Adapter子类和ViewHolder子类共同实现数据的列表显示
- 2.ViewHolder是视图的容器。
- 3.RecyclerView通过onCreateViewHolder创建ViewHolder,再由ViewHolder创建每个列表项目的视图,之后用bindViewHolder同步数据,同时,RecyclerView不会一直创建ViewHolder,一旦他创建了够用的ViewHolder,就会停止创建ViewHolder,转而通过回收旧的ViewHolder,并调用bindViewHolder更新数据来做到循环往复。
-
4.Adapter是控制器,他起到了RecyclerView与ViewHolder之前沟通桥梁的作用。关于Adapter 与 RecyclerView的通信,用下图表示
- 首先RecyclerView请求Adapter调用中的getItemCount()来获取Item的数量,在此获得数量100
- 获取数量后,RecyclerView通过Adapter调用creatViewHolder()来获取ViewHolder
- 获取ViewHolder后调用Adapter中bindViewHolder(…, 0)来绑定对应的数据,这样就创建好了一个子项视图并完成数据绑定,其中参数中的‘0’表示第几个项目,这里是第一个。
- 后面就继续执行createViewHolder(…),以及bingViewHolder (…, 1)来继续创建。
图片来自《android编程权威指南》第九章
代码示例
RecyclerView布局
activity_main.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.seth.list.music.testrecyclerview.MainActivity">
<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/text_recycler_view"/>
</RelativeLayout>
item_text.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/list_items"
android:textSize="16sp"/>
</LinearLayout
</RelativeLayout>
ItemAdapter.class
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.TextHolder> {
private Context mContext;
private List<String> texts;
public MyAdapter(Context context, List<String> textInfo){
mContext = context;
texts = textInfo;
}
@Override
public TextHolder onCreateViewHolder(ViewGroup parent, int viewType) { //创建viewholder
LayoutInflater inflater = LayoutInflater.from(mContext);
View view = inflater.inflate(R.layout.item_text, parent, false); //获取视图
return new TextHolder(view);
}
@Override
public void onBindViewHolder(TextHolder holder, int position) { //绑定数据
String mtext = texts.get(position);
holder.bindText(mtext);
}
@Override
public int getItemCount() { //获取项目数量
return texts.size();
}
public static class TextHolder extends RecyclerView.ViewHolder{
private TextView mTextView;
public TextHolder(View itemView) {
super(itemView);
mTextView = (TextView) itemView.findViewById(R.id.list_items);
}
public void bindText(String mText){
mTextView.setText(mText);
}
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
private RecyclerView MyRecyclerView;
private MyAdapter mMyAdapter;
private List<String> textInfos;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyRecyclerView = (RecyclerView) findViewById(R.id.text_recycler_view);
MyRecyclerView.setLayoutManager(new LinearLayoutManager(this));
textInfos = TextInit(); //初始化字符串list
upDateAdapter();
}
private List<String> TextInit() {
List<String> text = new ArrayList<>(); //模拟一百条数据
for(int i=0; i<100; ++i){
String itemText = "";
itemText = "第" + (i+1) + "条数据";
text.add(itemText);
}
return text;
}
private void upDateAdapter() { //新建调用Adapter
mMyAdapter = new MyAdapter(this, textInfos);
MyRecyclerView.setAdapter(mMyAdapter);
}
}
结果预览
暂且实现如此
小结
大概学会了RecyclerView的简单调用,关于各个item点击事件的实现还未熟练,下次学习实现。
版权声明:本文为Seth_2015原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。