RecyclerView控件介绍

461 阅读3分钟

「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

RecyclerView

纵向滚动demo创建流程

1.创建实体类,包含imageId、name 2.新建子项布局fruit_item.xml,包含ImageView、TextView 3.在Activity_main.xml布局中加入RecyclerView布局控件 4.新建适配器,继承自RecyclerView.Adapter 5.在适配器中编写ViewHolder类,与view中的数据进行绑定,建立连接 6.重写getItemCount方法,获取item的数量 7.重写onCreateViewHolder方法,将子项布局加载进父类布局中 8.重写onBindViewHolder方法,对RecyclerView子项数据进行赋值,会在每个子项被滚到屏幕内时候执行,通过position参数得到子项的实例对象 9.在MainActivity中初始化list数据,设置RecyclerView布局类型,创建适配器对象,完成适配器设置,在RecyclerView与数据间关联成功

设置点击监听:

1.对ViewHolder中的子项最外层的布局实例对象设置点击监听onClick和长按监听onLongClick 2.若将onClick点击监听放在Activity中实现,可创建接口类,添加onClick方法,在onBindViewHolder中调用接口方法,传递position参数,在Activity中实现

横向滚动demo创建流程

1.创建实体类,包含imageId、name

2.新建子项布局fruit_item.xml,包含ImageView、TextView

3.在Activity_main.xml布局中添加FrameLayout(帧布局)加入RecyclerView布局控件

    <com.example.recyclerviewtest3.MyRecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="120dp"
        android:layout_gravity="bottom"
        android:scrollbars="none"/>

4.重写RecyclerView类,重写onLayout和onTouchEvent方法,onLayout方法实现对子项view位置布局,onTouchEvent方法实现手机屏幕触摸时触发事件

5.编写一个接口类onItemScrollOnclickListener,内部编写一个接口函数onChange,对图片传递参数,改变页面中的图片

6.onTouchEvent方法中获取第一个子项view,通过onItemScrollOnclickListener.onChange方法,传递要改变的图片的id

7.新建适配器,继承自RecyclerView.Adapter

8.在适配器中编写ViewHolder类,与view中的数据进行绑定,建立连接

9.重写getItemCount方法,获取item的数量

10.重写onCreateViewHolder方法,将子项布局加载进父类布局中

11.重写onBindViewHolder方法,对RecyclerView子项数据进行赋值,会在每个子项被滚到屏幕内时候执行,通过position参数得到子项的实例对象

12.在MainActivity中初始化list数据,设置RecyclerView布局类型,创建适配器对象,完成适配器设置,在RecyclerView与数据间关联成功,实现点击,滚动监听方法。

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initFruits();
        recyclerView = (MyRecyclerView) findViewById(R.id.recycler_view);
        content_image = findViewById(R.id.content_image);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        recyclerView.setLayoutManager(layoutManager);
        FruitAdapter adapter = new FruitAdapter(fruitList,this);
        adapter.setmOnItemClickListener(new FruitAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                Toast.makeText(MainActivity.this,position+"",Toast.LENGTH_SHORT).show();
            }
        });
        recyclerView.setAdapter(adapter);
        recyclerView.setItemScrollOnclickListener(new MyRecyclerView.onItemScrollOnclickListener() {
            @Override
            public void onChange(View view, int positon) {
                content_image.setImageResource(fruitList.get(positon).getImageId());
            }
        });
    }

RecyclerView中onScrollStateChanged方法和onScrolled

1.onScrollStateChanged(RecyclerView recyclerView, int newState)

回调的两个变量的含义: recyclerView: 当前在滚动的RecyclerView newState: 当前滚动状态.

其中newState有三种值:

// The RecyclerView is not currently scrolling.(静止没有滚动)
public static final int SCROLL_STATE_IDLE = 0;

// The RecyclerView is currently being dragged by outside input such as user touch input.(正在被外部拖拽,一般为用户正在用手指滚动)
public static final int SCROLL_STATE_DRAGGING = 1;

// The RecyclerView is currently animating to a final position while not under outside control.(自动滚动)
public static final int SCROLL_STATE_SETTLING = 2;

2.onScrolled(RecyclerView recyclerView, int dx, int dy)

在滚动时调用

recyclerView : 当前滚动的view dx : 水平滚动距离 dy : 垂直滚动距离

dx > 0 时为手指向左滚动,列表滚动显示右面的内容 dx < 0 时为手指向右滚动,列表滚动显示左面的内容 dy > 0 时为手指向上滚动,列表滚动显示下面的内容 dy < 0 时为手指向下滚动,列表滚动显示上面的内容