Fragment使用总结

前久用fragment练习过一个小demo,写完就完事儿了,然后今天看到fragment突然就没有思绪了,所以说明总结与常看是很重要的,今天重新看了遍fragment,来这里做个总结。

Fragment实现底部导航栏

先上效果图:


首先先写布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="example.com.fragmentpractice.MainActivity">

    <LinearLayout
        android:id="@+id/ll_tab"
        android:layout_width="match_parent"
        android:layout_height="65dp"
        android:orientation="horizontal"
        android:layout_margin="5dp"
        android:layout_alignParentBottom="true">

        <TextView
            android:id="@+id/tv_book_act"
            style="@style/tab_style"
            android:drawableTop="@drawable/book"
            android:text="阅读"/>

        <TextView
            android:id="@+id/tv_program_act"
            style="@style/tab_style"
            android:text="程序"
            android:drawableTop="@drawable/program"/>
        <TextView
            android:id="@+id/tv_me_act"
            style="@style/tab_style"
            android:text="我"
            android:drawableTop="@drawable/me"/>

    </LinearLayout>

    <FrameLayout
        android:id="@+id/fl_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/ll_tab"></FrameLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/line"
        android:layout_below="@+id/fl_content"/>

</RelativeLayout>

FrameLayout就是显示fragment的一个容器。因为TextView有很多属性相同,所以写在一个style里,style如下:

 <style name="tab_style">
        <item name="android:textColor">@drawable/text_color</item>
        <item name="android:gravity">center</item>
        <item name="android:textSize">13sp</item>
        <item name="android:layout_height">match_parent</item>
        <item name="android:layout_weight">1</item>
        <item name="android:layout_width">0dp</item>
    </style>

接着写fragment的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv_book"
        style="@style/textView"
        android:text="book"/>

</LinearLayout>
这里就是简单的显示一个文字,可以根据自己需要的内容去写,另外两个都是一样的,照葫芦画瓢。

Fragment

package example.com.fragmentpractice.fragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import example.com.fragmentpractice.R;

/**
 * Created by csjy on 2017/5/2.
 */

public class BookFragment extends Fragment {


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//        return super.onCreateView(inflater, container, savedInstanceState);
        View view = inflater.inflate(R.layout.fragment_book,container,false);
        return view;
    }
}
这里就是简单的将fragment的布局引入
其他两个Fragment也与这个一样。

Fragment只能嵌入在Activity中使用,它有自己的生命周期,但是它的生命周期受Activity的影响。

Activity:

package example.com.fragmentpractice;

import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;

import example.com.fragmentpractice.fragment.BookFragment;
import example.com.fragmentpractice.fragment.MeFragment;
import example.com.fragmentpractice.fragment.ProgramFragment;


public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView tvMe,tvBook,tvProgram;
    private MeFragment meFragment;
    private BookFragment bookFragment;
    private ProgramFragment programFragment;
    private FrameLayout content;

    private FragmentManager manager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initListener();
        manager = getSupportFragmentManager();
        tvBook.performClick();
    }

    private void initListener() {
        tvMe.setOnClickListener(this);
        tvProgram.setOnClickListener(this);
        tvBook.setOnClickListener(this);
    }

    private void initView() {
        tvMe = (TextView) this.findViewById(R.id.tv_me_act);
        tvBook = (TextView) this.findViewById(R.id.tv_book_act);
        tvProgram = (TextView) this.findViewById(R.id.tv_program_act);
        content = (FrameLayout) this.findViewById(R.id.fl_content);
    }

    private void setSelect(){
        tvMe.setSelected(false);
        tvBook.setSelected(false);
        tvProgram.setSelected(false);
    }

    private void hideFragment(android.support.v4.app.FragmentTransaction transaction) {
        if(meFragment != null) {
            transaction.hide(meFragment);
        }
        if (bookFragment != null){
            transaction.hide(bookFragment);
        }
        if (programFragment != null){
            transaction.hide(programFragment);
        }
    }

    @Override
    public void onClick(View v) {
        android.support.v4.app.FragmentTransaction transaction = manager.beginTransaction();
        hideFragment(transaction);
        switch (v.getId()) {
            case R.id.tv_me_act:
                setSelect();
                tvMe.setSelected(true);
                if (meFragment == null){
                    meFragment = new MeFragment();
                    transaction.add(R.id.fl_content,meFragment);
                }else{
                    transaction.show(meFragment);
                }
                break;
            case R.id.tv_book_act:
                setSelect();
                tvBook.setSelected(true);
                if (bookFragment == null){
                    bookFragment = new BookFragment();
                    transaction.add(R.id.fl_content,bookFragment);
                }else{
                    transaction.show(bookFragment);
                }
                break;
            case R.id.tv_program_act:
                setSelect();
                tvProgram.setSelected(true);
                if (programFragment == null){
                    programFragment = new ProgramFragment();
                    transaction.add(R.id.fl_content,programFragment);
                }else{
                    transaction.show(programFragment);
                }
                break;
        }
        transaction.commit();

    }
}
首先说明一点,这里用的Fragment是v4包下的,所以FragmentManager,FragmentTransation都必须相应的导入v4包下的。

有一点值得注意,v4包下实例化FragmentManager时要用getSupportFragmentManager();而app包下实例化FragmentManager是用getFragmentmanager()

接下来对代码进行简单的解析:

首先先想我要实现什么?

  1. 点击导航栏的任意项会显示相应的Fragment
  2. 点击导航栏的任意项会显示选中状态(相应的变色)
  3. 第一次使用要使第一项是选中状态
  4. fragment不会相互覆盖
明白了要做什么开始实现。
要使第一个TextView在第一次进入时是选中状态,用performClick()方法就可以实现。
首先实例化控件,对几个TextView写点击事件,在点击事件前首先先隐藏所有fragment,不然各个fragment会覆盖。

当点击任意项,首先先将所有的TextView选择状态全设置为false(不这样设置的话就会一直是选中状态),接下来将当项设置为选择状态,对该项对应的fragment进行判空,如果为空就实例化fragment,当将将它添加到显示fragment的容器中(FrameLayout),如果不为空,就将已经加载好的fragment显示出来。

最后注意一定要提交,也就是transaction.commit(),不写这句的话fragment显示不出来。

Fragment+ViewPager实现底部导航栏

先上效果图:


跟上面一样,首先想明白要实现些什么

  1. 选中相应项改变状态
  2. 滑动完毕显示相应的fragment
  3. 点击显示相应的fragment
  4. 第一项第一次进入是选中状态
布局与上一节的布局类似,只是将显示fragment的容器改为ViewPager
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="example.com.fragmentpractice.MainActivity">

    <LinearLayout
        android:id="@+id/ll_tab"
        android:layout_width="match_parent"
        android:layout_height="65dp"
        android:orientation="horizontal"
        android:layout_margin="5dp"
        android:layout_alignParentBottom="true">

        <TextView
            android:id="@+id/tv_book_act"
            style="@style/tab_style"
            android:drawableTop="@drawable/book"
            android:text="阅读"/>

        <TextView
            android:id="@+id/tv_program_act"
            style="@style/tab_style"
            android:text="程序"
            android:drawableTop="@drawable/program"/>
        <TextView
            android:id="@+id/tv_me_act"
            style="@style/tab_style"
            android:text="我"
            android:drawableTop="@drawable/me"/>

    </LinearLayout>

    <!--<FrameLayout-->
        <!--android:id="@+id/fl_content"-->
        <!--android:layout_width="match_parent"-->
        <!--android:layout_height="match_parent"-->
        <!--android:layout_above="@+id/ll_tab"></FrameLayout>-->
    <android.support.v4.view.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/ll_tab"></android.support.v4.view.ViewPager>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/line"
        android:layout_below="@+id/view_pager"/>

</RelativeLayout>

fragment的布局不变,fragment不变。
ViewPager使用需要配合适配器
适配器代码如下:
package example.com.fragmentpractice;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.view.ViewGroup;

import example.com.fragmentpractice.fragment.BookFragment;
import example.com.fragmentpractice.fragment.MeFragment;
import example.com.fragmentpractice.fragment.ProgramFragment;

/**
 * Created by csjy on 2017/5/2.
 */

public class MyViewPagerAdapter extends FragmentPagerAdapter {

    private MeFragment meFragment;
    private BookFragment bookFragment;
    private ProgramFragment programFragment;

    private static final int PAGER_COUNT = 3;

    @Override
    public Fragment getItem(int position) {
        Fragment fragment = null;
        switch (position){
            case MainActivity.PAGER_ONE:
                fragment = bookFragment;
                break;
            case MainActivity.PAGRT_TWO:
                fragment = programFragment;
                break;
            case MainActivity.PAGER_THREE:
                fragment = meFragment;
                break;
        }
        return fragment;
    }

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

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        return super.instantiateItem(container, position);
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        super.destroyItem(container, position, object);
    }

    public MyViewPagerAdapter(FragmentManager fm) {
        super(fm);
        meFragment = new MeFragment();
        bookFragment = new BookFragment();
        programFragment = new ProgramFragment();
    }
}
getCount统计pager的个数。
重点在getItem()方法
首先在Activity中定义三个静态变量,分别表示ViewPager的页数。
在getItem()方法中进行选择,是第一页就把第一页的fragment赋值给fragment,并将fragment返回。
Activity如下:
package example.com.fragmentpractice;

import android.support.v4.app.FragmentManager;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;


public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView tvMe,tvBook,tvProgram;
//    private MeFragment meFragment;
//    private BookFragment bookFragment;
//    private ProgramFragment programFragment;
//    private FrameLayout content;
    private ViewPager viewPager;

    public static final int PAGER_ONE = 0;
    public static final int PAGRT_TWO = 1;
    public static final int PAGER_THREE = 2;

//    private FragmentManager manager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initListener();
//        manager = getSupportFragmentManager();
//        tvBook.performClick();
        if(viewPager.getCurrentItem() == 0){
            tvBook.setSelected(true);
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.tv_book_act:
                setSelect();
                tvBook.setSelected(true);
                viewPager.setCurrentItem(PAGER_ONE);
                break;
            case R.id.tv_program_act:
                setSelect();
                tvProgram.setSelected(true);
                viewPager.setCurrentItem(PAGRT_TWO);
                break;
            case R.id.tv_me_act:
                setSelect();
                tvMe.setSelected(true);
                viewPager.setCurrentItem(PAGER_THREE);
                break;
        }

    }

    private void initListener() {
        tvMe.setOnClickListener(this);
        tvProgram.setOnClickListener(this);
        tvBook.setOnClickListener(this);
    }

    private void initView() {
        tvMe = (TextView) this.findViewById(R.id.tv_me_act);
        tvBook = (TextView) this.findViewById(R.id.tv_book_act);
        tvProgram = (TextView) this.findViewById(R.id.tv_program_act);
        viewPager = (ViewPager) this.findViewById(R.id.view_pager);
        viewPager.setCurrentItem(0);
        MyViewPagerAdapter adapter = new MyViewPagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(adapter);
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {
                //state = 0 : 表示闲置
                //state = 1 :表示正在拖动
                //state = 2 :表示已经拖动完
                if (state == 2){
                    switch (viewPager.getCurrentItem()) {
                        case PAGER_ONE:
                            setSelect();
                            tvBook.setSelected(true);
                            break;
                        case PAGRT_TWO:
                            setSelect();
                            tvProgram.setSelected(true);
                            break;
                        case PAGER_THREE:
                            setSelect();
                            tvMe.setSelected(true);
                            break;
                    }
                }
            }
        });
    }

    private void setSelect(){
        tvMe.setSelected(false);
        tvBook.setSelected(false);
        tvProgram.setSelected(false);
    }

//    private void hideFragment(android.support.v4.app.FragmentTransaction transaction) {
//        if(meFragment != null) {
//            transaction.hide(meFragment);
//        }
//        if (bookFragment != null){
//            transaction.hide(bookFragment);
//        }
//        if (programFragment != null){
//            transaction.hide(programFragment);
//        }
//    }
//
//    @Override
//    public void onClick(View v) {
//        android.support.v4.app.FragmentTransaction transaction = manager.beginTransaction();
//        hideFragment(transaction);
//        switch (v.getId()) {
//            case R.id.tv_me_act:
//                setSelect();
//                tvMe.setSelected(true);
//                if (meFragment == null){
//                    meFragment = new MeFragment();
//                    transaction.add(R.id.fl_content,meFragment);
//                }else{
//                    transaction.show(meFragment);
//                }
//                break;
//            case R.id.tv_book_act:
//                setSelect();
//                tvBook.setSelected(true);
//                if (bookFragment == null){
//                    bookFragment = new BookFragment();
//                    transaction.add(R.id.fl_content,bookFragment);
//                }else{
//                    transaction.show(bookFragment);
//                }
//                break;
//            case R.id.tv_program_act:
//                setSelect();
//                tvProgram.setSelected(true);
//                if (programFragment == null){
//                    programFragment = new ProgramFragment();
//                    transaction.add(R.id.fl_content,programFragment);
//                }else{
//                    transaction.show(programFragment);
//                }
//                break;
//        }
//        transaction.commit();
//
//    }
}

与上一节有点类似,不同就在于ViewPager,调用ViewPager的setOnPageChangeListener()方法,重写三个方法,当滚动状态改变时,改变导航栏的状态。
点击事件改变导航栏的状态并改变ViewPager的currentItem。

(Fragment + ViewPager) + RecyclerView

先看效果图:


先说思路:

  1. 首先创建三个Fragment,继承自Fragment
  2. 将Fragment添加到ViewPager中
遇到的坑:
使用ViewPager要利用适配器来绑定数据,ViewPager的适配器可以继承FragmentPagerAdapter或者PagerAdapter,我一开始继承是PagerAdapter,
package example.com.fragmentpractice;

import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;

import java.util.List;

/**
 * Created by csjy on 2017/5/5.
 */

public class TopViewPagerAdapter extends PagerAdapter {

    private List<View> mList;

    public TopViewPagerAdapter (List<View> mList) {
        this.mList = mList;
    }
    @Override
    public int getCount() {
        return mList.size();
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        container.addView(mList.get(position));
        return mList.get(position);
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }
}

然后把Fragment作为View添加到ViewPager中,
package example.com.fragmentpractice.fragment;

import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

import example.com.fragmentpractice.ListviewAdapter;
import example.com.fragmentpractice.MyApplication;
import example.com.fragmentpractice.R;
import example.com.fragmentpractice.TopViewPagerAdapter;

/**
 * Created by csjy on 2017/5/5.
 */

public class MeFragment extends Fragment implements View.OnClickListener{

    private ArrayList<View> mList;
    private List<String> stringList;

//    private ListView listView;
    private RecyclerView recyclerView;

    private Context context;

    private TextView tvText1,tvText2,tvText3,tvText4,tvText5;
    private ViewPager viewPager;

    private ListviewAdapter listviewAdapter;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//        return super.onCreateView(inflater, container, savedInstanceState);
        View view = inflater.inflate(R.layout.fragment_me,container,false);
        mList = new ArrayList<View>();
        mList.add(inflater.inflate(R.layout.view_text1,null));
        mList.add(inflater.inflate(R.layout.view_text2,null));
        mList.add(inflater.inflate(R.layout.view_text3,null));
        mList.add(inflater.inflate(R.layout.view_text4,null));
        mList.add(inflater.inflate(R.layout.view_text5,null));
        initDatas();
        initView(view);
        initListener();
        if(viewPager.getCurrentItem() == 0){
            tvText1.setSelected(true);
        }
        return view;
    }

    private void initDatas(){
        stringList = new ArrayList<String>();
        for(int i = 0; i < 20; i++){
            stringList.add("Text " + i);
        }
    }


    private void initListener() {
        tvText1.setOnClickListener(this);
        tvText2.setOnClickListener(this);
        tvText3.setOnClickListener(this);
        tvText4.setOnClickListener(this);
        tvText5.setOnClickListener(this);
    }

    private void initView(View view) {

        context = MyApplication.getContext();
        tvText1 = (TextView)view.findViewById(R.id.tv_top_1);
        tvText2 = (TextView) view.findViewById(R.id.tv_top_2);
        tvText3 = (TextView) view.findViewById(R.id.tv_top_3);
        tvText4 = (TextView) view.findViewById(R.id.tv_top_4);
        tvText5 = (TextView) view.findViewById(R.id.tv_top_5);

        viewPager = (ViewPager) view.findViewById(R.id.view_pager);
        TopViewPagerAdapter adapter = new TopViewPagerAdapter(mList);
        viewPager.setAdapter(adapter);
        viewPager.setCurrentItem(0);

        context = MyApplication.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);
        View view1 = inflater.inflate(R.layout.view_text1,null);
        recyclerView = (RecyclerView)view1.findViewById(R.id.lv_view_text1);
        recyclerView.setLayoutManager(new LinearLayoutManager(context));
        listviewAdapter = new ListviewAdapter(context,stringList);
        recyclerView.setAdapter(listviewAdapter);


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

            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {
                Fragment fragment = null;
                if (state == 2){
                    switch (viewPager.getCurrentItem()){
                        case 0:
                            setSelect();
                            tvText1.setSelected(true);
                            break;
                        case 1:
                            setSelect();
                            tvText2.setSelected(true);
                            break;
                        case 2:
                            setSelect();
                            tvText3.setSelected(true);
                            break;
                        case 3:
                            setSelect();
                            tvText4.setSelected(true);
                            break;
                        case 4:
                            setSelect();
                            tvText5.setSelected(true);
                            break;
                    }
                }
            }
        });
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.tv_top_1:
                setSelect();
                tvText1.setSelected(true);
                viewPager.setCurrentItem(0);
                break;
            case R.id.tv_top_2:
                setSelect();
                tvText2.setSelected(true);
                viewPager.setCurrentItem(1);
                break;
            case R.id.tv_top_3:
                setSelect();
                tvText3.setSelected(true);
                viewPager.setCurrentItem(2);
                break;
            case R.id.tv_top_4:
                setSelect();
                tvText4.setSelected(true);
                viewPager.setCurrentItem(3);
                break;
            case R.id.tv_top_5:
                setSelect();
                tvText5.setSelected(true);
                viewPager.setCurrentItem(4);
                break;
        }
    }

    private  void setSelect(){
        tvText1.setSelected(false);
        tvText2.setSelected(false);
        tvText3.setSelected(false);
        tvText4.setSelected(false);
        tvText5.setSelected(false);
    }
}
虽然看着合情合理。。然而产生了坑

运行起来告诉我这个错误,一开始很懵逼,好好想想,Fragment只是布局被添加进来,并没有被实例化,所以我在点击事件和滑动事件中都实例化了Fragment,然而还是提示没有适配器,好气啊!!所以我决定换个适配器!!成功啦~

首先fragment的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/Background">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>

</LinearLayout>

package example.com.fragmenttest2.fragment;

import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.ArrayList;
import java.util.List;

import example.com.fragmenttest2.R;
import example.com.fragmenttest2.adapter.RecyclerAdapter;
import example.com.fragmenttest2.util.MyApplication;

/**
 * Created by csjy on 2017/5/5.
 */

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

    private RecyclerView recyclerView;

    private Context context;
    private RecyclerAdapter adapter;

    private List<String> mList;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_me,container,false);
        initData();
        initView(view);
        return view;
    }

    private void initData() {
        mList = new ArrayList<String>();
        for (int i = 0; i < 50; i++){
            mList.add("Test " + i);
        }
    }

    private void initView(View view) {
        context = MyApplication.getContext();
        recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(context));
        adapter = new RecyclerAdapter(context,mList);
        recyclerView.setAdapter(adapter);
    }
}
activity的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="example.com.fragmenttest2.MainActivity">

    <LinearLayout
        android:id="@+id/ll_tab"
        android:layout_width="match_parent"
        android:layout_height="65dp"
        android:orientation="horizontal"
        android:layout_margin="2dp"
        android:layout_alignParentBottom="true">

        <TextView
            android:id="@+id/tv_act_book"
            style="@style/tabTheme"
            android:drawableTop="@drawable/book_selector"
            android:text="Book"/>
        <TextView
            android:id="@+id/tv_act_program"
            style="@style/tabTheme"
            android:drawableTop="@drawable/program_selector"
            android:text="Program"/>
        <TextView
            android:id="@+id/tv_act_me"
            style="@style/tabTheme"
            android:drawableTop="@drawable/me_selector"
            android:text="Me"/>
    </LinearLayout>

    <View
        android:id="@+id/line_view"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/line"
        android:layout_above="@+id/ll_tab"/>
    <android.support.v4.view.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/line_view"></android.support.v4.view.ViewPager>
</RelativeLayout>

Activity:
package example.com.fragmenttest2;

import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

import example.com.fragmenttest2.adapter.ViewPagerAdapter;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private TextView tvBook,tvProgram,tvMe;
    private ViewPager viewPager;

    private List<View> mList;
    private LayoutInflater inflater;

    public static final int PAGER_ONE = 0;
    public static final int PAGER_TWO = 1;
    public static final int PAGER_THREE = 2;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initViewPager();
        initListener();

        if (viewPager.getCurrentItem() == 0){
            tvBook.setSelected(true);
        }
    }

    private void initListener() {
        tvBook.setOnClickListener(this);
        tvProgram.setOnClickListener(this);
        tvMe.setOnClickListener(this);
    }

    private void initViewPager() {
        mList = new ArrayList<View>();
        inflater = LayoutInflater.from(this);
        mList.add(inflater.inflate(R.layout.fragment_book,null));
        mList.add(inflater.inflate(R.layout.fragment_program,null));
        mList.add(inflater.inflate(R.layout.fragment_me,null));
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(adapter);

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

            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {

                if (state == 2){
                    switch (viewPager.getCurrentItem()){
                        case 0:
                            setSelect();
                            tvBook.setSelected(true);
                            break;
                        case 1:
                            setSelect();
                            tvProgram.setSelected(true);
                            break;
                        case 2:
                            setSelect();
                            tvMe.setSelected(true);
                            break;
                    }
                }
            }
        });
    }

    private void initView() {
        tvBook = (TextView) this.findViewById(R.id.tv_act_book);
        tvProgram = (TextView) this.findViewById(R.id.tv_act_program);
        tvMe = (TextView) this.findViewById(R.id.tv_act_me);
        viewPager = (ViewPager) this.findViewById(R.id.view_pager);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.tv_act_book:
                setSelect();
                tvBook.setSelected(true);
                viewPager.setCurrentItem(0);
                break;
            case R.id.tv_act_program:
                setSelect();
                tvProgram.setSelected(true);
                viewPager.setCurrentItem(1);
                break;
            case R.id.tv_act_me:
                setSelect();
                tvMe.setSelected(true);
                viewPager.setCurrentItem(2);
                break;
        }
    }

    private void setSelect(){
        tvMe.setSelected(false);
        tvProgram.setSelected(false);
        tvBook.setSelected(false);
    }
}
ViewPager的adapter
package example.com.fragmenttest2.adapter;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

import example.com.fragmenttest2.MainActivity;
import example.com.fragmenttest2.fragment.BookFragment;
import example.com.fragmenttest2.fragment.MeFragment;
import example.com.fragmenttest2.fragment.ProgramFragment;

/**
 * Created by csjy on 2017/5/5.
 */

public class ViewPagerAdapter extends FragmentPagerAdapter {

    private MeFragment meFragment;
    private BookFragment bookFragment;
    private ProgramFragment programFragment;

    private static final int PAGER_COUNT = 3;

    @Override
    public Fragment getItem(int position) {
        Fragment fragment = null;
        switch (position) {
            case MainActivity.PAGER_ONE:
                fragment = bookFragment;
                break;
            case MainActivity.PAGER_TWO:
                fragment = programFragment;
                break;
            case MainActivity.PAGER_THREE:
                fragment = meFragment;
                break;

        }
        return fragment;
    }

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

    public ViewPagerAdapter(FragmentManager fm) {
        super(fm);
        meFragment = new MeFragment();
        bookFragment = new BookFragment();
        programFragment = new ProgramFragment();
    }

}
在构造方法中实例化三个Fragment,在getItem方法中定义一个Fragment,将相应的Fragment赋值给它并返回。再运行程序,就是效果图。

Fragment + (ViewPager + ragment + RecyclerView)

效果图:

底部Fragment,内容ViewPager + Fragment+RecyclerView,可能有些奇怪,内容想实现类似的效果直接用ViewPager + RecyclerView就可以,为什么还要加个Fragment,因为我测试只用两个还是会提示RecyclerView找不到适配器,我认为可能RecyclerView所在的类没有被实例化,所以采取了
Fragment + (ViewPager + ragment + RecyclerView)
代码与前面的无二。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值