听说RecyclerView比ListView好些,于是在网上找到代码跟着敲了一遍,现在来总结一下。
1.要使用RecyclerView首先需要导入v7包,这个大家知道导包就不详细说了。
2.写好布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
3.现在开始在MainActivity中写代码了
首先是得到三个成员变量:
第一个为RecyclerView控件
第二个为我每个item中传入的数据
第三个为RecyclerView的适配器
private RecyclerView recyclerView;
private List<String> mDatas;
private MyAdapter mAdapter;
写好三个成员变量,就开始写方法了
1.准备好数据,即给mDatas赋值
private void initDatas() {
mDatas = new ArrayList<String>();
for(int x = 'A';x<'z';x++){
mDatas.add((char)x+"");
}
}
2.初始化
private void initView() {
recyclerView = (RecyclerView)
findViewById(R.id.recycler);
}
3.开始写适配器
3.1首先创建一个类继承自RecyclerView.Adapter
public class MyAdapter extends RecyclerView.Adapter<MyViewHolder>
其中MyViewHolder为自己写的ViewHolder的子类,下面会讲解。
继承之后步骤:
1.成员变量:
private LayoutInflater layoutInflater;
private Context mContext;
private List<String> mDatas;
2.构造方法:
//构造方法进行初始化
public MyAdapter(Context context,List<String> data){
this.mContext = context;
this.mDatas = data;
layoutInflater = LayoutInflater.from(context);
}
现在来写MyViewHolder,继承ViewHolder
class MyViewHolder extends RecyclerView.ViewHolder{
public TextView text;
public MyViewHolder(View itemView) {
super(itemView);
text = (TextView)itemView.findViewById(R.id.text);
}
}
它是将每个item中的控件初始化,这样好像更高效,不用每次适配的时候都重新加载控件。
然后是父类自带方法重写:
//创建一个ViewHolder
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//获取每个item
View view = layoutInflater.inflate(R.layout.item,parent,false);
//将view作为MyViewHolder参数传入来创建MyViewHolder对象
MyViewHolder viewHolder = new MyViewHolder(view);
return viewHolder;
}
//绑定ViewHolder
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
//给每个item赋值
holder.text.setText(mDatas.get(position));
}
@Override
public int getItemCount() {
return mDatas.size();
}
中间都有详细注释,就不讲了。
适配器写好之后,就只要进行适配了:
//创建适配器对象
mAdapter = new MyAdapter(this,mDatas);
//传入数据
recyclerView.setAdapter(mAdapter);
//为了将它显示出来使用LinearLayoutManager
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
recyclerView.setLayoutManager(linearLayoutManager);
到此为止,RecyclerView就写好了,不过这个还没有加分割线哦,分割线的代码下一篇博客再给吧。我本来不想贴代码了,准备把github地址给出来,需要可以直接下载,可是我一不小心提交了别的将它覆盖了,覆盖了啊,所以我贴个源码吧。(只怪自己太low,不会github,心疼自己3秒)。
MainActivty
public class MainActivity extends Activity {
private RecyclerView recyclerView;
private List<String> mDatas;
private MyAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initDatas();
initView();
//创建适配器对象
mAdapter = new MyAdapter(this,mDatas);
//传入数据
recyclerView.setAdapter(mAdapter);
//为了将它显示出来使用LinearLayoutManager
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
//添加分割线
recyclerView.addItemDecoration(new RecycleViewDivider(this,RecycleViewDivider.VERTICAL));
recyclerView.setLayoutManager(linearLayoutManager);
}
private void initDatas() {
mDatas = new ArrayList<String>();
for(int x = 'A';x<'z';x++){
mDatas.add((char)x+"");
}
}
private void initView() {
recyclerView = (RecyclerView)findViewById(R.id.recycler);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
MyAdapter
public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
private LayoutInflater layoutInflater;
private Context mContext;
private List<String> mDatas;
//构造方法进行初始化
public MyAdapter(Context context,List<String> data){
this.mContext = context;
this.mDatas = data;
layoutInflater = LayoutInflater.from(context);
}
//创建一个ViewHolder
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = layoutInflater.inflate(R.layout.item,parent,false);
//将view作为MyViewHolder参数传入来创建MyViewHolder对象
MyViewHolder viewHolder = new MyViewHolder(view);
return viewHolder;
}
//绑定ViewHolder
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
//给每个item赋值
holder.text.setText(mDatas.get(position));
}
@Override
public int getItemCount() {
return mDatas.size();
}
}
class MyViewHolder extends RecyclerView.ViewHolder{
public TextView text;
public MyViewHolder(View itemView) {
super(itemView);
text = (TextView)itemView.findViewById(R.id.text);
}
}
布局文件就不贴了,还有写Adapter之前先把item的布局写好哦,忘记讲了。