Android-保举一个RecyclerView悬浮头部(StickyItemDecoration)

计算机软件开发 2024-9-17 21:47:17 81 0 来自 中国
在一样平常Android列表开辟当中,我们大概会碰到以下的需求:
我们在滑动列表的时间,头部View置顶不可以滑动.
我刚悦目到有一个开源库可以帮我们快速实现,分享出来渴望能进步看文章的小同伴的开辟服从.
StickyItemDecoration

StickyItemDecoration有两个特性:

  • 粘性头部是放置在RecyclerView外面的View,对比之前绘制出来的粘性头部,能体现出点击的结果,并且处置处罚点击变乱更加简单;
  • 不必要频仍的创建粘性头部的View用于绘制,只必要革新外置的粘性头部的数据即可。
导入项目

开源库的作者没有生成远程依靠的,以是必要我们clone,如许也可以方便在开源库的根本上扩展一些本身想要的东西。
请自行检察开源库详情代码
结果图有点不方便展示,感爱好的小同伴请自行检察。
代码实现

StickyHeadContainer用来承载粘性头部结构,并且必要和RecyclerView的顶部对齐:
<RelativeLayout    android:id="@+id/content_main"    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    app:layout_behavior="@string/appbar_scrolling_view_behavior"    tools:context="com.oubowu.stickydemo.MainActivity"    tools:showIn="@layout/activity_main">    <android.support.v7.widget.RecyclerView        android:id="@+id/recycler_view"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:layout_alignParentTop="true"        android:layout_margin="10dp"        tools:background="@color/colorAccent"        android:layout_alignParentLeft="true"        android:layout_alignParentStart="true">    </android.support.v7.widget.RecyclerView>    <com.oubowu.stickyitemdecoration.StickyHeadContainer        android:id="@+id/shc"        android:layout_width="match_parent"        android:layout_margin="10dp"        android:layout_height="wrap_content">        <include            layout="@layout/item_stock_sticky_head"/>    </com.oubowu.stickyitemdecoration.StickyHeadContainer></RelativeLayout>RecyclerView只必要添加一个StickyItemDecoration即可实现粘性头部,必要传入StickyHeadContainer用于头部的处置处罚,以及粘性头部的范例;然背面部的点击处置处罚就像寻常一样处置处罚
        final StickyHeadContainer container = (StickyHeadContainer) findViewById(R.id.shc);        final TextView tvStockName = (TextView) container.findViewById(R.id.tv_stock_name);        final CheckBox checkBox = (CheckBox) container.findViewById(R.id.checkbox);        final ImageView more = (ImageView) container.findViewById(R.id.iv_more);        checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {            @Override            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {                mAdapter.getData().get(mStickyPosition).getData().check = isChecked;                mAdapter.notifyItemChanged(mStickyPosition);            }        });        container.setDataCallback(new StickyHeadContainer.DataCallback() {            @Override            public void onDataChange(int pos) {                mStickyPosition = pos;                StockEntity.StockInfo item = mAdapter.getData().get(pos).getData();                tvStockName.setText(item.stickyHeadName);                checkBox.setChecked(item.check);            }        });        more.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Toast.makeText(MainActivity.this, "点击了粘性头部的更多", Toast.LENGTH_SHORT).show();            }        });        container.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Toast.makeText(MainActivity.this, "点击了粘性头部:" + tvStockName.getText(), Toast.LENGTH_SHORT).show();            }        });        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);        mRecyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false));        mRecyclerView.addItemDecoration(new StickyItemDecoration(container, RecyclerViewAdapter.TYPE_STICKY_HEAD));        mRecyclerView.addItemDecoration(new SpaceItemDecoration(mRecyclerView.getContext()));Adapter必要重写这两个方法,用于处置处罚GridLayoutManager和StaggeredGridLayoutManager模式下的头部使之占满一行:
    @Override    public void onAttachedToRecyclerView(RecyclerView recyclerView) {        super.onAttachedToRecyclerView(recyclerView);        FullSpanUtil.onAttachedToRecyclerView(recyclerView, this, TYPE_STICKY_HEAD);    }    @Override    public void onViewAttachedToWindow(RecyclerViewHolder holder) {        super.onViewAttachedToWindow(holder);        FullSpanUtil.onViewAttachedToWindow(holder, this, TYPE_STICKY_HEAD);    }
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 22:36, Processed in 0.161560 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表