中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Android中利用GridView實現一個水平滾動功能

發布時間:2020-12-04 16:50:39 來源:億速云 閱讀:292 作者:Leah 欄目:移動開發

怎么在Android中利用GridView實現一個水平滾動功能?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

Android為我們提供了豎直方向的滾動控件GridView,但如果我們想讓它水平滾動起來,就需要自己實現了。

以下使用的測試數據datas集合都為List<ResolveInfo>類型,用來存儲手機中的所有App

  public static List<ResolveInfo> getAppData(Context context) {
    PackageManager packageManager = context.getPackageManager();
    Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
    mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
    return packageManager.queryIntentActivities(mainIntent, 0);
  }

一、單行橫向顯示

怎么在Android中利用GridView實現一個水平滾動功能

實現思路

  1. 在代碼中動態設置GridView的NumColumns,使其等于GridView要顯示的數據集合大小。
  2. 動態設置item項寬度,結合數據集合大小來設置GridView的總寬度。
  3. 使用HorizontalScrollView包裹GridView
     

具體實現

關鍵代碼

  /**
   * 將GridView改成單行橫向布局
   */
  private void changeGridView() {
    // item寬度
    int itemWidth = DensityUtil.dip2px(this, 100);
    // item之間的間隔
    int itemPaddingH = DensityUtil.dip2px(this, 1);
    int size = datas.size();
    // 計算GridView寬度
    int gridviewWidth = size * (itemWidth + itemPaddingH);

    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
        gridviewWidth, LinearLayout.LayoutParams.MATCH_PARENT);
    mContentGv.setLayoutParams(params);
    mContentGv.setColumnWidth(itemWidth);
    mContentGv.setHorizontalSpacing(itemPaddingH);
    mContentGv.setStretchMode(GridView.NO_STRETCH);
    mContentGv.setNumColumns(size);
  }

這里用到的dip2px方法是根據手機的分辨率從 dp 的單位 轉成為 px(像素)

  /**
   * 根據手機的分辨率從 dp 的單位 轉成為 px(像素)
   * @param context  上下文
   * @param dpValue  dp值
   * @return px值
   */
  public static int dip2px(Context context, float dpValue) {
    final float scale = context.getResources().getDisplayMetrics().density;
    return (int) (dpValue * scale + 0.5f);
  }

在布局文件中,使用HorizontalScrollView包裹GridView

  <HorizontalScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:scrollbars="none">
    <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="match_parent">
      <GridView
        android:id="@+id/gv_horizontal_gridview_line"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="none"/>
    </LinearLayout>
  </HorizontalScrollView>

通過以上設置,再加上Adapter適配器就能實現單行橫向滾動了,適配器使用常規的實現方式就行,這里就不貼了

二、多行橫向分頁顯示

怎么在Android中利用GridView實現一個水平滾動功能

實現思路

  1. 使用ViewPager實現左右翻頁效果。
  2. 根據數據集合大小,計算出要顯示的頁數,并生成相應數量的GridView。
  3. 在GridView的Adapter適配器中,動態分配GridView需要顯示的數據集合。
  4. 使用List保存多個GridView實例并傳入ViewPager適配器中,一頁ViewPager對應一個GridView實例。

具體實現

數據量很多時,需要進行分頁,計算方式

需要頁數 = 總數量 ÷ 每頁顯示數量

有些整除不了的,就需要使用Math.ceil()函數,向上取整

關鍵代碼

  /**
   * 獲取系統所有的應用程序,根據每頁需要顯示的item數量,生成相應數量的GridView頁面
   */
  private void initViews(List<ResolveInfo> datas) {
    int dataSize = datas.size();

    // (需要頁數 = 總數量 ÷ 每頁顯示數量)向上取整數
    int PageCount = (int) Math.ceil(dataSize / APP_SIZE);
    mGridViewList = new ArrayList<>();
    for (int i = 0; i <= PageCount; i++) {
      GridView appPage = new GridView(this);
      appPage.setAdapter(new HorizontalGvAdapter(this, datas, i));
      appPage.setNumColumns(4);
      appPage.setVerticalSpacing(1);
      appPage.setHorizontalSpacing(1);
      appPage.setHorizontalScrollBarEnabled(false);
      appPage.setVerticalScrollBarEnabled(false);
      mGridViewList.add(appPage);
    }

    if(dataSize % APP_SIZE == 0){
      mGridViewList.remove(mGridViewList.size()-1);
      PageCount--;
    }

    mGvPagerAdapter = new HorizontalGvPagerAdapter(mGridViewList);
    viewPager.setAdapter(mGvPagerAdapter);
    viewPager.addOnPageChangeListener(new MyPageChangeListener());

    addDot(PageCount);
  }

當總數量 ÷ 每頁顯示數量剛好被整除時,會出現一頁空白頁的情況,這個時候需要去掉多出來的那一頁

    if(dataSize % APP_SIZE == 0){
      mGridViewList.remove(mGridViewList.size()-1);
      PageCount--;
    }

Adapter在創建初期就要對顯示的數據進行控制,因為這里每個GridView都有一個單獨的Adapter,所以需要對其顯示的datas進行動態計算

通過傳入構造方法的數據進行動態計算,可以得出數據開始加載的位置、結束加載的位置

HorizontalGvAdapter的構造方法:

  /**
   * 所有應用數據
   */
  private List<ResolveInfo> mAppDatas = new ArrayList<ResolveInfo>();

  public HorizontalGvAdapter(Context context, List<ResolveInfo> list, int page) {
    this.mContext = context;

    // 開始加載的位置
    int pageStart = page * HorizontalGridViewAct.APP_SIZE;
    // 結束加載的位置
    int pageEnd = pageStart + HorizontalGridViewAct.APP_SIZE;

    while ((pageStart < list.size()) && (pageStart < pageEnd)) {
      mAppDatas.add(list.get(pageStart));
      pageStart++;
    }
  }

如果需要加小圓點的話,可以先在布局中用一個空LinearLayout當小圓點的容器

<&#63;xml version="1.0" encoding="utf-8"&#63;>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:background="#ffffff"
       android:orientation="vertical">
  <android.support.v4.view.ViewPager
    android:id="@+id/vp_horizontal_gridview"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:layout_gravity="center"
    android:background="#c5c5c5"
    android:scaleType="fitXY"/>

  <!-- 底部小圓點 -->
  <LinearLayout
    android:id="@+id/ll_dot_container"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="#4b4b4b"
    android:layout_gravity="bottom"
    android:gravity="center"
    android:orientation="horizontal"/>
</LinearLayout>

然后在代碼中用List<View>來保存創建的小圓點

  // 放圓點的list
  private List<View> dotViewsList;

  /**
   * 創建指定數量的圓點
   * @param dotNumber viewPager的數量
   */
  private void addDot(int dotNumber) {
    if (null == dotViewsList) {
      dotViewsList = new ArrayList<View>();
    }
    LinearLayout dotLayout = (LinearLayout) findViewById(R.id.ll_dot_container);
    for (int i = 0; i <= dotNumber; i++) {
      ImageView dotView = new ImageView(this);
      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
          FrameLayout.LayoutParams.WRAP_CONTENT,
          FrameLayout.LayoutParams.WRAP_CONTENT);

      // 圓點與圓點之間的距離
      params.leftMargin = 10;
      params.rightMargin = 10;

      // 圓點的大小
      params.height = 15;
      params.width = 15;

      dotLayout.addView(dotView, params);
      dotViewsList.add(dotView);
    }
    // 設置圓點默認選中第一個
    setDotShow(0);
  }
動態添加完小圓點后,就可以設置它們的選中狀態了,這里只需要更改對應小圓點的圖片顯示就行

  /**
   * 顯示底部圓點導航
   * @param position 選中哪個圓點
   */
  private void setDotShow(int position){
    if (dotViewsList == null){
      return;
    }
    for (int i = 0; i < dotViewsList.size(); i++) {
      if (i == position) {
        dotViewsList.get(position).setBackgroundResource(R.drawable.ic_dot_on);
      } else {
        dotViewsList.get(i).setBackgroundResource(R.drawable.ic_dot_off);
      }
    }
  }

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

桂东县| 巴林右旗| 六盘水市| 德令哈市| 南安市| 仙居县| 林芝县| 武穴市| 墨竹工卡县| 安图县| 林周县| 祁连县| 特克斯县| 达拉特旗| 集贤县| 光山县| 垦利县| 射阳县| 新昌县| 鸡西市| 河津市| 贵南县| 子洲县| 汝州市| 宁城县| 米泉市| 韩城市| 汶上县| 新沂市| 张掖市| 邵阳市| 四子王旗| 都匀市| 宁海县| 保山市| 新巴尔虎右旗| 遵化市| 南京市| 宜阳县| 丹江口市| 德昌县|