这次是在上次的微信页面的基础上进行改进,我给改成了小说阅读器(晋江bushi)
实验要求
- 选择一个tab添加recycleview显示
- 实现顶部悬浮的滑动列表,即向上滑动展示下面的内容时,分组名可以在顶部悬浮,直到该分组内容向上滑动退出屏幕页面,分组名跟随分组内容退出屏幕页面
最终页面展示
实验步骤
- 改第二个页面的xml文件即tab02.xml,增加两个xml文件
sticky_include_recycle_item.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/tv_sticky_header_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorAccent"
android:padding="20dp"
android:textColor="@android:color/white"
android:textSize="30sp"
tools:text="@string/app_name" />
sticky_recycle_item.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="wrap_content"
android:orientation="vertical">
<include layout="@layout/sticky_include_recycle_item" />
<TextView
android:id="@+id/tv_novel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="17dp"
android:text="@string/app_name"
android:textSize="25sp"/>
</LinearLayout>
在tab02.xml中加入
<include layout="@layout/sticky_include_recycle_item" />
- 编写java文件
顶部悬浮的滑动列表代码实现
private void initView() {
final adapter adapter = new adapter(getActivity());
RecyclerView rcvSticky = (RecyclerView) view.findViewById(R.id.rcv_sticky);
final TextView tvArea = (TextView) view.findViewById(R.id.tv_sticky_header_view);
rcvSticky.setLayoutManager(new LinearLayoutManager(getActivity()));
rcvSticky.setHasFixedSize(true);
rcvSticky.setAdapter(adapter);
adapter.setStickyDataList(mDataList);
rcvSticky.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
View stickyInfoView = recyclerView.findChildViewUnder(
tvArea.getMeasuredWidth() / 2, 5);
if (stickyInfoView != null && stickyInfoView.getContentDescription() != null) {
tvArea.setText(String.valueOf(stickyInfoView.getContentDescription()));
}
View transInfoView = recyclerView.findChildViewUnder(
tvArea.getMeasuredWidth() / 2, tvArea.getMeasuredHeight() + 1);
if (transInfoView != null && transInfoView.getTag() != null) {
int transViewStatus = (int) transInfoView.getTag();
int dealtY = transInfoView.getTop() - tvArea.getMeasuredHeight();
if (transViewStatus == adapter.HAS_STICKY_VIEW) {
if (transInfoView.getTop() > 0) {
tvArea.setTranslationY(dealtY);
} else {
tvArea.setTranslationY(0);
}
} else if (transViewStatus == adapter.NONE_STICKY_VIEW) {
tvArea.setTranslationY(0);
}
}
}
});
}
新建适配器adapter.java文件,这里通过implement加入几个必要的方法,根据实际需求重写这些方法即可
package com.example.lq.mywechat2;
import android.content.Context;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class adapter extends RecyclerView.Adapter<adapter.StickyViewHolder> {
private static final String TAG = adapter.class.getSimpleName();
private Context mContext;
private List<StickyData> mList;
public static final int FIRST_STICKY_VIEW = 1;
public static final int HAS_STICKY_VIEW = 2;
public static final int NONE_STICKY_VIEW = 3;
public adapter(Context context) {
mContext = context;
}
public void setStickyDataList(List<StickyData> list) {
mList = list;
notifyDataSetChanged();
}
@NonNull
@Override
public StickyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.sticky_recycle_item, parent, false);
return new StickyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull StickyViewHolder holder, int position) {
StickyData stickyData = mList.get(position);
holder.tvTeam.setText(stickyData.getNovel());
if (position == 0) {
holder.tvArea.setVisibility(View.VISIBLE);
holder.tvArea.setText(stickyData.group);
holder.itemView.setTag(FIRST_STICKY_VIEW);
} else {
if (!TextUtils.equals(stickyData.group, mList.get(position - 1).group)) {
holder.tvArea.setVisibility(View.VISIBLE);
holder.tvArea.setText(stickyData.group);
holder.itemView.setTag(HAS_STICKY_VIEW);
} else {
holder.tvArea.setVisibility(View.GONE);
holder.itemView.setTag(NONE_STICKY_VIEW);
}
}
holder.itemView.setContentDescription(stickyData.group);
}
@Override
public int getItemCount() {
return mList == null ? 0 : mList.size();
}
public class StickyViewHolder extends RecyclerView.ViewHolder {
TextView tvArea, tvTeam;
public StickyViewHolder(View itemView) {
super(itemView);
tvArea = itemView.findViewById(R.id.tv_sticky_header_view);
tvTeam = itemView.findViewById(R.id.tv_novel);
}
}
}
代码链接:添加链接描述