有了RecyclerView可以更灵活的实现我们的各种列表。
配置:
compile 'com.android.support:recyclerview-v7:+'
layout:
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
java:
public class MainActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
// 设置水平滑动
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
recyclerView.setLayoutManager(layoutManager);
String[] dataset = new String[100];
for (int i=0 ; i < dataset.length ; i++) {
dataset[i] = "Item " + i;
}
MyAdapter adapter = new MyAdapter(dataset);
recyclerView.setAdapter(adapter);
}
@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);
}
private class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{
private String[] mDataset;
// Provide a reference to the type of views that you are using
// (custom viewholder)
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView mTextView;
public ViewHolder(TextView v) {
super(v);
mTextView = v;
}
}
// Provide a suitable constructor (depends on the kind of dataset)
public MyAdapter(String[] myDataset) {
mDataset = myDataset;
}
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
Log.i("zoro" , "onCreateViewHolder : " + i);
// 创建一个View,简单起见直接使用系统提供的布局,就是一个TextView
TextView view = (TextView)View.inflate(viewGroup.getContext(), android.R.layout.simple_list_item_1, null);
// 创建一个ViewHolder
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
Log.i("zoro" , "onBindViewHolder : " + i);
viewHolder.mTextView.setText(mDataset[i]);
}
@Override
public int getItemCount() {
Log.i("zoro" , "getItemCount");
return mDataset.length;
}
}
}
有几个主要的需要认识的类:
RecyclerView : 本文主角
LinearLayoutManager : 可以对RecyclerView进行设置,比如横向还是纵向
RecyclerView.Adapter : 类似Listview的adapter,只不过不同的是,这里是针对viewholder进行复用的。
以下是log
09-10 14:57:18.143 11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.143 11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.241 11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.241 11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.242 11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.242 11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.242 11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.242 11693-11693/? I/zoro﹕ onCreateViewHolder : 0
09-10 14:57:18.244 11693-11693/? I/zoro﹕ onBindViewHolder : 0
09-10 14:57:18.246 11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.246 11693-11693/? I/zoro﹕ onCreateViewHolder : 0
09-10 14:57:18.246 11693-11693/? I/zoro﹕ onBindViewHolder : 1
09-10 14:57:18.247 11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.247 11693-11693/? I/zoro﹕ onCreateViewHolder : 0
09-10 14:57:18.247 11693-11693/? I/zoro﹕ onBindViewHolder : 2
09-10 14:57:18.248 11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.248 11693-11693/? I/zoro﹕ onCreateViewHolder : 0
09-10 14:57:18.248 11693-11693/? I/zoro﹕ onBindViewHolder : 3
09-10 14:57:18.248 11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.248 11693-11693/? I/zoro﹕ onCreateViewHolder : 0
09-10 14:57:18.249 11693-11693/? I/zoro﹕ onBindViewHolder : 4
09-10 14:57:18.249 11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.249 11693-11693/? I/zoro﹕ onCreateViewHolder : 0
09-10 14:57:18.257 11693-11693/? I/zoro﹕ onBindViewHolder : 5
09-10 14:57:18.260 11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.260 11693-11693/? I/zoro﹕ onCreateViewHolder : 0
09-10 14:57:18.260 11693-11693/? I/zoro﹕ onBindViewHolder : 6
09-10 14:57:18.261 11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.261 11693-11693/? I/zoro﹕ onCreateViewHolder : 0
09-10 14:57:18.261 11693-11693/? I/zoro﹕ onBindViewHolder : 7
可以看出每次都会调用getItemCount,每次创建ViewHolder都是从onCreateViewHolder(ViewGroup viewGroup, int i)开始创建的,后面的都直接绑定
onCreateViewHolder(ViewGroup viewGroup, int i)中的第二个参数,是type的意思
09-10 15:03:56.779 11693-11693/? I/zoro﹕ onCreateViewHolder : 0
09-10 15:03:56.783 11693-11693/? I/zoro﹕ onBindViewHolder : 8
09-10 15:03:56.862 11693-11693/? I/zoro﹕ getItemCount
09-10 15:03:56.862 11693-11693/? I/zoro﹕ onCreateViewHolder : 0
09-10 15:03:56.864 11693-11693/? I/zoro﹕ onBindViewHolder : 9
09-10 15:03:56.946 11693-11693/? I/zoro﹕ getItemCount
09-10 15:03:56.946 11693-11693/? I/zoro﹕ onCreateViewHolder : 0
09-10 15:03:56.949 11693-11693/? I/zoro﹕ onBindViewHolder : 10
09-10 15:03:57.027 11693-11693/? I/zoro﹕ getItemCount
09-10 15:03:57.027 11693-11693/? I/zoro﹕ onBindViewHolder : 11
09-10 15:03:57.125 11693-11693/? I/zoro﹕ getItemCount
09-10 15:03:57.125 11693-11693/? I/zoro﹕ onBindViewHolder : 12
09-10 15:03:57.315 11693-11693/? I/zoro﹕ getItemCount
09-10 15:03:57.315 11693-11693/? I/zoro﹕ onBindViewHolder : 13
等创建够所需的ViewHolder之后,就开始复用了。
参考:http://blog.csdn.net/ipip2005/article/details/38581427
http://chuansong.me/n/510236