1. 程式人生 > >android HorizontalScrollView+ViewPager佈局(viewpage不能滑動)

android HorizontalScrollView+ViewPager佈局(viewpage不能滑動)

關於HorizontalScrollView的各種用法,各種使用,參考官方API,裡面很詳細。這裡是說一下我的解決方法

先把效果擺出來,在說話


首先在佈局方面,上面是一個HorizontalScrollView,下面是一個viewpage

 <HorizontalScrollView
        android:id="@+id/hsv_dissertaAssem_top"
        android:layout_width="match_parent"
        android:layout_height="?android:actionBarSize"
        android:scrollbars="none"
        android:layout_below="@+id/rl_dissert_assem_title">

        <LinearLayout
            android:id="@+id/ll_disserta_asserm_top"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center_vertical"
            android:orientation="horizontal"></LinearLayout>

    </HorizontalScrollView>

    <com.yibugou.ybg_app.util.CustomViewPager
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/hsv_dissertaAssem_top" />

邏輯程式碼
public class DissertationAssembleActivity extends BaseFragmentActivity {

    private List<String> list = new ArrayList<>();
    private TextView childTextView[];
@InjectView(R.id.iv_dissert_assem_back)
    ImageView ivDissertAssemBack;
@InjectView(R.id.rl_dissert_assem_title)
    RelativeLayout rlDissertAssemTitle
; @InjectView(R.id.container) CustomViewPager viewPager;// 下部viewpage @InjectView(R.id.ll_disserta_asserm_top) LinearLayout llDissertaAssermTop; @InjectView(R.id.hsv_dissertaAssem_top) HorizontalScrollView hsvDissertaAssemTop; private HashMap<String, String> param = new HashMap<>();
// 引數 private LayoutInflater inflater; private View views[]; private TextView textViews[]; private int clickIndex = 0; private int textview_width; private DissertationAssembleAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dissertation_assemble); ButterKnife.inject(this); inflater = LayoutInflater.from(this); viewPager.setScanScroll(false); initData(); addTextView(); } private void initData() { // 初始化資料 param.put("v", YbgUtils.getVersionName(this)); // 測試填充資料 for (int i = 0; i < 10; i++) { String str = "" + i + ""; list.add(str); } // viewPager.setOffscreenPageLimit(1);//一次只加載一個 mAdapter = new DissertationAssembleAdapter(getSupportFragmentManager()); viewPager.setOnPageChangeListener(dissertAssemOnpageChangeListener); } private ViewPager.OnPageChangeListener dissertAssemOnpageChangeListener = new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { changeTextColor(position); } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) { } }; private void addTextView() { int count = list.size(); int childIndex = 0; views = new View[count]; textViews = new TextView[count]; textview_width = getWindowManager().getDefaultDisplay().getWidth() / 5; for (int i = 0; i < count; i++) { View view = inflater.inflate(R.layout.fabric_select_itop_choose, null); view.setTag(childIndex); view.setOnClickListener(dissertAssemtopOnclick); TextView textView = (TextView) view.findViewById(R.id.tv_fabric_select_top); textView.setText(list.get(i));// 填充資料 LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(textview_width, ViewPager.LayoutParams.MATCH_PARENT); view.setLayoutParams(param); llDissertaAssermTop.addView(view); // hsvDissertaAssemTop.addView(view,i); textViews[childIndex] = textView; childIndex++; } changeTextColor(0); initAdapter(); } private void initAdapter(){ viewPager.setAdapter(mAdapter); } /** * 設定字型顏色 * * @param id */ private void changeTextColor(int id) { for (int i = 0; i < textViews.length; i++) { if (i != id) { textViews[i].setTextColor(0xff000000); } else { textViews[id].setTextColor(getResources().getColor(R.color.top_index_bg)); } } } private View.OnClickListener dissertAssemtopOnclick = new View.OnClickListener() { @Override public void onClick(View view) { clickIndex = (int) view.getTag(); changeTextColor(clickIndex); // 在改變下面的fragment viewPager.setCurrentItem(clickIndex); } }; @OnClick(R.id.iv_dissert_assem_back) public void dissertAssemBackOnclick(View view) { finish(); } class DissertationAssembleAdapter extends FragmentPagerAdapter{ public DissertationAssembleAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return DissertAssemFragment.newInstance(position + 1,null); } @Override public int getCount() { return list.size(); } } }
viewpage
public class DissertAssemFragment extends BaseFragment implements AdapterView.OnItemClickListener {

    public static final String ARG_SECTION_NUMBER = "section_number";
    public static final String DISSERTATION_ASSEMBLE_ITEM_LIST = "dissertation_assemble_item_list";
    private ArrayList<String> list = new ArrayList<>();
    private ListView mListView;
    private DissertationAssembleItemAdapter mAdapter;
    public DissertAssemFragment() {
    }

    public static DissertAssemFragment newInstance(int sectionNumber, ArrayList<Object> lists) {
        DissertAssemFragment fragment = new DissertAssemFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
args.putSerializable(DISSERTATION_ASSEMBLE_ITEM_LIST, lists);
fragment.setArguments(args);
        return fragment;
}

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_disserta_assem, container, false);
mListView = (ListView) rootView.findViewById(R.id.lv_dissert_assem);
TextView textView = (TextView) rootView.findViewById(R.id.section_label);
textView.setText(getString(R.string.search_hint, getArguments().getInt(ARG_SECTION_NUMBER))+getArguments().getInt(ARG_SECTION_NUMBER));
list = (ArrayList<String>) getArguments().getSerializable(DISSERTATION_ASSEMBLE_ITEM_LIST);
initData(rootView);
        return rootView;
}

    private void initData(View view) {
        mAdapter = new DissertationAssembleItemAdapter();
mListView.setAdapter(mAdapter);
mListView.setOnItemClickListener(this);
}

    @Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

        //點選之後跳轉到相應的頁面
}

    class DissertationAssembleItemAdapter extends BaseAdapter {

        LayoutInflater myInflate = LayoutInflater.from(mContext);
@Override
public int getCount() {
            if (list != null && list.size() > 0)
                return list.size();
            else
                return 0;
}

        @Override
public Object getItem(int i) {
            if(list.size() > 0 && list != null){
                return list.get(i);
}
            return null;
}

        @Override
public long getItemId(int i) {
            return i;
}

        @Override
public View getView(int i, View view, ViewGroup viewGroup) {
            ImageView imageView ;
            if(view == null){
                view =  myInflate.inflate(R.layout.dissert_assermble_item,null);
imageView = (ImageView) view.findViewById(R.id.iv_dissert_assem);
view.setTag(imageView);
}else {
                imageView = (ImageView) view.getTag();
}
            //設定圖片
Animation animation = AnimationUtils.loadAnimation(mContext,R.anim.anim_scale);
view.setAnimation(animation);
            return view;
}
    }

}
CustomViewPager自定義的實現
public class CustomViewPager extends ViewPager {

    private boolean isCanScroll = false;
    public CustomViewPager(Context context) {
        super(context);
}

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
}

    public void setScanScroll(boolean isCanScroll) {
        this.isCanScroll = isCanScroll;
}

    @Override
public void scrollTo(int x, int y) {
        super.scrollTo(x, y);
}

    @Override
public boolean onTouchEvent(MotionEvent arg0) {
        if (isCanScroll)
            return super.onTouchEvent(arg0);
        else
            return false;
}

    @Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
        if (isCanScroll)
            return super.onInterceptTouchEvent(arg0);
        else
            return false;
}

    @Override
public void setCurrentItem(int item, boolean smoothScroll) {
        super.setCurrentItem(item, smoothScroll);
}

    @Override
public void setCurrentItem(int item) {
        super.setCurrentItem(item);
}
}

參考API