新增我的推荐歌单、通过ViewPager2+RadioGroup重构主界面( 简易音乐 六)

新增我的推荐歌单、通过ViewPager2+RadioGroup重构主界面( 简易音乐 六)

关于

  在本篇开始之前,我发现之前以为的在fragment中使用轮播图在切换的过程中会导致重新加载banner的问题,其实是因为我使用的开启事务里面的replace方法调用了remove,导致碎片被移除,自然就banner也销毁了。上一篇请看主界面绘制、加载轮播图、减少apk体积( 简易音乐 五)
  本想着主界面代码简洁一点,经过这次重构,主界面代码增加了一部分,但是还好,我们现在看下运行效果。

效果

  因为我用的一个工具网站视频转GIF(免费),只支持15秒及以内转换,所以很多时候比较仓促,也懒得搞两段,,理解一下,按着教程来不会差的:
在这里插入图片描述

添加Api接口

 /**
     * 每日推荐歌单*/
    @GET("recommend/resource")
    Observable<RecommendListBean> getRecommendPlayList();

  添加对应实体类RecommendListBean

/**
 * 首页推荐歌单的ban
 * Created By Tobey on 2021/7/01
 */
public class RecommendListBean {

    private int code;
    private boolean featureFirst;
    private boolean haveRcmdSongs;
    private List<RecommendBean> recommend;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public boolean isFeatureFirst() {
        return featureFirst;
    }

    public void setFeatureFirst(boolean featureFirst) {
        this.featureFirst = featureFirst;
    }

    public boolean isHaveRcmdSongs() {
        return haveRcmdSongs;
    }

    public void setHaveRcmdSongs(boolean haveRcmdSongs) {
        this.haveRcmdSongs = haveRcmdSongs;
    }

    public List<RecommendBean> getRecommend() {
        return recommend;
    }

    public void setRecommend(List<RecommendBean> recommend) {
        this.recommend = recommend;
    }

    public static class RecommendBean {

        private long id;
        private int type;
        private String name;
        private String copywriter;
        private String picUrl;
        private long playcount;
        private long createTime;
        private CreatorBean creator;
        private int trackCount;
        private long userId;
        private String alg;

        public long getId() {
            return id;
        }

        public void setId(long id) {
            this.id = id;
        }

        public int getType() {
            return type;
        }

        public void setType(int type) {
            this.type = type;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getCopywriter() {
            return copywriter;
        }

        public void setCopywriter(String copywriter) {
            this.copywriter = copywriter;
        }

        public String getPicUrl() {
            return picUrl;
        }

        public void setPicUrl(String picUrl) {
            this.picUrl = picUrl;
        }

        public long getPlaycount() {
            return playcount;
        }

        public void setPlaycount(long playcount) {
            this.playcount = playcount;
        }

        public long getCreateTime() {
            return createTime;
        }

        public void setCreateTime(long createTime) {
            this.createTime = createTime;
        }

        public CreatorBean getCreator() {
            return creator;
        }

        public void setCreator(CreatorBean creator) {
            this.creator = creator;
        }

        public int getTrackCount() {
            return trackCount;
        }

        public void setTrackCount(int trackCount) {
            this.trackCount = trackCount;
        }

        public long getUserId() {
            return userId;
        }

        public void setUserId(long userId) {
            this.userId = userId;
        }

        public String getAlg() {
            return alg;
        }

        public void setAlg(String alg) {
            this.alg = alg;
        }

        public static class CreatorBean {

            private String backgroundImgIdStr;
            private Object remarkName;
            private boolean mutual;
            private long userId;
            private long avatarImgId;
            private int djStatus;
            private boolean followed;
            private String backgroundUrl;
            private long backgroundImgId;
            private String detailDescription;
            private boolean defaultAvatar;
            private Object expertTags;
            private int accountStatus;
            private int vipType;
            private int province;
            private int gender;
            private String avatarUrl;
            private int authStatus;
            private int userType;
            private String nickname;
            private long birthday;
            private int city;
            private String avatarImgIdStr;
            private String description;
            private String signature;
            private int authority;

            public String getBackgroundImgIdStr() {
                return backgroundImgIdStr;
            }

            public void setBackgroundImgIdStr(String backgroundImgIdStr) {
                this.backgroundImgIdStr = backgroundImgIdStr;
            }

            public Object getRemarkName() {
                return remarkName;
            }

            public void setRemarkName(Object remarkName) {
                this.remarkName = remarkName;
            }

            public boolean isMutual() {
                return mutual;
            }

            public void setMutual(boolean mutual) {
                this.mutual = mutual;
            }

            public long getUserId() {
                return userId;
            }

            public void setUserId(long userId) {
                this.userId = userId;
            }

            public long getAvatarImgId() {
                return avatarImgId;
            }

            public void setAvatarImgId(long avatarImgId) {
                this.avatarImgId = avatarImgId;
            }

            public int getDjStatus() {
                return djStatus;
            }

            public void setDjStatus(int djStatus) {
                this.djStatus = djStatus;
            }

            public boolean isFollowed() {
                return followed;
            }

            public void setFollowed(boolean followed) {
                this.followed = followed;
            }

            public String getBackgroundUrl() {
                return backgroundUrl;
            }

            public void setBackgroundUrl(String backgroundUrl) {
                this.backgroundUrl = backgroundUrl;
            }

            public long getBackgroundImgId() {
                return backgroundImgId;
            }

            public void setBackgroundImgId(long backgroundImgId) {
                this.backgroundImgId = backgroundImgId;
            }

            public String getDetailDescription() {
                return detailDescription;
            }

            public void setDetailDescription(String detailDescription) {
                this.detailDescription = detailDescription;
            }

            public boolean isDefaultAvatar() {
                return defaultAvatar;
            }

            public void setDefaultAvatar(boolean defaultAvatar) {
                this.defaultAvatar = defaultAvatar;
            }

            public Object getExpertTags() {
                return expertTags;
            }

            public void setExpertTags(Object expertTags) {
                this.expertTags = expertTags;
            }

            public int getAccountStatus() {
                return accountStatus;
            }

            public void setAccountStatus(int accountStatus) {
                this.accountStatus = accountStatus;
            }

            public int getVipType() {
                return vipType;
            }

            public void setVipType(int vipType) {
                this.vipType = vipType;
            }

            public int getProvince() {
                return province;
            }

            public void setProvince(int province) {
                this.province = province;
            }

            public int getGender() {
                return gender;
            }

            public void setGender(int gender) {
                this.gender = gender;
            }

            public String getAvatarUrl() {
                return avatarUrl;
            }

            public void setAvatarUrl(String avatarUrl) {
                this.avatarUrl = avatarUrl;
            }

            public int getAuthStatus() {
                return authStatus;
            }

            public void setAuthStatus(int authStatus) {
                this.authStatus = authStatus;
            }

            public int getUserType() {
                return userType;
            }

            public void setUserType(int userType) {
                this.userType = userType;
            }

            public String getNickname() {
                return nickname;
            }

            public void setNickname(String nickname) {
                this.nickname = nickname;
            }

            public long getBirthday() {
                return birthday;
            }

            public void setBirthday(long birthday) {
                this.birthday = birthday;
            }

            public int getCity() {
                return city;
            }

            public void setCity(int city) {
                this.city = city;
            }

            public String getAvatarImgIdStr() {
                return avatarImgIdStr;
            }

            public void setAvatarImgIdStr(String avatarImgIdStr) {
                this.avatarImgIdStr = avatarImgIdStr;
            }

            public String getDescription() {
                return description;
            }

            public void setDescription(String description) {
                this.description = description;
            }

            public String getSignature() {
                return signature;
            }

            public void setSignature(String signature) {
                this.signature = signature;
            }

            public int getAuthority() {
                return authority;
            }

            public void setAuthority(int authority) {
                this.authority = authority;
            }
        }
    }
}

重构主界面

  修改主界面布局文件activity_main.xml(使用viewpager2):

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <!--android:background="@color/whitesmoke"-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

        <RadioGroup
            android:id="@+id/rg_tabs"
            android:layout_width="match_parent"
            android:layout_height="54dp"
            android:gravity="center_vertical"
            android:orientation="horizontal"
            android:padding="5dp">

            <RadioButton
                android:id="@+id/rb_main"
                style="@style/tab_RadioButton_normal"
                android:drawableTop="@drawable/bottom_home_style"
                android:text="@string/home_page"
                />

            <RadioButton
                android:id="@+id/rb_contract"
                style="@style/tab_RadioButton_normal"
                android:drawableTop="@drawable/bottom_topic_style"
                android:text="@string/cloud"
                />
            <RadioButton
                android:id="@+id/rb_me"
                style="@style/tab_RadioButton_normal"
                android:drawableTop="@drawable/bottom_me_style"
                android:text="@string/me"
                />

        </RadioGroup>
    </LinearLayout>

</FrameLayout>

  修改MainActivity.java代码:

@Route(path = Config.ROUTE_HOME)
public class MainActivity extends BaseActivity {

    @BindView(R.id.rg_tabs)
    RadioGroup rgTabs;
    @BindView(R.id.view_pager)
    ViewPager2 viewPager2;

    private List<Fragment> fragmentList;

    private long firstTime = 0;

    //监听viewpager2页面切换监听
    private ViewPager2.OnPageChangeCallback onPageChange = new ViewPager2.OnPageChangeCallback() {
        @Override
        public void onPageSelected(int position) {
            rgTabs.setOnCheckedChangeListener(null);
            switch (position){
                case 0:
                    rgTabs.check(R.id.rb_main);
                    break;
                case 1:
                    rgTabs.check(R.id.rb_contract);
                    break;
                case 2:
                    rgTabs.check(R.id.rb_me);
                    break;
            }
            rgTabs.setOnCheckedChangeListener(onCheckedChange);
        }
    };

    private RadioGroup.OnCheckedChangeListener onCheckedChange = new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            viewPager2.unregisterOnPageChangeCallback(onPageChange);
            switch (checkedId){
                case R.id.rb_main:
                    viewPager2.setCurrentItem(0,false);
                    break;
                case R.id.rb_contract:
                    viewPager2.setCurrentItem(1,false);
                    break;
                case R.id.rb_me:
                    viewPager2.setCurrentItem(2,false);
                    break;

            }
            viewPager2.registerOnPageChangeCallback(onPageChange);

        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        fragmentList = new ArrayList<>();
        fragmentList.add(new Fragment_main());
        //下面两个暂为空白页
        fragmentList.add(new Fragment_center());
        fragmentList.add(new Fragment_me());
        viewPager2.setAdapter(new MyPagerAdapter(getSupportFragmentManager(),getLifecycle(),fragmentList));
        viewPager2.registerOnPageChangeCallback(onPageChange);
        rgTabs.setOnCheckedChangeListener(onCheckedChange);
    }

    @Override
    protected BasePresenter onCreatePresenter() {
        return null;
    }

    @Override
    protected void initData() {
       
    }

    @Override
    protected void initModule() {
        //默认选中第一个fragnebt
        rgTabs.check(R.id.rb_main);



    }

    private class MyPagerAdapter extends FragmentStateAdapter {

        private List<Fragment> fragmentList;

        public MyPagerAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle, List<Fragment> fragmentList) {
            super(fragmentManager, lifecycle);
            this.fragmentList = fragmentList;
        }


        @NonNull
        @Override
        public Fragment createFragment(int position) {
            return fragmentList.get(position);
        }

        @Override
        public int getItemCount() {
            return fragmentList.size();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        viewPager2.unregisterOnPageChangeCallback(onPageChange);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() ==KeyEvent.ACTION_UP){
            long secondTime = System.currentTimeMillis();
            if (secondTime - firstTime >2000){
                ToastUtils.show("再按一次退出程序");
                firstTime = secondTime;
                return true;
            }else {
                AppManager.getAppManager().AppExit();
            }
        }
        return super.onKeyDown(keyCode, event);
    }
}

新增推荐歌单功能

  修改fragment_main.xml布局文件:

//上面的不动,可以查看上一篇文章
<androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recommend_recycle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/rl_show_recommend_playlist"
            android:orientation="horizontal"/>

  修改Fragment_main.java


public class Fragment_main extends BaseFragment {

    @BindView(R.id.banner)
    Banner banner;
    @BindView(R.id.text_fm)
    TextView textView_fm;
    @BindView(R.id.recommend_recycle)
    RecyclerView recyclerRecommend;
  
   List<banner_bean.BannersBean> list_banner ;
   
    private RecommdListAdapter adapter;
    //推荐歌单集合
    List<RecommendListBean.RecommendBean> list_recommend = new ArrayList<>();


    @Override
    protected int getLayout() {
        return R.layout.fragment_main;
    }

    @Override
    protected void initView(View view) {
        String date = Calendar.getInstance().get(Calendar.DAY_OF_MONTH) + "";
        textView_fm.setText(date);
        initData();
    }

    private void initData() {
        RetrofitUtils.getmApi().getBanner(1)
                .compose(RXHelper.observableIO2Main(getContext()))
                .subscribe(new StaticMethodUtils.OnCallback<banner_bean>(){

                    @Override
                    public void onNext(banner_bean banner_bean) {
                        if (banner_bean.getCode() == 200){

                            updateBanner(banner_bean.getBanners());

                        }
                    }

                    @Override
                    public void onError(Throwable e) {
                        super.onError(e);
                    }
                });
        list_recommend.clear();

        LinearLayoutManager manager = new LinearLayoutManager(getContext());
        manager.setOrientation(LinearLayoutManager.HORIZONTAL);
        recyclerRecommend.setLayoutManager(manager);
        //获取推荐歌单列表    
        RetrofitUtils.getmApi().getRecommendPlayList()
                .compose(RXHelper.observableIO2Main(getContext()))
                .subscribe(new StaticMethodUtils.OnCallback<RecommendListBean>(){
                    @Override
                    public void onNext(RecommendListBean recommendListBean) {
                        if (recommendListBean.getCode() == 200){
                            list_recommend_sq = new ArrayList<>();
                            int size = recommendListBean.getRecommend().size();
                            for (int i=0;i<size;i++){
                                RecommendListBean.RecommendBean bean = new RecommendListBean.RecommendBean();
                                bean.setPicUrl(recommendListBean.getRecommend().get(i).getPicUrl());
                                bean.setName(recommendListBean.getRecommend().get(i).getName());
                                bean.setPlaycount(recommendListBean.getRecommend().get(i).getPlaycount());
                                list_recommend.add(bean);
                            }

                            adapter = new RecommdListAdapter(list_recommend);
                            adapter.notifyDataSetChanged();
                        }
                    }

                    @Override
                    public void onError(Throwable e) {
                        super.onError(e);
                    }
                });


    }

    private void updateBanner(List<banner_bean.BannersBean> banners) {
        if (banners !=null && banners.size() >0){
            int i = banners.size();
            list_banner_sq = new ArrayList<>();
            for (int j=0;j<i;j++){
                 banner_bean.BannersBean bannerBean = new banner_bean.BannersBean();
                               bannerBean.setUrl(banners.get(j).getUrl());
                               bannerBean.setPic(banners.get(j).getPic());
                               bannerBean.setTypeTitle(banners.get(j).getTypeTitle());
                               bannerBean.setTitleColor(banners.get(j).getTitleColor());
                            //   bannerBean.setSong(banners.get(j).getSong());
                               list_banner.add(bannerBean);
            }
            banner.setIndicator(new RectangleIndicator(getActivity()))
                    .setIndicatorHeight(5)
                    .setIndicatorWidth(6,6)
                    .setIndicatorGravity(IndicatorConfig.Direction.CENTER)
                    .setAdapter(new ImageTitleAdapter(list_banner_sq,this))
                    .addBannerLifecycleObserver(getActivity())//添加生命周期观察者
                    .setIntercept(true)
                    .setBannerRound(10f);
            insertBannerDb();
        }
    }


    @Override
    protected void setListener() {

    }

}

新增推荐歌单适配器

  新增item_recommd.xml布局文件:

  添加RecommdHolder.java

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/rl_playlist"
    android:layout_width="wrap_content"
    android:layout_height="@dimen/dp_165"
    android:layout_rowWeight="1"
    android:layout_weight="1"
    android:padding="@dimen/dp_8">

    <ImageView
        android:id="@+id/iv_recomm"
        android:layout_width="@dimen/dp_120"
        android:layout_height="@dimen/dp_110"
        android:layout_centerHorizontal="true"
        android:scaleType="fitXY"
        android:background="@drawable/shape_stoke"
         />
    <TextView
        android:id="@+id/tv_recommlist_name"
        android:layout_width="@dimen/dp_120"
        android:layout_height="wrap_content"
        android:layout_below="@id/iv_recomm"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="@dimen/dp_5"
        android:ellipsize="end"
        android:maxLines="2"
        android:textColor="#333333"
        android:textSize="@dimen/sp_12" />
    <TextView
        android:id="@+id/tv_playcount"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="@dimen/dp_70"
        android:textColor="#333333"
        app:elevation="8dp"
        android:textSize="@dimen/dp_12"/>
</RelativeLayout>
public class RecommdHolder extends RecyclerView.ViewHolder {
    public ImageView imageView;
    public TextView tvName,tvNum;

    public RecommdHolder(@NonNull View itemView) {
        super(itemView);
        imageView = itemView.findViewById(R.id.iv_recomm);
        tvName = itemView.findViewById(R.id.tv_recommlist_name);
        tvNum = itemView.findViewById(R.id.tv_playcount);
    }
}

  新增RecommdListAdapter.java适配器:

public class RecommdListAdapter extends BaseAdapter<RecommendListBean.RecommendBean,RecommdHolder> {

    public RecommdListAdapter(List<RecommendListBean.RecommendBean> datas) {
        super(datas);
    }


    @Override
    public int getItemCount() {
        return 6;
    }

    @Override
    public void notifyDataSetChanged(List<RecommendListBean.RecommendBean> data) {

    }


    @Override
    public RecommdHolder onCreateHolder(ViewGroup parent, int viewType) {
        return new RecommdHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recommd,parent,false));
    }

    @Override
    public void onBindView(RecommdHolder holder, RecommendListBean.RecommendBean data, int position, int size) {
        RequestOptions options = new RequestOptions()
                .placeholder(R.mipmap.ic_launcher)
                 .optionalTransform(new RoundedCorners(16))
                //这里我通过添加参数DiskCaheStrategy.RESPURCE来使其缓存我们定好的图片大小样式,而不是缓存原图片大小
                .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
                .error(R.mipmap.ic_launcher);
        Glide.with(holder.imageView)
                .load(data.getPicUrl())
                .thumbnail(Glide.with(holder.itemView).load(R.drawable.loading))
                .apply(options)
                .into(holder.imageView);
         holder.tvName.setText(data.getName());
         holder.tvNum.setText(String.valueOf(data.getPlaycount()));
    }
}

好了,本篇文章到此结束,有问题欢迎批评指正,喜欢的也请点个赞┗|`O′|┛ 嗷~~

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪の星空朝酱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值