<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      3.Android高仿網易云音樂-首頁復雜發現界面布局和功能/RecyclerView復雜布局

      0.效果圖

      效果圖依次為發現界面頂部,包含首頁輪播圖,水平滾動的按鈕,推薦歌單;然后是發現界面推薦單曲,點擊單曲就是直接進入播放界面;最后是全局播放控制條上點擊播放列表按鈕顯示的播放列表彈窗。

      1.整體分析

      整體使用RecycerView實現,每個不同的塊是一個Item,例如:輪播圖是一個Item,按鈕也是,推薦歌單和下面的歌單是,推薦單曲,還有最后的自定義首頁那塊也是一樣。

      提示:之所以把推薦歌單下面的歌單和推薦歌單標題放一個Item,主要是首頁要實現自定義順序功能,更方便管理。

      2.輪播圖

      2.1 布局

      <?xml version="1.0" encoding="utf-8"?>
      <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          android:layout_height="wrap_content"
          android:layout_margin="@dimen/padding_outer">
      
          <com.youth.banner.Banner
              android:id="@+id/banner"
              android:layout_width="0dp"
              android:layout_height="0dp"
              app:layout_constraintDimensionRatio="H,0.389"
              app:layout_constraintLeft_toLeftOf="parent"
              app:layout_constraintRight_toRightOf="parent"
              app:layout_constraintTop_toTopOf="parent" />
      </androidx.constraintlayout.widget.ConstraintLayout>
      

      2.2 顯示數據

      //banner
      BannerData data = (BannerData) d;
      
      Banner bannerView = holder.getView(R.id.banner);
      
      BannerImageAdapter<Ad> bannerImageAdapter = new BannerImageAdapter<Ad>(data.getData()) {
      
          @Override
          public void onBindView(BannerImageHolder holder, Ad data, int position, int size) {
              ImageUtil.show(getContext(), (ImageView) holder.itemView, data.getIcon());
          }
      };
      
      bannerView.setAdapter(bannerImageAdapter);
      
      bannerView.setOnBannerListener(onBannerListener);
      
      bannerView.setBannerRound(DensityUtil.dip2px(getContext(), 10));
      
      //添加生命周期觀察者
      bannerView.addBannerLifecycleObserver(fragment);
      
      bannerView.setIndicator(new CircleIndicator(getContext()));
      

      按鈕

      3.1 布局

      <?xml version="1.0" encoding="utf-8"?>
      <HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:paddingVertical="@dimen/padding_outer"
          android:scrollbars="none">
      
          <LinearLayout
              android:id="@+id/container"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:orientation="horizontal"
              android:paddingHorizontal="@dimen/padding_meddle">
      
          </LinearLayout>
      </HorizontalScrollView>
      

      3.2 顯示數據

      LinearLayout container = holder.getView(R.id.container);
      if (container.getChildCount() > 0) {
          //已經添加了
          return;
      }
      
      //橫向顯示5個半
      float containerWidth = ScreenUtil.getScreenWith(container.getContext()) - DensityUtil.dip2px(container.getContext(), 10 * 2);
      int itemWidth = (int) (containerWidth / 5.5);
      DiscoveryButtonBinding binding;
      LinearLayout.LayoutParams layoutParams;
      for (IconTitleButtonData it : data.getData()) {
          binding = DiscoveryButtonBinding.inflate(LayoutInflater.from(getContext()));
          binding.icon.setImageResource(it.getIcon());
          binding.title.setText(it.getTitle());
      
          if (it.getIcon() == R.drawable.day_recommend) {
              SuperViewUtil.show(binding.more);
      
              //顯示日期
              binding.more.setText(String.valueOf(SuperDateUtil.currentDay()));
          }
      
          //設置點擊事件
          binding.getRoot().setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
      
              }
          });
      
          layoutParams = new LinearLayout.LayoutParams(itemWidth, ViewGroup.LayoutParams.WRAP_CONTENT);
          container.addView(binding.getRoot(), layoutParams);
      }
      

      4.推薦歌單

      4.1 布局

      <?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/item_discovery_title" />
      
          <androidx.recyclerview.widget.RecyclerView
              android:id="@+id/list"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:paddingHorizontal="@dimen/padding_outer"
              android:paddingBottom="@dimen/d5" />
      </LinearLayout>
      

      4.2 顯示數據

      private void bindSheetData(BaseViewHolder holder, SheetData data) {
          //設置標題,將標題放到每個具體的item上,好處是方便整體排序
          holder.setText(R.id.title, R.string.recommend_sheet);
      
          //顯示更多容器
          holder.setVisible(R.id.more, true);
          holder.getView(R.id.more).setOnClickListener(v -> {
      
          });
      
          RecyclerView listView = holder.getView(R.id.list);
          if (listView.getAdapter() == null) {
              //設置顯示3列
              GridLayoutManager layoutManager = new GridLayoutManager(listView.getContext(), 3);
              listView.setLayoutManager(layoutManager);
      
              sheetAdapter = new SheetAdapter(R.layout.item_sheet);
      
              //item點擊
              sheetAdapter.setOnItemClickListener(new OnItemClickListener() {
                  @Override
                  public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
                      if (discoveryAdapterListener != null) {
                          discoveryAdapterListener.onSheetClick((Sheet) adapter.getItem(position));
                      }
                  }
              });
              listView.setAdapter(sheetAdapter);
      
              GridDividerItemDecoration itemDecoration = new GridDividerItemDecoration(getContext(), (int) DensityUtil.dip2px(getContext(), 5F));
              listView.addItemDecoration(itemDecoration);
          }
      
          sheetAdapter.setNewInstance(data.getData());
      }
      

      5. 底部

      5.1 布局

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:layout_marginVertical="@dimen/padding_outer"
          android:gravity="center_horizontal"
          android:orientation="vertical">
      
          <androidx.appcompat.widget.LinearLayoutCompat
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:gravity="center_vertical">
      
              <TextView
                  android:id="@+id/refresh_button"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:drawableLeft="@drawable/refresh"
                  android:gravity="center_vertical"
                  android:text="@string/click_refresh"
                  android:textColor="@color/link"
                  android:textSize="@dimen/text_small" />
      
              <TextView
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_marginLeft="@dimen/padding_small"
                  android:text="@string/change_content"
                  android:textColor="@color/black80"
                  android:textSize="@dimen/text_small" />
          </androidx.appcompat.widget.LinearLayoutCompat>
      
          <com.google.android.material.button.MaterialButton
              android:id="@+id/custom"
              style="@style/Widget.MaterialComponents.Button.UnelevatedButton"
              android:layout_width="wrap_content"
              android:layout_height="@dimen/d30"
              android:layout_marginTop="@dimen/padding_outer"
              android:backgroundTint="?attr/colorSurface"
              android:insetTop="0dp"
              android:insetBottom="0dp"
              android:text="@string/custom_discovery"
              android:textColor="@color/black80"
              android:textSize="@dimen/text_small"
              app:cornerRadius="@dimen/d15"
              app:elevation="0dp"
              app:strokeColor="@color/black80"
              app:strokeWidth="@dimen/d0_5" />
      </LinearLayout>
      

      5.2 顯示數據

      holder.getView(R.id.refresh_button).setOnClickListener(v -> discoveryAdapterListener.onRefreshClick());
      holder.getView(R.id.custom).setOnClickListener(v -> discoveryAdapterListener.onCustomDiscoveryClick());
      

      6.迷你控制條

      他是一個自定義Fragment,哪里要顯示就放到哪里就行了。

      7.播放列表彈窗

      /**
       * 播放列表對話框
       */
      public class MusicPlayListDialogFragment extends BaseViewModelBottomSheetDialogFragment<FragmentDialogAudioPlayListBinding> {
      
          ...
      
          @Override
          protected void initListeners() {
              super.initListeners();
              //刪除所有按鈕點擊
              binding.deleteAll.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      //關閉對話框
                      dismiss();
      
                      //刪除全部音樂
                      getMusicListManager().deleteAll();
                  }
              });
      
              //item中子控件點擊
              //刪除按鈕點擊
              adapter.addChildClickViewIds(R.id.delete);
      
              adapter.setOnItemChildClickListener(new OnItemChildClickListener() {
                  @Override
                  public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
                      //由于這里只有一個按鈕點擊
                      //所以可以不判斷
                      if (R.id.delete == view.getId()) {
                          //刪除按鈕點擊
                          removeItem(position);
                      }
                  }
              });
      
              //循環模式點擊
              binding.loopModel.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      //更改循環模式
                      getMusicListManager().changeLoopModel();
      
                      //顯示循環模式
                      showLoopModel();
      
                  }
              });
      
              //設置item點擊事件
              adapter.setOnItemClickListener(new OnItemClickListener() {
                  @Override
                  public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
                      //關閉dialog
                      //可以根據具體的業務邏輯來決定是否關閉
                      dismiss();
      
                      //播放點擊的這首音樂
                      getMusicListManager().play(getMusicListManager().getDatum().get(position));
                  }
              });
      
          }
      
          private void removeItem(int position) {
              adapter.removeAt(position);
      
              //從列表管理器中刪除
              getMusicListManager().delete(position);
      
              showCount();
          }
      
          /**
           * 顯示循環模式
           */
          private void showLoopModel() {
              PlayListUtil.showLoopModel(getMusicListManager().getLoopModel(), binding.loopModel);
          }
      
          private void showCount() {
              binding.count.setText(String.format("(%d)", getMusicListManager().getDatum().size()));
          }
      }
      
      

      感謝你的閱讀,更多文章請關注我們,點擊,評論,轉發支持。

      posted on 2022-07-24 10:01  愛學啊  閱讀(824)  評論(0)    收藏  舉報

      導航

      主站蜘蛛池模板: 免费视频欧美无人区码| 国产精品久久久一区二区三区| 国产日韩精品欧美一区灰| 日本免费一区二区三区日本| 色哟哟www网站入口成人学校| 久久亚洲国产精品五月天| 四虎成人精品永久网站| 文化| 亚洲精品国产熟女久久久| 国产成AV人片久青草影院| 性视频一区| 国产成人午夜精品福利| 人妻系列无码专区免费| 亚洲视频一区| 国产成人AV国语在线观看| 嘉禾县| 一本久久a久久精品综合| 亚洲成人av在线资源网| 快好爽射给我视频| 亚洲av鲁丝一区二区三区黄| 92精品国产自产在线观看481页| 成人午夜福利精品一区二区| 蜜桃久久精品成人无码av| 亚洲sm另类一区二区三区| 大尺度国产一区二区视频| 99热精品国产三级在线观看| 国模冰莲自慰肥美胞极品人体图| 欧美人人妻人人澡人人尤物 | 人成午夜免费大片| 国产精品综合一区二区三区| 小伙无套内射老熟女精品| 久久人人97超碰精品| 一本久久a久久精品综合| 国产精品乱人伦一区二区| 18禁黄无遮挡网站免费| 免费无码久久成人网站入口| 亚洲V天堂V手机在线| 国产国拍亚洲精品永久软件 | 国产精品性视频一区二区| 小婕子伦流澡到高潮h| 亚洲性一交一乱一伦视频|