天天看點

viewpager 和水準scrollView 進行綁定。

Viewpager + gridview +fragment 控件的聚合

viewpager 和水準scrollView 進行綁定。

1.需求頂部對應的是一個水準滾動scrollview中間一一些類别。

2.下面是一個viewpager

3.需要将viewpager和上面的水準scrollview進行關聯,當上面的水準scrollview中類别點選的時候,下面的viewpager進行相應的滾動。

4.當viewpager進行切換的時候,上面的水準scrollview進行自動的滾動,和下面的viewpager角标互相對應。當scrollview滾動到做右邊的時候。再次進行操作viewpager上面的scrollview 會滑動一個類别的距離。顯示出來目前類别。

5.viewpager中嵌套的是fragment。使用fragementadapger 左右擴充卡進行綁定。(普通的viewpager使用pageradapter進行适配,官方是這樣解釋的)

  對上面的水準scrollview進行寬度計算。顯示出所有的類别:

      * 初始 * 個化 類别 gradview

根據類别總數數 然後設定給 gridView 就可以,在布局檔案中需要設定 style ,和寬度相同

* @param view
      * @return
      */
     private GridView initGridView(View view) {
         int count = productcategory.size() + 1;
         GridView gridView = (GridView) view.findViewById(R.id.gridView);
         LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(count * DP2Tools.dip2px(getActivity(), 70), LinearLayout.LayoutParams.WRAP_CONTENT);
         gridView.setLayoutParams(params);
         gridView.setNumColumns(count);
         return gridView;
     }      

   這裡的難度主要是gridView的水準滾動這一塊。網上搜了一圈,沒有找到有價值的東西。

   布局部分:

    水準scrollView 中嵌套一個gridView .

      下面部分使用的viewPager 由于需求要求加載過後,需要儲存狀态。考慮ViewPager使用Fragment進行嵌套,這樣,可以将代碼進行分離。而且利于解耦!(ps:之前使用不同的View進行填充,leadre看了之後。說了一通。代碼全部耦合在一起。可讀性太差了,不利于維護。)

public class SquareZoneFragmentPagerAdapter extendsFragmentPagerAdapter{


     private ArrayList<SquareTrendPoll.SimplePolls> simplePollses;
     private Context context;
     private int pagerViewCount;


     public SquareZoneFragmentPagerAdapter(FragmentActivity activity,
                                           ArrayList<SquareTrendPoll.SimplePolls> simplePollses,
                                           int count) {
         super(activity.getSupportFragmentManager());
         this.simplePollses = simplePollses;
         this.pagerViewCount = count + 1; //比分類多了一個全部分類
     }


     @Override
     public int getCount() {
         return pagerViewCount;
     }


     @Override
     public Fragment getItem(int position) { //在這裡傳回了 N 份 fragment 這裡傳遞給fragment 填充的資料
         SquareCatagoryFragment squareCatagoryFragment = new SquareCatagoryFragment();
         Bundle bundle = new Bundle();
         bundle.putSerializable("squareZone", simplePollses);
         squareCatagoryFragment.setArguments(bundle);


         return squareCatagoryFragment; //傳回 pagerviewcount+1份
     }      

   1.gridView item的點選事件,點選item 背景變化,字型變化。

      這個不難,設定gridView 的 item 點選監聽,點選時候,将目前position傳遞給gridView adapger 中的getView 裡面進行判斷。給目前設定 背景 字型,其他的一律設定 另外的樣式即可。

   2.說到這裡,可能較難實作的是。viewpager進行切換的時候。上面的水準gridView 通過。scrollBy()方法進行滾動,下面貼上具體的代碼。

    主要是在viewpager的 onPagerChanged() 方法中進行判斷 判斷 

viewpager 和水準scrollView 進行綁定。
@Override
             public void onPageSelected(int position) {
              
                 View view = gridView.getChildAt(position); //(水準scrollVeiw)得到具體的View 進行 測量距離左邊的距離
                 if (view == null)
                     return;
                 view.getLocationOnScreen(movingTabNavLocation); //使用getLocationOnScreen( ) 進行測量相對左邊的距離(隻考慮x軸)                 int differenceValue = screenPxWidth - movingTabNavLocation[0] - 210; //和螢幕寬度。-210 是一個veiw的寬度,從零開始的原因,需要多減去一個view距離 
                 if (differenceValue < 0) {  //超過一屏
                     scrollView.scrollBy(Math.abs(differenceValue), 0);
                 } else if (movingTabNavLocation[0] < 0) {  //查過一螢幕,反向滑動
                     scrollView.scrollBy(movingTabNavLocation[0], 0);
                 }
                 catagoryProductAdapter.setCurrentItem(position);
                 catagoryProductAdapter.notifyDataSetChanged();
                 initData(PRODUCT_CATEGORY_CODE);
             }


             @Override
             public void onPageScrollStateChanged(int state) {
             }      

滑動到左右邊。當再次滑動時候,這時候會觸發,scrollView 的滾動時間。滾動一個veiw的位置。顯示下一個類别。一次類推

如果反向滑動,則通過scrollby(- xx,xx) 反向滑動