android material design之Tablayout,Recyclerview,Fragment,Viewpager搭配使用(四)

我的项目源码托管地址:点击打开我的项目源码地址


相信大家都用过fragment+viepager的组合,也都比较熟悉,现在说一下美拍,暴风,爱奇艺的高仿实现,这个实用性也很强,先上代码,代码中有注释的就不细说了,没注释的会在下面详细的讲一下,

先来上一下效果图:(由于一次录制太大分开录制的)


activity

package com.fanyafeng.materialdesign.activity;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.TableLayout;

import com.fanyafeng.materialdesign.BaseActivity;
import com.fanyafeng.materialdesign.R;
import com.fanyafeng.materialdesign.fragment.TabLayoutFragment;

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

public class TabLayoutActivity extends BaseActivity implements ViewPager.OnPageChangeListener {
    private TabLayout layoutTab;
    private ViewPager viewpagerTab;

    private String[] stringList = new String[]{"LinearLayout", "GridView", "ListView", "LinearLayout", "StaggeredGridLayout"};
    private List<Fragment> fragmentList;
    private MyViewPagerAdapter myViewPagerAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tab_layout);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        initView();
        initData();
    }

    private void initView() {
        layoutTab = (TabLayout) findViewById(R.id.layoutTab);
        viewpagerTab = (ViewPager) findViewById(R.id.viewpagerTab);
        fragmentList = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            TabLayoutFragment tabLayoutFragment = new TabLayoutFragment();
            Bundle bundle = new Bundle();
            bundle.putString("flag", String.valueOf(i));
            tabLayoutFragment.setArguments(bundle);
            fragmentList.add(tabLayoutFragment);
        }
    }

    private void initData() {
        myViewPagerAdapter = new MyViewPagerAdapter(getSupportFragmentManager(), stringList, fragmentList);
        viewpagerTab.setAdapter(myViewPagerAdapter);
        viewpagerTab.setOffscreenPageLimit(3);
        viewpagerTab.addOnPageChangeListener(this);
//        代码中优先级高于xml
//        layoutTab.setTabMode(TabLayout.MODE_SCROLLABLE);
        layoutTab.setupWithViewPager(viewpagerTab);
        layoutTab.setTabsFromPagerAdapter(myViewPagerAdapter);
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {
        toolbar.setTitle(stringList[position]);
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }

    class MyViewPagerAdapter extends FragmentStatePagerAdapter {

        private String[] titleList;
        private List<Fragment> fragmentList;

        public MyViewPagerAdapter(FragmentManager fm, String[] titleList, List<Fragment> fragmentList) {
            super(fm);
            this.titleList = titleList;
            this.fragmentList = fragmentList;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return titleList[position];
        }

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

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

}
这里说一下我把adapter定义在activity中了,这样做法不好,没有高内聚低耦合,不过用来做demo所以没有讲究那么多,勿喷

再来看一下activity的两个xml

第一个

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="com.fanyafeng.materialdesign.activity.TabLayoutActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/AppTheme.PopupOverlay" />
        <!-- app:tabMode="scrollable" app:tabGravity="fill" -->
        <!-- app:tabMode="scrollable" app:tabGravity="center" 一共有四种组合,大家自己可以尝试一下-->
        <android.support.design.widget.TabLayout
            android:id="@+id/layoutTab"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:tabGravity="center"
            app:tabIndicatorColor="#0ddcff"
            app:tabMode="scrollable" />

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_tab_layout" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        android:src="@android:drawable/ic_dialog_email" />

</android.support.design.widget.CoordinatorLayout>
第二个xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.fanyafeng.materialdesign.activity.TabLayoutActivity"
    tools:showIn="@layout/activity_tab_layout">

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

</RelativeLayout>

再来看一下fragment

package com.fanyafeng.materialdesign.fragment;

import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;

import com.andview.refreshview.XRefreshView;
import com.fanyafeng.materialdesign.Constant.MaterialDesignConstant;
import com.fanyafeng.materialdesign.R;
import com.fanyafeng.materialdesign.adapter.RVAdapter;

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

/**
 * A simple {@link Fragment} subclass.
 * Activities that contain this fragment must implement the
 * to handle interaction events.
 * Use the {@link TabLayoutFragment#newInstance} factory method to
 * create an instance of this fragment.
 */
public class TabLayoutFragment extends Fragment {
    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "flag";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

    private View view;

    private RecyclerView.LayoutManager layoutManager;

    private RVAdapter rvAdapter;
    private List<String> stringList;

    private XRefreshView xrvTabViewRefresh;
    private RecyclerView rvTabView;


    public TabLayoutFragment() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment TabLayoutFragment.
     */
    // TODO: Rename and change types and number of parameters
    public static TabLayoutFragment newInstance(String param1, String param2) {
        TabLayoutFragment fragment = new TabLayoutFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        view = inflater.inflate(R.layout.fragment_tab_layout, container, false);
        return view;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.d("TabLayout", mParam1);
        initView();
        initData();
    }

    private void initView() {
        xrvTabViewRefresh = (XRefreshView) view.findViewById(R.id.xrvTabViewRefresh);
        xrvTabViewRefresh.setPullRefreshEnable(false);
        xrvTabViewRefresh.setPullLoadEnable(false);
        xrvTabViewRefresh.setMoveForHorizontal(true);
        rvTabView = (RecyclerView) view.findViewById(R.id.rvTabView);
        rvTabView.setHasFixedSize(true);
        switch (mParam1) {
            case "0":
                layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
                break;
            case "1":
                layoutManager = new GridLayoutManager(getActivity(), 2, GridLayoutManager.VERTICAL, false);
                break;
            case "2":
                layoutManager = new GridLayoutManager(getActivity(), 1, GridLayoutManager.VERTICAL, false);
                break;
            case "3":
                layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
                break;
            case "4":
                layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
                break;
        }
        rvTabView.setLayoutManager(layoutManager);
        stringList = new ArrayList<>();
        stringList = Arrays.asList(MaterialDesignConstant.imageList);
        rvAdapter = new RVAdapter(getActivity(), stringList);
        rvTabView.setAdapter(rvAdapter);
    }

    private void initData() {

    }

}

看一下fragment的xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.fanyafeng.materialdesign.fragment.TabLayoutFragment">

    <com.andview.refreshview.XRefreshView
        android:id="@+id/xrvTabViewRefresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

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


    </com.andview.refreshview.XRefreshView>

</FrameLayout>

还有adapter

package com.fanyafeng.materialdesign.adapter;

import android.content.Context;
import android.net.Uri;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.andview.refreshview.recyclerview.BaseRecyclerAdapter;
import com.facebook.drawee.view.SimpleDraweeView;
import com.fanyafeng.materialdesign.R;
import com.fanyafeng.materialdesign.util.ControllerListenerUtil;
import com.fanyafeng.materialdesign.util.MyUtils;

import java.util.List;

/**
 * Created by 365rili on 16/6/14.
 */
public class RVAdapter extends BaseRecyclerAdapter<RVAdapter.ViewHolder> {
    private Context context;
    private List<String> stringList;

    public RVAdapter(Context context, List<String> stringList) {
        this.context = context;
        this.stringList = stringList;
    }

    public OnItemClickListener onItemClickListener;

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

    public interface OnItemClickListener {
        void onItemClickListener(View view, String string, int position);

        void onItemLongClickListener(View view, String string, int position);
    }

    @Override
    public ViewHolder getViewHolder(View view) {
        return new ViewHolder(view);
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType, boolean isItem) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_rv_layout, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position, boolean isItem) {
//        holder.sdvRvItem.setImageURI(Uri.parse(stringList.get(position)));
//        holder.sdvRvItem.set
        ControllerListenerUtil.setControllerListener(holder.sdvRvItem, stringList.get(position), MyUtils.getScreenWidth(context) >> 1, context);
        if (onItemClickListener != null) {
            holder.sdvRvItem.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    onItemClickListener.onItemClickListener(v, stringList.get(position), position);
                }
            });
            holder.sdvRvItem.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    onItemClickListener.onItemClickListener(v, stringList.get(position), position);
                    return false;
                }
            });
        }
    }

    @Override
    public int getAdapterItemCount() {
        return stringList.size();
    }


    public class ViewHolder extends RecyclerView.ViewHolder {
        private SimpleDraweeView sdvRvItem;

        public ViewHolder(View itemView) {
            super(itemView);
            sdvRvItem = (SimpleDraweeView) itemView.findViewById(R.id.sdvRvItem);
        }
    }
}

好,剩下的来看几个工具类

fresco处理图片的工具类

package com.fanyafeng.materialdesign.util;

import android.content.Context;
import android.graphics.drawable.Animatable;
import android.net.Uri;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.ViewGroup;

import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.controller.BaseControllerListener;
import com.facebook.drawee.controller.ControllerListener;
import com.facebook.drawee.interfaces.DraweeController;
import com.facebook.drawee.view.SimpleDraweeView;
import com.facebook.imagepipeline.image.ImageInfo;

/**
 * Created by 365rili on 16/6/14.
 */
public class ControllerListenerUtil {
    public static void setControllerListener(final SimpleDraweeView simpleDraweeView, String imagePath, final int imageWidth, Context mContext) {
        final ViewGroup.LayoutParams layoutParams = simpleDraweeView.getLayoutParams();


        ControllerListener controllerListener = new BaseControllerListener<ImageInfo>() {
            @Override
            public void onFinalImageSet(String id, @Nullable ImageInfo imageInfo, @Nullable Animatable anim) {
                if (imageInfo == null) {
                    return;
                }
                int height = imageInfo.getHeight();
                int width = imageInfo.getWidth();
                layoutParams.width = imageWidth;
                layoutParams.height = (int) ((float) (imageWidth * height) / (float) width);
                simpleDraweeView.setLayoutParams(layoutParams);
            }

            @Override
            public void onIntermediateImageSet(String id, @Nullable ImageInfo imageInfo) {
                Log.d("TAG", "Intermediate image received");
            }

            @Override
            public void onFailure(String id, Throwable throwable) {
                throwable.printStackTrace();
            }
        };

        DraweeController controller = Fresco.newDraweeControllerBuilder()
                .setControllerListener(controllerListener)
                .setUri(Uri.parse(imagePath))
                .build();
        simpleDraweeView.setController(controller);
    }
}

myutil

package com.fanyafeng.materialdesign.util;

import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.text.Html;
import android.text.Spanned;
import android.util.DisplayMetrics;
import android.view.WindowManager;

import java.lang.reflect.Field;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;


public class MyUtils {
    private static String channel = null;

    //    获取虚拟按键高度
    public static int getNavigationBarHeight(Context context) {
        Resources resources = context.getResources();
        int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
        return resources.getDimensionPixelSize(resourceId);
    }

    public static String getChannel(Context context) {
        if (channel == null) {
            ApplicationInfo ai = null;
            channel = "shape_maintext_box";
            try {
                ai = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);

                if (ai != null) {
                    channel = String.valueOf(ai.metaData.get("UMENG_CHANNEL"));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return channel;
    }

    public static int getStatusBarHeight(Context context) {
        try {
            @SuppressWarnings("rawtypes")
            Class clazz = Class.forName("com.android.internal.R$dimen");
            Object object = clazz.newInstance();
            Field field = clazz.getField("status_bar_height");

            int id = Integer.parseInt(field.get(object).toString());
            return context.getResources().getDimensionPixelSize(id);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    /**
     * Get the screen height.
     *
     * @param context
     * @return the screen height
     */
    public static int getScreenHeight(Context context) {
        if (context != null) {
            DisplayMetrics displayMetrics = new DisplayMetrics();
            WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
            windowManager.getDefaultDisplay().getMetrics(displayMetrics);

            return displayMetrics.heightPixels;
        } else {
            return 1920;
        }
    }

    /**
     * Get the screen width.
     *
     * @param context
     * @return the screen width
     */
    public static int getScreenWidth(Context context) {
        if (context != null) {
            DisplayMetrics displayMetrics = new DisplayMetrics();
            WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
            windowManager.getDefaultDisplay().getMetrics(displayMetrics);

            return displayMetrics.widthPixels;
        } else {
            return 1080;
        }
    }

    public static float getDensity(Context context) {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        windowManager.getDefaultDisplay().getMetrics(displayMetrics);
        return displayMetrics.density;
    }

    public static String getMetaValue(Context context, String metaKey) {

        if (context == null || metaKey == null) {
            return null;
        }

        try {
            ApplicationInfo aiApplicationInfo = context.getPackageManager().getApplicationInfo(
                    context.getPackageName(), PackageManager.GET_META_DATA);

            if (null != aiApplicationInfo) {
                if (null != aiApplicationInfo.metaData) {
                    return aiApplicationInfo.metaData.getString(metaKey);
                }
            }

        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 格式化日期
     * yyyy-MM-dd 转为 yyyy年MM月dd日
     *
     * @param dateStr
     * @return
     */
    public static String formatSystemDateCN(String dateStr) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        try {
            String standarTime;

            Date date = simpleDateFormat.parse(dateStr);
            simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日");
            standarTime = simpleDateFormat.format(date);

            return standarTime;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return dateStr;
    }

    private Spanned dealTag(String str1, String str) {
        String[] array = str.split(",");
        StringBuilder sb = new StringBuilder();
        sb.append("祈福");
        sb.append("<b><font color=\"#ff6600\">" + str1 + "</font></b>");
        sb.append("<b>" + " 司掌" + "</b>");
        for (String s : array) {
            sb.append("<b><font color=\"#ff6600\">" + " [ " + s + " ]" + "</font></b>");
        }
        return Html.fromHtml(sb.toString());
    }

    /**
     * 第二个参数为圆角的角度
     *
     * @param bitmap
     * @param pixels
     * @return
     */
    public static Bitmap getRoundAngleImage(Bitmap bitmap, int pixels, boolean recycleOld) {
        Bitmap output = null;
        if (bitmap != null && !bitmap.isRecycled()) {
            output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(output);

            final int color = 0xff424242;
            final Paint paint = new Paint();
            final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
            final RectF rectF = new RectF(rect);
            final float roundPx = pixels;

            paint.setAntiAlias(true);
            paint.setFilterBitmap(true);
            canvas.drawARGB(0, 0, 0, 0);
//            paint.setColor(color);
            canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

            paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
            canvas.drawBitmap(bitmap, rect, rect, paint);
            if (recycleOld)
                bitmap.recycle();
            return output;
        }
        return output;
    }

    public static Bitmap getRoundImage(Bitmap oriImg, boolean recycleOld) {

        Bitmap targetBitmap = null;

        if (oriImg != null && !oriImg.isRecycled()) {
            int size = Math.min(oriImg.getWidth(), oriImg.getHeight());
            int targetWidth = size;
            int targetHeight = size;

            targetBitmap = Bitmap.createBitmap(targetWidth, targetHeight, Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(targetBitmap);

            Paint paint = new Paint();
            paint.setAntiAlias(true);
            paint.setFilterBitmap(true);
            canvas.drawARGB(0, 0, 0, 0);
            canvas.drawCircle(targetWidth / 2f, targetHeight / 2f, targetWidth / 2f, paint);

            paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
            canvas.drawBitmap(oriImg, new Rect(0, 0, size, size), new Rect(0, 0, targetWidth, targetHeight), paint);

            if (recycleOld) {
                oriImg.recycle();
            }
        }
        return targetBitmap;
    }
}

还有存图片地址的

package com.fanyafeng.materialdesign.Constant;

/**
 * Created by 365rili on 16/6/14.
 */
public class MaterialDesignConstant {
    public final static String[] imageList = new String[]{
            "data:image/jpeg;base64,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",
            "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCADcAWADASIAAhEBAxEB/8QAHAABAAIDAQEBAAAAAAAAAAAAAAECBQYHAwQI/8QAORAAAQQBAQUGBAMIAgMAAAAAAAECAxEEBQYhMUFREhQiI0JhE1Jx0RUkkQcyM2KBobHBQ+FysvD/xAAbAQEAAgMBAQAAAAAAAAAAAAAABAUBAwYCB//EAC0RAQACAQMDAgYBBAMAAAAAAAABAgMEETEFEhMhQSIyQmGh0XEURFGBseHx/9oADAMBAAIRAxEAPwDGWLAJKCWLBFgSCLFgTYIsWBIIsmwAFkWBIIsWBIIsASCLFgSCLAEggASCABIIAEggASCABIIAEggASCABIIAEggASCABIIACxZUAWsWVAFrFlQBaxZUAWsWVAFrFlQBNiyABNiyLAE2LIsWBNiyLFgTYsixYE2LIsWBNiyLIsC1iytiwytYIsWGE2LKgMrWLKgC1iyoDC1iyosMrWLK2LAtZFkWLAtZFkWLAArYsCwK2LAsCtiwLArYAsLK2ALEWRYsCbFkACbFkACbFkACbFkACbFkACbBAAkEACQQLAkEEWBYFbFgWBWxYFgVsWBYFbFgWBWxYFgVsWBYiyLAAEAwJBAAkEACQQAJBAAkEACRZAAkWVskCbFlbCupAPpwsOfUc6HDxWduaV3ZanJOqr7JxNg2t2SdoGPj5mM582N2UZO5eLX/N/4r/ZTbtiNml0jB77lMrOyW70XjEzk36rxX9ORs+Rjw5eNJj5EbZIZWqx7HcHIpTZ+ozXNHZ8sflIrijt9eXAkVFSybMjtFoU2zeruxXK5+NJbseVfU3ovunBf15mMst6XresWrxLRMTE7StYsrYs9MLWLK2LAtZFkWLAtZBFiwLWRZFgCRZAAkEACQQAJBAAkECwJBFkWAsWRYsCbFlbFg2WsWVsWDZaxZWxYNlrFlbANlrFlRYFrFkxRSTq9I29rspank16OQxExM7PU0tFYtMek8PSxZWxZl52Ws3PYLZr8Qyk1bLZeLA7yWOTdI9Of0T/AD9DX9ndDm2h1ZmJGqthb455U9DPuvBDtmNjQ4eNFjY8aRwxNRjGJwREKzqGq8dfHXmW7FTf1l6gAoUpitodCx9oNJkw5qa/96GWt8b+S/TkvscSycbI0/NmwsuNY54Xdl7V/wAp1ReJ+gjTtu9ll1jC/EMKO9Qxm/uom+Zien6pxT+qFjoNV4rdluJ/DVkpvG8OV2LPNj0c2y1nQIuy1iyLIsMbLWLK2LBstYsrYsGy1iyosGy1iyoDOy1iyoDGy1iyosM7LWLK2LBsmybK2LBstYsrYsMbAsqAytYsqRYF7IsrYsCwsrYsCwK2LAsGo6R7Y2JbnLSIVV1IZjS8P4TPjyJ5j03IvpQ1ZssY67pug0dtXmikce8/Z9WLjNxYEYm9eLndVMVqmGsEneYk8ty+NE9K9TOEOa17Fa5EVqpSovMq8ea1L9zstToMWbT+GI224+zWEdaWekEM2XkRY2OxZJpXIxjE4qqlczGXAyOwqqsTt7HL06f0Om/s+2Z7ljJrGYysmdvkMcm+ONef1X/H1J+fVVx4u/8Azw4e+C+PJOO8bTDYtmtBh2e0lmM2nTv8c8qet/2TghmADmr3m9ptbmW+I2jaAAHlkAAHK/2gbL/h+S7WsKP8rM78wxqbo3r6vov9l+ppSLaWfoWeCLKx5IJ42yRSNVj2OTc5F4ocP2n2fl2a1dcde0/Elt2NKvNvyr7p9lL3p+q748duYRstNvWGLFlbIstGlcWUsWBeyCtiwLArYsCwKizAsCtiwLWLK2LAtYsrYsC1iytiwLWLK2LAWLK2LAtYsrYsC1iytiwLWLK2LAtYsrZ6Y8D8qdsTN173O6J1MTMRG8vdMdslopWN5l9Wm4feZfiyJ5TF4fMpnikUTIYmxsSmtSkQuVGbLOS27vdBo66TFFI595AAak1V0UMj4/jRNlYx6P7LuCqinUdJ1GPOxWSMW0VP09jmBk9F1R2nZSdpfJeviTp7mrLTvr/Cq6novPXyUj4o/LpwPDGyGzxI5Fu0PcguWAAAAAAxe0Gh420OkyYOR4VXxRS1vjfycn++qGUB6raazFo5hiY3fnfLxMnTc6bBzI+xkQu7Lk5eyp1ReKHnZ1zbzZT8bwUzsOO9Rxm7kTjMzirfrzT9OZx9j+0nudLpdTGem/v7ol6dsvSxZWxZJeFrFlbF0BaxZWxYFrIsiyLAtYsrYsC1iytiwLWLK2LAtYsrYsC1grYsBYsrYsC1iytiwLWLK2LAtYsrYsC29VRrUVXKtIiczY9Pw0w4KWlkdvev+j4tHwqrLlTev8NOidTMFdqs3dPZDrui9P8AHXz5I9Z4+0f9gAIa/AAAAHMDZtmdZWGRuJM7cv8ADVf8G8RvR7UVFORIqtVFRVRU3oqG9bOa13uFIpV81m53v7kXNj+qHN9V0PZPmpHpPLZgQi2hJGUoAAAAAHKf2i7K9xndrmDH+Xld+aY1P4b19f0Xn7/U6sUmhiyIJIJo2yRSNVr2OS0ci8UU36fPbDfuh5tXujZ+cUdaE2ZnavZyXZjV1hTtOwZrdjSL05tX3T+6UphLOmpki9YtXiUSYmJ2lZXUhuezmzca4L8jUIu07IYrWxu9DF5+yr/Yxmyuh/iGR33JZ+Vid4Wr/wAjk/0h0AlYqe8q7V6jb4KuUapp8ukak/EltW/vRv8AnbyX7nzWdJ2h0Vus6esbabkx+KF69ei+ynM/Gx7o5GqyRiq1zV4oqcUNeSnbKRp80Za+vML2LK2DwkLWLKgwLWLKgC1kWQAJsmyliwLCytiwFiyLIAtYsrYAtYsqALH16bhLm5FvTyWb3e/sfLDE/InbDGlucv6e5teNjsxYGxR8G8V6r1I2pzdldo5lcdI6f/U5PJePhj8z/j9vZEpKTcgAKx2gAAAAAAAAe2LkyYmQyaJac1f19jxAebVi0TWeHTNH1OPPxWPav1Tmi9DKnL9H1N2m5aOVV+C5fGnT3Oj4mSzIha9qoqKl7iDlx9suQ12knTZNvaeH0gA1IQAAAAAxmv6HjbQ6RLgZO7teKORE3xvTg5P/ALehxTF2cznbQS6RlMWJ+O7z3pwRvJU63y/6O/GJ1rS+9xd4ganeo03V62/L9iy6dqox3il/llH1NbTSZpywMEEWNjxwQsRkUbey1qckPQ8oZUkZfM9TrHMzvv6hpm2mh2i6vis8TUrIanNOT/6czcyHNRzVa5EVqpSovBUMWrFo2l7xZJx27ocbR3aqktV3IiczI52kTYeBHkqtr/ytT0Xw/wCzNv2cj0fWnTJ4sdy3jovoXmi/Tl7GRc1sjFa5Ec1yUqLzQ1Uw+k7ujw1rkp3x7tCR1oTZ76lgO0zMWPesL98Tvbp9UPmsjzExO0tUxMTtK1iyoMMLWLKgC1iyosC1kWRYsACtiwLAqLAsQqkWZfRMD4r0y5U8DV8tF5r1PGTJFK90pOk019TljHR9+k4HdIfiSJ50ieL+VOhkQCovabT3S73BhpgxxjpxAADy3AQAAAAAAAAAAbFs1rC40rcSZ3gX9xV5exrout6blPNqxaNpR9Tp66jHNLOvRyI9qKi8S5quzetd5j+BM7zWcfdOptLVtCBes1naXG5sVsV5pfmEgA8tYAAAAA1rXNPXFmXPgTynr5zU9K/N/XmfExyObaG4vY2RjmPajmuSlReCoahm4btLzPhb1gk3xOX/AAvuh0nStb3x4bz6xwpdfpe2fLXj3AEW0BdKp4ZeKzMxnQv3XvR3Nq8lNcaj4ZXQSpUjFpff3NqMbq+CuRGk8SedGnBPU3oZWPT9V4rdluJ/DAajgx6hhugfuXix3yu5KaQ5kkEz4Jm9mRi05DfopEkYioYfaHS1yYe9wNueJPEietv3Q1ZsfdG8LvLTujeGtAo1/abZNkREWBWxYFrIsixYE2LIsWAsWVFmBaxZUsxj5ZGxRt7T3LSIHqKzM7Q+nAw3Z+Uke9I275HdE6fU21jGxsaxiI1rUpETkh4YGGzBxmxN3u4vd8yn0lXny+S3pw7fpmhjS4vi+aef0AA0LMAAAIAAAAAAAAAAAAHpjzyY07JonU9q2h0bRdUZn4rXtXfwVOaL0Oan3aVqT9Ny0eir8N256f7NWSndCs6lov6indX5o/P2dTB8uFlMyYWva5FRUtFQ+ogzGzlOAAAAAAPmzsOPPxHQSbr3tdzavJUPpB6raaWi1eYebVi0bS0pEkx53406VKxaXovRU9j1M3rOmLmwpNCn5mJPD/Ony/Y1+CVJG9F5op2Gh1canHv7xy53V6ecN/tPD1ABMRGv6ph90yO8xp5Mi+JE9Lvsp4ItpaGySxMmidFI3tMclKhrMsL8LJdjyLacWO+Zp6hf9O1Xkr47cx/w1HXtM7hk94ib+XlXeieh3T6KYu7OgZGPFl474Jm9qN6UqGhZeLLp+Y/Gl3qm9rvmbyUiZsfbO8cJOam07wpYsixZoaVhZUAWsWVAAFbFgSqoiWbJomn93i7zK3zZE8KL6W/dTHaLp/e5/jyt8iNdyL6ndPobQQtVm+iP9ul6L0/+4yR/H7/SQAQXTAAAAAAEAAAAAAAAAAAAAAAM/s5rC4k7cWV3luXwKvJehv0UiSMRUU5Ebps1razsTHmd5rE4r6k6kbNj+qHPdV0W0+ekfz+22ghrkVLQkiqIAAAAADW9d09ceVc+BvluXzmpyX5vubIQ5rXtVrkRWqlKi80JGl1NtPki9WnPhrmpNZacxyPbaFic7DdpWZ8NLXHk3xKvL+VfoQi2dliy1y0i9OJc1kx2x2mtg+PUcJM3HpKSVm+N3v0+in2A2sUvalotXmGqRPVba9Fa9q0qLyU+HW9LTUsPwIiZEe+Nev8AL/U2DWMNWr32JN6fxUTmnU+Bjkc2xMRaNpdPp81dRj7o/wBucNVbVrkVHItKi8UUmzP7TaWrHLqMDdy7pmp/Z33NfR1oQb1ms7S03rNZ2TYsgHh5TYsgALPfDxZM7KbBHuve53yp1PnRFc5GtRVcq0iJzU3DS9PTAxeytLM/fI736fRDTny+OvpysumaGdVl9fljn9Prhhjx4GRRJTGJSIX5DkTyKqZ3nd3ERFY2jgAAZAAAAAAAAAAAAAAAAAAAAAAvDM/HmbLGvZe1bRSgDExExtLo+h6szPxWuunJuc3opmuJyrTNQfp2W2Vtqxdz29UOk4GYzKgY9jkVFS0VCFlx9s7w5HX6OdNk9Plnj9PsABpQAAAAAB8+bhx52K+CXgu9HJxavJUNS7MmLO/GnSpGLXsqclT2N1MZrOmd+gSSFE7zEls/mT5S06brfBfsv8s/hB1um8te6vMMEDyhl+I3fuVNyovJT1Oqc/tsKiKioqWi8jWs3FXT8qmp5Em9i9PY2U8MvFjzMd0MnBeC82ryUylaTUzgyb+08teVrZGK1yI5rkpUXgqGh6vprtKzewlrjyb4nL06fVDekR8MroJkqRi0vv7nhqWBHqWE/Hk3Ku9jvldyU8ZKd8fd0dqxkrvDQLAkikxp3487ezJGtOQggoabFkADYdB0t0f5zIYqP4Rtcm9OqmeJUgp8l5vbul9C0umppsUY6f8AoADwkpAAAAgCQAAIJIAEkEgCCSABJBPMCCSCeYAglSAJA5gAZzZ7V1wshMeR3lPXwqvpX7GDHMxasWjaWjUYKZ8c0s67DKkjEVFPQ1/ZqaSXTYXPerlripn0K+0bTs4rJTsvNZ9kgA8vIAAAAA13XdPWCRdQgTwr/Gan/t9zHsej2oqG4q1HIrXIitXcqLzQ0iNqR5M8bdzGSOa1OiIp03SNVbJScVvpUnUcEUmLx7voABcKtjdWwVyIkniTz404fMnQw8UiSMRUNqNYzWti1edjE7LVp1J1VLUzC66XntO+KfbhgtpNJ73B3uBt5ESeJE9bfuhp7XI5LOncjnusRMg1zLjiajWI+0anBLRFI2opEfFCwzV93ygAjI7/2Q==",
            "data:image/jpeg;base64,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",
            "data:image/jpeg;base64,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",
            "http://img1.imgtn.bdimg.com/it/u=753665811,2183009962&fm=21&gp=0.jpg",
            "http://img4.imgtn.bdimg.com/it/u=1561950933,1522225759&fm=21&gp=0.jpg",
            "http://img0.imgtn.bdimg.com/it/u=3808587152,3416392106&fm=21&gp=0.jpg",
            "http://img3.imgtn.bdimg.com/it/u=1592877738,3666022423&fm=21&gp=0.jpg",
            "http://img5.imgtn.bdimg.com/it/u=552051431,70611714&fm=21&gp=0.jpg",
            "http://img0.imgtn.bdimg.com/it/u=3962123193,3798260731&fm=21&gp=0.jpg",
            "http://img5.imgtn.bdimg.com/it/u=856175274,3453042543&fm=21&gp=0.jpg",
            "http://img3.imgtn.bdimg.com/it/u=1242674924,4218983555&fm=21&gp=0.jpg",
            "http://img2.imgtn.bdimg.com/it/u=569565529,168354181&fm=21&gp=0.jpg",
            "http://img3.imgtn.bdimg.com/it/u=1255836822,4097950891&fm=21&gp=0.jpg",
            "http://img3.imgtn.bdimg.com/it/u=2275700747,771730318&fm=21&gp=0.jpg",
            "http://img1.imgtn.bdimg.com/it/u=2673305258,4189738827&fm=21&gp=0.jpg",
            "http://img4.imgtn.bdimg.com/it/u=155566276,3293254014&fm=21&gp=0.jpg",
            "http://img0.imgtn.bdimg.com/it/u=3210525695,992120263&fm=21&gp=0.jpg",
            "http://img4.imgtn.bdimg.com/it/u=3307450130,1937014110&fm=21&gp=0.jpg",
            "http://img5.imgtn.bdimg.com/it/u=1544294118,1073313437&fm=21&gp=0.jpg",
            "http://img1.imgtn.bdimg.com/it/u=4116803928,1447360019&fm=21&gp=0.jpg",
            "http://img5.imgtn.bdimg.com/it/u=149652603,493951694&fm=21&gp=0.jpg",
            "http://img5.imgtn.bdimg.com/it/u=1777052968,2582126753&fm=21&gp=0.jpg",
            "http://img3.imgtn.bdimg.com/it/u=764584551,2902162890&fm=21&gp=0.jpg",
            "http://img1.imgtn.bdimg.com/it/u=3402656117,4059178644&fm=21&gp=0.jpg",
            "http://img1.imgtn.bdimg.com/it/u=3672325716,2903366747&fm=21&gp=0.jpg",
            "http://img3.imgtn.bdimg.com/it/u=4074412916,764268641&fm=21&gp=0.jpg",
            "http://img4.imgtn.bdimg.com/it/u=431695870,705225180&fm=21&gp=0.jpg",
            "http://img1.imgtn.bdimg.com/it/u=1006221511,1202404044&fm=21&gp=0.jpg",
            "http://img2.imgtn.bdimg.com/it/u=803626668,2444411150&fm=21&gp=0.jpg",
            "http://img4.imgtn.bdimg.com/it/u=3828043788,2672882288&fm=21&gp=0.jpg",
            "http://img1.imgtn.bdimg.com/it/u=2097308224,3483066211&fm=21&gp=0.jpg",
            "http://img0.imgtn.bdimg.com/it/u=2829271292,3032423924&fm=21&gp=0.jpg",
            "http://img0.imgtn.bdimg.com/it/u=1254997020,3575307850&fm=21&gp=0.jpg",
            "http://img5.imgtn.bdimg.com/it/u=1057290227,2796153918&fm=21&gp=0.jpg",
            "http://img3.imgtn.bdimg.com/it/u=3086552952,2211944683&fm=21&gp=0.jpg"
    };
}

现在来讲一下,这里用的是一个fragment,但是实例化fragment传了响应的值做了响应的判断显示不同的布局,而且这个支持上滑toolbar消失,

这里tablayout提供了响应的方法使其进行与viewpager的联动

myViewPagerAdapter = new MyViewPagerAdapter(getSupportFragmentManager(), stringList, fragmentList);
        viewpagerTab.setAdapter(myViewPagerAdapter);
        viewpagerTab.setOffscreenPageLimit(3);
        viewpagerTab.addOnPageChangeListener(this);
//        代码中优先级高于xml
//        layoutTab.setTabMode(TabLayout.MODE_SCROLLABLE);
        layoutTab.setupWithViewPager(viewpagerTab);
        layoutTab.setTabsFromPagerAdapter(myViewPagerAdapter);
具体的使用建议大家去看一下源码,而且感觉这样写起来很简洁方便尤其是像美拍那样的,而且后期运维也方便

viewpager就不细讲了,recyclerview的点击事件需要大家自己写接口,而且传参更支持自定义,感觉这样的写法真好,要什么给什么全都在自己,里面还有一些细节的东西比较多后面的话会单独总结一下,不过掌握这些用在开发中基本就够了




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值