RecyclerView完善类微信开发主界面
前言
接上一篇blog
上一次完成了程序的页面的基本布局以及页面之间的切换,这一篇blog将利用RecyclerView完成其中一个tab界面的简单布局🎉
附上gitee上的项目链接🎈
- 链接: Gitee上发布的项目
背景介绍
- 开发工具 :Android Studio;
- tab布局使用技术 :RecyclerView;
- tab布局 :顶部悬浮(吸顶)
开发参考
- Android开发官方文档 :
链接: RecyclerView官方文档介绍. - RecyclerView 使用方法总结 :
链接: RecyclerView 使用方法总结.
RecyclerView中的内容
我选择顶部悬浮的布局按照年份将张艺兴LAY的年度发展总结进行展示
项目运行效果截图
我Gitee上的项目🎈
链接: Gitee上发布的项目
项目核心代码🔑
- Adapter部分代码:
public void onBindViewHolder(@NonNull StickyViewHolder holder, int position) {
StickyData stickyData = mList.get(position);
holder.tvTeam.setText(stickyData.getTeam());
if (position == 0) {
holder.tvArea.setVisibility(View.VISIBLE);
holder.tvArea.setText(stickyData.area);
holder.itemView.setTag(FIRST_STICKY_VIEW);
} else {
if (!TextUtils.equals(stickyData.area, mList.get(position - 1).area)) {
holder.tvArea.setVisibility(View.VISIBLE);
holder.tvArea.setText(stickyData.area);
holder.itemView.setTag(HAS_STICKY_VIEW);
} else {
holder.tvArea.setVisibility(View.GONE);
holder.itemView.setTag(NONE_STICKY_VIEW);
}
}
holder.itemView.setContentDescription(stickyData.area);
}
@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_team);
}
}
- 获取数据函数:
public class StickyData {
public String year;
public String trend;
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public String getTrend() {
return trend;
}
public void setTeam(String trend) {
this.trend = trend;
}
}
- 按钮点击事件:
public void onClick(View v){//点击响应
resetimg();
switch (v.getId()){
case R.id.id_tab_weixin:
selectfragment(0);
break;
case R.id.id_tab_friend:
selectfragment(1);
break;
case R.id.id_tab_contact:
selectfragment(2);
break;
case R.id.id_tab_settings:
selectfragment(3);
break;
default:
break;
}
}
- 屏幕滚动监听函数:
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 == StickyAdapter.HAS_STICKY_VIEW) {
if (transInfoView.getTop() > 0) {
tvArea.setTranslationY(dealtY);
} else {
tvArea.setTranslationY(0);
}
} else if (transViewStatus == StickyAdapter.NONE_STICKY_VIEW) {
tvArea.setTranslationY(0);
}
}
}
});
遇到的问题及解决方法❗
- Xml布局文件:android studio在XML预览中出现Rendering Problems问题
解决方法:
①在styles.xml里的
<style name="AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar">
原来是没有Base的,加上那个问题就没了;
②布局文件预览那里的API调到21以下。
- 关于RecyclerView的位置:起初我一直将RecyclerView放在tab01中,可是在预览时界面一直加载不出来,后来我将RecyclerView放在activity_main.xml中就可以正常显示。
项目总结✔
第一次接触RecyclerView,写的时候还不是很熟练,但是adapter中的函数逻辑还比较简单,大致是onBindViewHolder、getItemCount两个函数,在本次项目中,我只是写了静态数据,没有采取从网址获取数据,只是实现了简单的布局,而且最后的效果好像还不够理想,下面的button不见了😒…还有待完善。