RecyclerView

官方文档:
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崩溃。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值