Android 가 GridView 를 수평 으로 스크롤 하 는 실현 방식 을 자세히 설명 합 니 다.

Android 는 수직 방향의 스크롤 컨트롤 GridView 를 제공 합 니 다.그러나 수평 으로 스크롤 하려 면 스스로 이 루어 져 야 합 니 다.
아래 에 사 용 된 테스트 데이터 datas 집합 은 모두 List형식 으로 핸드폰 에 있 는 모든 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);
  }
1.한 줄 가로 표시
这里写图片描述
사고의 방향 을 실현 하 다.
코드 에 GridView 의 NumColumns 를 동적 으로 설정 하여 GridView 가 표시 할 데이터 집합 크기 와 같 도록 합 니 다
  • 동적 으로 item 항목 의 폭 을 설정 하고 데이터 집합 크기 와 결합 하여 GridView 의 총 폭 을 설정 합 니 다
  • Horizontal ScrollView 패키지 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);
      }
    레이아웃 파일 에서 Horizontal ScrollView 패키지 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 어댑터 를 더 하면 한 줄 의 가로 스크롤 을 실현 할 수 있 습 니 다.어댑터 는 일반적인 실현 방식 을 사용 하면 됩 니 다.여 기 는 붙 이지 않 습 니 다.
    2.여러 줄 의 가로 페이지 표시
    这里写图片描述
    사고의 방향 을 실현 하 다.
  • ViewPager 를 사용 하여 좌우 페이지 넘 기기 효 과 를 실현 합 니 다.
  • 4.567917.데이터 집합 크기 에 따라 표시 할 페이지 수 를 계산 하고 해당 수량의 GridView 를 생 성 합 니 다
  • GridView 의 Adapter 어댑터 에서 GridView 가 표시 해 야 할 데이터 집합 을 동적 으로 분배 합 니 다
  • 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 를 동적 으로 계산 해 야 합 니 다.
    전송 구조 방법의 데 이 터 를 동적 으로 계산 하면 데이터 가 불 러 오기 시작 하 는 위치,불 러 오기 끝 나 는 위 치 를 얻 을 수 있 습 니 다.
    HorizontalGv Adapter 의 구조 방법:
    
      /**
       *       
       */
      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 를 작은 원점 의 용기 로 사용 할 수 있 습 니 다.
    
    <?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="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로 저장 합 니 다.
    
      //     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);
          }
        }
      }
    
    3.총화
    이상 은 GridView 를 가로로 스크롤 하 는 방식 입 니 다.사실 저 희 는 귀 찮 게 하지 않 아 도 됩 니 다.Google 은 슈퍼 port-v7 패키지 에서 RecyclerView 컨트롤 을 제공 합 니 다.가로 와 세로 스크롤 을 전환 하려 면 레이아웃 관리자 가 setOrientation 방법 으로 설정 하면 됩 니 다.매우 편리 합 니 다.프로젝트 가 허용 된다 면 RecyclerView 를 사용 하여 이러한 수 요 를 실현 하 는 것 을 권장 합 니 다.
    여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

    좋은 웹페이지 즐겨찾기