RecyclerVIew实现悬浮吸顶效果图

这里写图片描述

主页面布局

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/recycle"

android:layout_width="match_parent"

android:layout_height="match_parent" />

android:id="@+id/tv_sticky_header_view"

android:layout_width="match_parent"

android:layout_height="50dp"

android:background="#EFFAE7"

android:gravity="center"

android:text="吸顶文本1" />

RecyclerView的子条目布局

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:layout_marginLeft="5dp"

android:layout_marginRight="5dp"

android:id="@+id/rl_content_wrapper"

android:layout_width="match_parent"

android:layout_height="30dp">

android:id="@+id/name"

android:layout_centerVertical="true"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

android:id="@+id/auto"

android:layout_centerVertical="true"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentRight="true" />

android:layout_width="match_parent"

android:layout_height="1dp"

android:layout_alignParentBottom="true"

android:background="#ffffff"/>

android:id="@+id/tv_sticky_header_view"

android:layout_width="match_parent"

android:layout_height="50dp"

android:background="#EFFAE7"

android:gravity="center"

android:text="吸顶文本1" />

activity代码

public class MainActivity extends AppCompatActivity {

private TextView tvStickyHeaderView;

private RecyclerView recyclerView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initView();

initListener();

}

/**

* 初始化View

*/

private void initView() {

recyclerView = (RecyclerView) findViewById(R.id.recycle);

tvStickyHeaderView = (TextView) findViewById(R.id.tv_sticky_header_view);

recyclerView.setLayoutManager(new LinearLayoutManager(this));

recyclerView.setAdapter(new StickyExampleAdapter(this,getData()));

}

/**

* 初始化Listener

*/

private void initListener() {

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

@Override

public void onScrolled(RecyclerView recyclerView,int dx,int dy) {

super.onScrolled(recyclerView,dx,dy);

View stickview = recyclerView.findChildViewUnder(0,0);

if (stickview != null && stickview.getContentDescription() != null) {

if (!TextUtils.equals(tvStickyHeaderView.getText(),stickview.getContentDescription())) {

tvStickyHeaderView.setText(stickview.getContentDescription());

}

}

View transInfoView = recyclerView.findChildViewUnder(

0,tvStickyHeaderView.getHeight() + 1);

if (transInfoView.getTag() != null) {

int transViewStatus = (int) transInfoView.getTag();

int top = transInfoView.getTop();

if (transViewStatus == StickyExampleAdapter.HAS_STICKY_VIEW) {

if (top > 0) {

int dealtY = top - tvStickyHeaderView.getMeasuredHeight();

tvStickyHeaderView.setTranslationY(dealtY);

} else {

tvStickyHeaderView.setTranslationY(0);

}

} else if (transViewStatus == StickyExampleAdapter.NONE_STICKY_VIEW) {

tvStickyHeaderView.setTranslationY(0);

}

}

}

});

}

public List getData() {

List stickyExampleModels = new ArrayList<>();

for (int index = 0; index < 100; index++) {

if (index < 15) {

stickyExampleModels.add(new StickyBean(

"吸顶文本1","name" + index,"gender" + index));

} else if (index < 25) {

stickyExampleModels.add(new StickyBean(

"吸顶文本2","gender" + index));

} else if (index < 35) {

stickyExampleModels.add(new StickyBean(

"吸顶文本3","gender" + index));

} else {

stickyExampleModels.add(new StickyBean(

"吸顶文本4","gender" + index));

}

}

return stickyExampleModels;

}

}

adapter代码

public class StickyExampleAdapter extends RecyclerView.Adapter {

//第一个吸顶

private static final int FIRST_STICKY_VIEW = 1;

//别的吸顶

static final int HAS_STICKY_VIEW = 2;

//正常View

static final int NONE_STICKY_VIEW = 3;

private final LayoutInflater mInflate;

private final List datas;

StickyExampleAdapter(Context context,List datas){

mInflate = LayoutInflater.from(context);

this.datas = datas;

}

@Override

public RecyclerViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {

View inflate = mInflate.inflate(R.layout.item_ui,parent,false);

return new RecyclerViewHolder(inflate);

}

@Override

public void onBindViewHolder(RecyclerViewHolder holder,int position) {

StickyBean stickyBean = datas.get(position);

holder.tvName.setText(stickyBean.name);

holder.tvGender.setText(stickyBean.autor);

if (position == 0) {

holder.tvStickyHeader.setVisibility(View.VISIBLE);

holder.tvStickyHeader.setText(stickyBean.sticky);

holder.itemView.setTag(FIRST_STICKY_VIEW);

} else {

if (!TextUtils.equals(stickyBean.sticky,datas.get(position - 1).sticky)) {

holder.tvStickyHeader.setVisibility(View.VISIBLE);

holder.tvStickyHeader.setText(stickyBean.sticky);

holder.itemView.setTag(HAS_STICKY_VIEW);

} else {

holder.tvStickyHeader.setVisibility(View.GONE);

holder.itemView.setTag(NONE_STICKY_VIEW);

}

}

//通过此处设置ContentDescription,作为内容描述,可以通过getContentDescription取出,功效跟setTag差不多。

holder.itemView.setContentDescription(stickyBean.sticky);

}

@Override

public int getItemCount() {

return datas == null ? 0 : datas.size();

}

public class RecyclerViewHolder extends RecyclerView.ViewHolder{

TextView tvStickyHeader;

RelativeLayout rlContentWrapper;

TextView tvName;

TextView tvGender;

RecyclerViewHolder(View itemView) {

super(itemView);

tvStickyHeader = (TextView) itemView.findViewById(R.id.tv_sticky_header_view);

rlContentWrapper = (RelativeLayout) itemView.findViewById(R.id.rl_content_wrapper);

tvName = (TextView) itemView.findViewById(R.id.name);

tvGender = (TextView) itemView.findViewById(R.id.auto);

}

}

}

StickyBean代码

public class StickyBean {

public String name;

public String autor;

public String sticky;

public StickyBean(String sticky,String name,String autor) {

this.sticky = sticky;

this.name = name;

this.autor = autor;

}

}

app的build文件

apply plugin: 'com.android.application'

android {

compileSdkVersion 26

buildToolsVersion "25.0.3"

defaultConfig {

applicationId "com.lg.floating"

minSdkVersion 15

targetSdkVersion 26

versionCode 1

versionName "1.0"

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

}

buildTypes {

release {

minifyEnabled false

proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'

}

}

}

dependencies {

compile fileTree(dir: 'libs',include: ['*.jar'])

androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2',{

exclude group: 'com.android.support',module: 'support-annotations'

})

compile 'com.android.support:appcompat-v7:26.0.0-alpha1'

compile 'com.android.support:recyclerview-v7:23.1.0'

testCompile 'junit:junit:4.12'

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐