强大的RecyclerView,增强版ListView。
自定义布局list_item.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">
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/ic_launcher_round"/>
</LinearLayout>
在activity_main.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="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
接下来为RecyclerView准备一个适配器:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<String>mStringList;
static class ViewHolder extends RecyclerView.ViewHolder{
TextView mTextView;
public ViewHolder(View view){
super(view);
mTextView = (TextView)view.findViewById(R.id.name);//找到布局textview的id
}
}
public MyAdapter(List<String>strings){
mStringList = strings;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item,parent,false);
ViewHolder holder = new ViewHolder(view);//使用上面的静态类ViewHolder传入View
return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.mTextView.setText(mStringList.get(position));//获取list内容再赋值。
}
@Override
public int getItemCount() {
return mStringList.size();//获取数量
}
}
这部分代码看上去有点复杂。其实容易理解,首先我们定义了一个内部类ViewHolder,它继承了RecyclerView.ViewHolder,然后在ViewHolder的构造参数内要传入View的参数,这个通常为RecyclerView自定义布局,然后我们可以通过findViewById来找到控件的实例。
接下来继续看,MyAdapter继承了RecyclerView.Adapter,这样就不得不重写onCreateViewHolder(),onBindViewHolder()以及getItemCount()的方法。
接下来分析这三个方法:
onCreateViewHolder():
用于创建ViewHolder的实例,我们把自定义的布局(list_item.xml)传进来,然后创建ViewHolder的实例把该view传进来,最后返回ViewHolder的实例。
onBindViewHolder():
用于对RecyclerView内子项的赋值,会在每个子项滚动到屏幕内进行。
getItemCount():
这个方法就简单了,告诉我们RecyclerView内有多少子项。
MainActivty.java:
public class MainActivity extends AppCompatActivity {
private List<String>mStringList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initStrings();//初始化List的数据
RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
MyAdapter myAdapter = new MyAdapter(mStringList);
recyclerView.setAdapter(myAdapter);
}
private void initStrings(){
for (int i=0;i<50;i++){
mStringList.add("a");
mStringList.add("b");
}
}
}
initStrings()就不解释了,是来初始化数据的。
LinearLayoutManager是来指定RecyclerView的布局方式,其他都和ListView相似。
效果图:
接下来我们实现横向滚动:
修改MainActivity.java:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initStrings();//初始化List的数据
RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recycler_view);
//修改
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);//横向
recyclerView.setLayoutManager(layoutManager);
//
MyAdapter myAdapter = new MyAdapter(mStringList);
recyclerView.setAdapter(myAdapter);
}
为了方便观察修改list_item.xml LinearLayout的宽度为wrap_content,这里就不贴代码了。
效果图:
最后实现点击事件:
注意 ListView的点击事件一般都是点击子项,如果点击子项里的内容,这样实现就很麻烦,而RecylcerView则很方便。
修改MyAdapter:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<String>mStringList;
static class ViewHolder extends RecyclerView.ViewHolder{
View mView;//添加
TextView mTextView;
public ViewHolder(View view){
super(view);
mView = view;
mTextView = (TextView)view.findViewById(R.id.name);//找到布局textview的id
}
}
public MyAdapter(List<String>strings){
mStringList = strings;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item,parent,false);
final ViewHolder holder = new ViewHolder(view);//使用上面的静态类ViewHolder传入View
//添加
holder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = holder.getAdapterPosition();//获取子项的位置
Toast.makeText(v.getContext(),mStringList.get(position),Toast.LENGTH_SHORT).show();
}
});
return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.mTextView.setText(mStringList.get(position));//获取list内容再赋值。
}
@Override
public int getItemCount() {
return mStringList.size();//获取数量
}
}
效果图: