Viewpager + gridview +fragment 控件的聚合
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() 方法中進行判斷 判斷
@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) 反向滑動