RecyclerView完善类微信开发主界面

前言

接上一篇blog
上一次完成了程序的页面的基本布局以及页面之间的切换,这一篇blog将利用RecyclerView完成其中一个tab界面的简单布局🎉

附上gitee上的项目链接🎈

背景介绍

  1. 开发工具 :Android Studio;
  2. tab布局使用技术 :RecyclerView;
  3. tab布局 :顶部悬浮(吸顶)

开发参考

  1. Android开发官方文档
    链接: RecyclerView官方文档介绍.
  2. RecyclerView 使用方法总结
    链接: RecyclerView 使用方法总结.

RecyclerView中的内容

我选择顶部悬浮的布局按照年份将张艺兴LAY的年度发展总结进行展示

项目运行效果截图

  1. 在这里插入图片描述

  2. 在这里插入图片描述

  3. 在这里插入图片描述

  4. 在这里插入图片描述

我Gitee上的项目🎈

链接: Gitee上发布的项目

项目核心代码🔑

  1. 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);
        }
    }
  1. 获取数据函数
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;
    }
}
  1. 按钮点击事件
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;
        }
}
  1. 屏幕滚动监听函数
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);
                    }
                }
            }
        });

遇到的问题及解决方法❗

  1. Xml布局文件:android studio在XML预览中出现Rendering Problems问题
    解决方法:
    ①在styles.xml里的
<style name="AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar">

原来是没有Base的,加上那个问题就没了;
②布局文件预览那里的API调到21以下。

  1. 关于RecyclerView的位置:起初我一直将RecyclerView放在tab01中,可是在预览时界面一直加载不出来,后来我将RecyclerView放在activity_main.xml中就可以正常显示。

项目总结✔

第一次接触RecyclerView,写的时候还不是很熟练,但是adapter中的函数逻辑还比较简单,大致是onBindViewHolder、getItemCount两个函数,在本次项目中,我只是写了静态数据,没有采取从网址获取数据,只是实现了简单的布局,而且最后的效果好像还不够理想,下面的button不见了😒…还有待完善。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章