常用组件:ViewPager和fragment组合

引言

viewpager和fragment是项目中亮相最多的组合,很多场景,例如 项目起始页,新闻首页,商城分类页,订单列表页等等,应用场景广泛,希望大家好好学习

基本用法

xml文件

<LinearLayout  
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    >
    <TextView
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="tab1"
        android:gravity="center"
        android:layout_marginLeft="1dp
        android:background="#ccc000"
        />

    <TextView
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="tab2"
        android:gravity="center"
        android:layout_marginLeft="1dp"
        android:background="#ccc000"
        />

    <TextView
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="tab3"
        android:gravity="center"
        android:layout_arginLeft="1dp"
        android:background="#ccc000"
        />

</LinearLayout>

    <android.support.v4.view.ViewPager
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/pager">

    </android.support.v4.view.ViewPager>
</LinearLayout>

Fragment

public class MyFragment extends android.support.v4.app.Fragment{

    View view;
    ListView listView;

    private String data[]={"南京","北京","深圳","桂林","南宁","上海","北京","深圳","桂林","南宁","上海","北京","深圳","桂林","南宁"};


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        //解析Fragment布局文件
        view =inflater.inflate(R.layout.fragment, null);
        //获取listView控件
        listView=(ListView)view.findViewById(R.id.listView);
      return  view;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        //创建适配器
        ArrayAdapter<String> adapter=new ArrayAdapter<String>(getActivity(),R.layout.simple_adapter_item, R.id.text1,data);
        listView.setAdapter(adapter);
        //listview 监听
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Toast.makeText(getActivity(),data[i],Toast.LENGTH_SHORT).show();
            }
        })
    }

}

activity页面

public class PagerActivity extends Activity {

    ViewPager pager;
    private List<MyFragment> list;
    private String data[] = {"第一页", "第二页", "第三页"};
    private LinearLayout layout;
    private TextView textView[];
    private ViewPager view_pager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pager);
        //初始化Fragment数组
        pager = (ViewPager) this.findViewById(R.id.pager);
        list = new ArrayList<MyFragment>();
        list.add(new MyFragment());
        list.add(new MyFragment());
        list.add(new MyFragment());
        //创建自定的适配器对象
        MyAdapter adapter=new MyAdapter(getSupportFragmentManager(), list);
        pager.setAdapter(adapter);

        LinearLayout layout = (LinearLayout) this.findViewById(R.id.layout);
        //获取LinearLayout容器
        final int num = layout.getChildCount();
        //获取容器的子控件个数

        textView = new TextView[num];
        //实例化标题数组
        for (int i = 0; i < num; i++) {
            textView[i] = (TextView) layout.getChildAt(i);//循环获取子控件
            textView[i].setText(data[i]);//设置标题
            textView[i].setTag(i);//设置标识
            textView[i].setBackgroundColor(Color.GRAY);//初始化每个控件都设置背景为灰色

            /**
             *
             * 循环对容器中的每个子控件监听
             */
            textView[i].setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {
                    int item = (Integer) view.getTag();//获取控件标识
                    pager.setCurrentItem(item);//切换pagerView
                    for (int i1 = 0; i1 < num; i1++) {
                        textView[i1].setBackgroundColor(Color.GRAY);//所有标签都改为灰色
                    }
                    textView[item].setBackgroundColor(Color.YELLOW);//选中的标签为黄色
                }
            });
            textView[i].setEnabled(true);//设置标签是否可点击
        }
        textView[0].setBackgroundColor(Color.YELLOW);//初始化默认第一个为选中状态

        pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }

            @Override
            /**
             * pagerView被切换后自动执行的方法
             */

            public void onPageSelected(int position) {
            }

            @Override
            public void onPageScrollStateChanged(int state) {
            }

        });

    }

    public void select() {
    }
}

fragment适配器 

   /**
     * 定义FragmentPager适配器类 fragmentPager适配器
     */
    class MyAdapter extends FragmentPagerAdapter {

    private List<MyFragment> fragments;//fragment管理员
    private FragmentManager fm;//fragment数组
        /**
         * 构造函数
         * @param fm fragment管理员对象
         * @param fragmentList fragment数组
         */
    public MyAdapter(FragmentManager fm, List<MyFragment> fragmentList) {
        super(fm);
        this.fragments=fragmentList;
        this.fm=fm;
    }

    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }

    @Override
    public int getCount() {
        return fragments.size();
    }

}

小tips

由于fragment作为页面通常会承担非常多的逻辑任务(比如 今日头条的首页),所以需要对fragment实行懒加载策略,避免 加载过多导致页面反应慢,甚至卡顿

常用的方法有:

1,ViewPager因为内部机制,有预加载机制。所以设置为0可以防止加载多个fragment引起的性能问题。

    vp.setOffscreenPageLimit(0);
 

,2,利用fragment的内部懒加载机制

(1)、创建新的Fragment类,继承BaseFragment;

(2)、setContentView(),返回该xml布局文件;

(3)、lazyLoad(),在此方法内加载需要的数据;

(4)、stopLoad()方法可选,当视图已经对用户不可见并且加载过数据,如果需要在切换到其他页面时停止加载数据,可以覆写此方法。

结语

关于本组合控件,需要自己多揣摩和练习,才能熟练使用,其实仔细观察就会发现,基本所有的app都会用到这个组合组件

发布了58 篇原创文章 · 获赞 10 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_34203714/article/details/101124242
今日推荐