官方文档:
https://developer.android.google.cn/reference/android/support/v7/widget/RecyclerView
1.相关组件
ListView、GridView
- ListView的布局排列是由自身去管理的。
- RecyclerView将布局排列交给了LayoutManager,LayoutManager中制定了一套可拓展的布局排列接口,子类只要按照接口的规范来实现,就能定制出各种不同排列方式的布局了。
RecyclerView的优点:
1.是ListView和GridView的升级版,ListView和GridView能实现的效果,RecyclerView都能实现
2.RecyclerView支持横向滚动
3.RecyclerView能实现交错网格布局,也叫瀑布流布局
4.性能好,ListView的item实现完全交给了用户(程序员),如果程序员在getView方法中没有对布局加载做优化,ListView在快速滚动时,性能是很差的,但RecyclerView把这部分工作已经做好了。
RecyclerView
public class RecyclerView
extends ViewGroup implements ScrollingView, NestedScrollingChild2
java.lang.Object
↳ android.view.View
↳ android.view.ViewGroup
↳ android.support.v7.widget.RecyclerView
Known Direct Subclasses
BaseGridView,WearableRecyclerView
Known Indirect Subclasses
HorizontalGridView,VerticalGridView
RecyclerView常用的两个方法:
setLayoutManager 设置布局管理
setAdapter 设置适配器
RecyclerView.LayoutManager
通过更改LayoutManager,一个RecyclerView可以用来实现标准的垂直滚动列表、统一网格、交错网格、水平滚动集合等等。
RecyclerView.LayoutManager 的子类
Known Direct Subclasses
LinearLayoutManager,StaggeredGridLayoutManager
Known Indirect Subclasses
GridLayoutManager,WearableLinearLayoutManager
上面两者都是LinearLayoutManager子类
java.lang.Object
↳ android.support.v7.widget.RecyclerView.LayoutManager
↳ android.support.v7.widget.LinearLayoutManager
↳ android.support.v7.widget.GridLayoutManager
java.lang.Object
↳ android.support.v7.widget.RecyclerView.LayoutManager
↳ android.support.v7.widget.LinearLayoutManager
↳ android.support.wear.widget.WearableLinearLayoutManager
RecyclerView水平滚动实例
1.修改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="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
2.新建fruit_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="100dp"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/fruit_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
/>
<TextView
android:id="@+id/fruit_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp" />
</LinearLayout>
3.新建Fruit类
public class Fruit {
private int fruitImageId;
private String fruitName;
public Fruit(int fruitImageId, String fruitName) {
this.fruitImageId = fruitImageId;
this.fruitName = fruitName;
}
public int getFruitImageId() {
return fruitImageId;
}
public String getFruitName() {
return fruitName;
}
}
4.修改MainActivity.java,获取RecyclerView,
调用recyclerView.setLayoutManager(layoutManager);设置布局管理,RecyclerView支持垂直滚动列表、统一网格、交错网格、水平滚动集合等
调用 recyclerView.setAdapter(fruitAdapter);设置内容适配器
public class MainActivity extends AppCompatActivity {
private List<Fruit> mFruitList = new ArrayList<>();
@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); // core code
initFruitList();
FruitAdapter fruitAdapter = new FruitAdapter(mFruitList);
recyclerView.setAdapter(fruitAdapter); //core code
}
private void initFruitList() {
for(int i = 0; i < 20; i++) {
mFruitList.add(new Fruit(R.mipmap.ic_launcher, "fruit" + i));
}
}
}
5.新建 FruitAdapter 类
public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {
private List<Fruit> mFruitList = new ArrayList<>();
public FruitAdapter(List<Fruit> fruitList) {
mFruitList = fruitList;
}
static class ViewHolder extends RecyclerView.ViewHolder {
ImageView imageView;
TextView textView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.fruit_image);
textView = itemView.findViewById(R.id.fruit_name);
}
}
@NonNull
@Override
public FruitAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
LayoutInflater layoutInflater = LayoutInflater.from(viewGroup.getContext());
View view = layoutInflater.inflate(R.layout.fruit_item, viewGroup, false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull FruitAdapter.ViewHolder viewHolder, int i) {
Fruit fruit = mFruitList.get(i);
viewHolder.imageView.setImageResource(fruit.getFruitImageId());
viewHolder.textView.setText(fruit.getFruitName());
}
@Override
public int getItemCount() {
return mFruitList.size();
}
}
注意,onCreateViewHolder方法中 layoutInflater.inflate(R.layout.fruit_item, viewGroup, false); 最后一定为false,否则app崩溃。。