Android基于viewpager和tablayout实现类似今日头条和腾讯新闻的界面

简介

在现在的安卓开发中,大部分需求会经常遇上viewpager和tablayout组合实现的功能,然后通过网络请求拿到数据然后显示在页面上,之前自己也在网上搜索过一些文章,要么是帮助不大,要么是效果不一样,要么是贴的代码不完整,从而导致一脑门汗呐,所以我自己在摸索了一阵之后,参考腾讯新闻的首页,完成了一个大致还算完整的demo,供大家参考。有问题还望大家指正出来,感激不尽。。

需要自定义指示器的请看第二篇:

tablayout+viewpager自定义指示器

老规矩,先贴效果图

本文先着重显示viewpager+tablayout;

下面的源码是整合后的代码,已经实现了部分新功能。

在这里插入图片描述

使用到得控件和工具简介:

  • RefreshLayout(上拉加载下拉刷新控件)
  • Adapter(加载数据的适配器)
  • ViewPager(视图加载)
  • TabLayout(最上方的title控件)
  • Handler(网络通信)
  • Glide(图片框架)

好了,开始上代码吧!!!

首先,先导入一系列的插件:

//基本使用
    implementation 'com.android.support:design:27.0.2'
    implementation 'com.android.support:appcompat-v7:27.0.2'
    implementation 'com.android.support:cardview-v7:27.0.2'

    //图片加载
    implementation 'com.github.bumptech.glide:glide:3.7.0'

    //刷新加载框架
    implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.0.3'
    implementation 'com.scwang.smartrefresh:SmartRefreshHeader:1.0.3'

    //网络请求
    implementation 'com.squareup.okhttp3:okhttp:3.11.0'
    //数据解析
    implementation 'com.google.code.gson:gson:2.8.5'
    //???
    implementation 'com.squareup.picasso:picasso:2.5.2'

当然,请求数据肯定是用到了网络,就要放入网络权限:

<uses-permission android:name="android.permission.INTERNET"/>

布局xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    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/white">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.design.widget.TabLayout
            android:id="@+id/frag_two_tabLayout"
            android:layout_width="@dimen/dimen_410_dip"
            app:tabIndicatorColor="@color/blue"
            app:tabTextColor="@color/grey"
            app:tabSelectedTextColor="@color/black"
            android:layout_height="@dimen/dimen_60_dip"
            android:background="@color/cyan"/>

        <ImageView
            android:id="@+id/frag_two_img_add"
            android:layout_width="match_parent"
            android:layout_height="@dimen/dimen_60_dip"
            android:layout_alignParentTop="true"
            android:padding="@dimen/dimen_10_dip"
            android:background="@color/cyan"
            android:layout_toEndOf="@+id/frag_two_tabLayout"
            android:src="@android:drawable/ic_menu_add"/>

    </RelativeLayout>

    <TextView
        android:id="@+id/txt_show_toast"
        android:background="@color/dodgerblue"
        android:textColor="@color/white"
        android:textSize="@dimen/dimen_14_dip"
        android:text="又为您找到了10条数据"
        android:gravity="center"
        android:visibility="gone"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dimen_30_dip">

    </TextView>

    <com.scwang.smartrefresh.layout.SmartRefreshLayout
        android:id="@+id/frag_two_refreshLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:srlEnablePreviewInEditMode="false">

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

            <android.support.v4.view.ViewPager
                android:id="@+id/frag_two_viewpager"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@color/white" />

            <View
                android:layout_width="match_parent"
                android:layout_height="@dimen/dimen_0.5_dip"
                android:background="@color/gainsboro" />

        </LinearLayout>

    </com.scwang.smartrefresh.layout.SmartRefreshLayout>

</LinearLayout>

MainActivity.class

/**
 * 主Activity
 * 用来显示主界面
 */
public class MainActivity extends FragmentActivity implements View.OnClickListener {

    //上下文
    Activity activity = this;

    //当前所在的fragment的值,默认为0
    public static int DEFAULTFRAGMENT = 0;

    //控件
    static ViewPager viewPager;
    TabLayout frag_two_tabLayout;
    ImageView frag_two_img_add;

    //你是多余的
    TextView txt_show_toast;

    //添加头部item布局信息
    List<String> titles = Arrays.asList("头条", "社会", "国内", "国际", "娱乐", "体育", "军事", "科技", "财经", "时尚");


    //每一个头部item所对应一个item
    static List<Frag_Two_Frag_Item> frag_two_frag_items = new ArrayList<>();

    //适配器
    static FragmentPagerAdapter fragmentPagerAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //去掉标题栏
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

        //加载刷新框架
        final RefreshLayout frag_two_refreshLayout = findViewById(R.id.frag_two_refreshLayout);


        //越界回弹
        frag_two_refreshLayout.setEnableOverScrollBounce(false);

        //在刷新或者加载的时候不允许操作视图
        frag_two_refreshLayout.setDisableContentWhenRefresh(true);
        frag_two_refreshLayout.setDisableContentWhenLoading(true);

        //监听列表在滚动到底部时触发加载事件(默认true)
        frag_two_refreshLayout.setEnableAutoLoadmore(false);

        //设置自定义Header
        frag_two_refreshLayout.setHeaderHeight(50);
        frag_two_refreshLayout.setRefreshHeader(new ClassicsHeader(activity));
        //设置自定义Footer
        frag_two_refreshLayout.setFooterHeight(50);
        frag_two_refreshLayout.setRefreshFooter(new ClassicsFooter(activity));

        /**
         * 正在下拉刷新数据中
         */
        frag_two_refreshLayout.setOnRefreshListener(new OnRefreshListener() {
            @Override
            public void onRefresh(RefreshLayout refreshlayout) {
                Log.i("activity", "555");
                //设置刷新事件为2s
                frag_two_refreshLayout.finishRefresh(2000);
                Frag_Two_Frag_Item.adapter.notifyDataSetChanged();
            }
        });

        /**
         * 正在上拉加载数据中
         */
        frag_two_refreshLayout.setOnLoadmoreListener(new OnLoadmoreListener() {
            @Override
            public void onLoadmore(RefreshLayout refreshlayout) {
                Log.i("activity", "444");
                //设置加载事件为2s
                frag_two_refreshLayout.finishLoadmore(2000);
                Frag_Two_Frag_Item.adapter.notifyDataSetChanged();
            }
        });

        /**
         * sf的事件监听
         */
        frag_two_refreshLayout.setOnMultiPurposeListener(new OnMultiPurposeListener() {
            @Override
            public void onHeaderPulling(RefreshHeader header, float percent, int offset, int headerHeight, int extendHeight) {
            }

            @Override
            public void onHeaderReleasing(RefreshHeader header, float percent, int offset, int headerHeight, int extendHeight) {
            }

            @Override
            public void onHeaderStartAnimator(RefreshHeader header, int headerHeight, int extendHeight) {
            }

            @Override
            public void onHeaderFinish(RefreshHeader header, boolean success) {
            }

            @Override
            public void onFooterPulling(RefreshFooter footer, float percent, int offset, int footerHeight, int extendHeight) {
            }

            @Override
            public void onFooterReleasing(RefreshFooter footer, float percent, int offset, int footerHeight, int extendHeight) {
            }

            @Override
            public void onFooterStartAnimator(RefreshFooter footer, int footerHeight, int extendHeight) {
            }

            @Override
            public void onFooterFinish(RefreshFooter footer, boolean success) {
            }

            @Override
            public void onLoadmore(RefreshLayout refreshlayout) {
            }

            @Override
            public void onRefresh(RefreshLayout refreshlayout) {
            }

            @Override
            public void onStateChanged(RefreshLayout refreshLayout, RefreshState oldState, RefreshState newState) {
                Log.i("activity", "" + oldState + "-------" + newState);
                if(newState == RefreshState.RefreshFinish){
                    Log.i("getActivity()", "刷新完成");
                    txt_show_toast.setVisibility(View.VISIBLE);
                }
                if(oldState == RefreshState.RefreshFinish){
                    txt_show_toast.setVisibility(View.GONE);
                }
            }
        });

        //修改状态栏的颜色
        StatusBarCompat.setStatusBarColor(activity, ContextCompat.getColor(activity, R.color.cyan));

        //初始化view
        initView();
        //初始化数据
        initData();

        //通过适配器加载
        viewPager.setAdapter(fragmentPagerAdapter);
        //设置viewpager的缓存个数,全部页面都缓存
        viewPager.setOffscreenPageLimit(9);


        //必须与viewpager绑定,否则效果就看不出来
        frag_two_tabLayout.setupWithViewPager(viewPager);
        //设置tablayout的属性
        frag_two_tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
        frag_two_tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
    }

    /**
     * 初始化数据
     */
    private void initData() {

        //循环加载titles数组内容到fragment(每一个tablayout的显示界面都是一个frag)
        for(String title : titles){
            //通过frag对象加载title,并完成实例化
            Frag_Two_Frag_Item instance = Frag_Two_Frag_Item.getInstance(title);
            frag_two_frag_items.add(instance);
        }

        //用适配器完成每一个fragment的加载完成
        fragmentPagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override
            public Fragment getItem(int position) {
                //返回指定的fragment
                return frag_two_frag_items.get(position);
            }

            @Override
            public int getCount() {
                //fragment的个数
                return frag_two_frag_items.size();
            }

            @Override
            public CharSequence getPageTitle(int position) {
                //将titles的内容加载进每一个(position为指定的frag)
                return titles.get(position);
            }
        };
    }

    /**
     * 初始化view
     */
    private void initView() {
        txt_show_toast = findViewById(R.id.txt_show_toast);


        //viewpager
        viewPager = findViewById(R.id.frag_two_viewpager);
        //tablayout
        frag_two_tabLayout = findViewById(R.id.frag_two_tabLayout);

        //imageview
        frag_two_img_add = findViewById(R.id.frag_two_img_add);

        //设置点击事件
        frag_two_img_add.setOnClickListener(this);

        /**
         * 设置viewpager的滑动监听事件(左右滑动)
         */
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
//                A.C_Log(getActivity(), "------->position=" + position);
            }

            @Override
            public void onPageSelected(int position) {
                Log.i("getActivity()", "onPageSelected----> + position=" + position);
                DEFAULTFRAGMENT = position;
            }

            @Override
            public void onPageScrollStateChanged(int state) {
//                A.C_Log(getActivity(), "onPageScrollStateChanged");
            }
        });
    }

    /**
     * 设置tablayout的指示器宽度
     * @param tabs
     * @param leftDip
     * @param rightDip
     */
    @Deprecated
    public static void setIndicator(TabLayout tabs, int leftDip, int rightDip) {
        Class<?> tabLayout = tabs.getClass();
        Field tabStrip = null;
        try {
            tabStrip = tabLayout.getDeclaredField("mTabStrip");
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }

        tabStrip.setAccessible(true);
        LinearLayout llTab = null;
        try {
            llTab = (LinearLayout) tabStrip.get(tabs);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        int left = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, leftDip, Resources.getSystem().getDisplayMetrics());
        int right = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, rightDip, Resources.getSystem().getDisplayMetrics());

        for (int i = 0; i < llTab.getChildCount(); i++) {
            View child = llTab.getChildAt(i);
            child.setPadding(0, 0, 0, 0);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1);
            params.leftMargin = left;
            params.rightMargin = right;
            child.setLayoutParams(params);
            child.invalidate();
        }
    }

    /**
     * 单击事件
     * @param v
     */
    @Override
    public void onClick(View v) {
        int temdId = v.getId();
        if(temdId == R.id.frag_two_img_add){
            //跳转进title管理界面
            startActivity(new Intent(activity, AddTabItemActivity.class));
        }
    }

    /**
     * 将选中的值传进来并显示
     * @param SELECTEDFRAGMENT
     */
    public static void getSelectFrag(int SELECTEDFRAGMENT) {
        //跳转进viewpager指定的item
        viewPager.setCurrentItem(SELECTEDFRAGMENT, false);
    }

}

Frag_Two_Frag_Item.class

/**
 * 第一个界面里面所嵌套的公用frag
 */
public class Frag_Two_Frag_Item extends BaseFragment {

    String item_title="默认";

    public static String BUNDLE_TITLE = "title";
    public static final String APPKEY = "0bea107901b817f31bafbda687d2753d";

    public static FragTwoItemAdapter adapter;

    List<News> datas = new ArrayList<>();

    RecyclerView frag_item_listView;

    ImageView img_itemtwofrag_load;

    //获取最后一个可见view的坐标
    int lastItemPosition;
    //获取第一个可见view的坐标
    int firstItemPosition;

    /**
     * handler
     * 通过线程获取数据并加载adapter
     */
    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            if(msg.arg1 == 10012){
                Toast.makeText(getActivity(), R.string.getDataError, Toast.LENGTH_SHORT).show();
                return;
            }

            img_itemtwofrag_load.clearAnimation();
            img_itemtwofrag_load.setVisibility(View.GONE);
            //设置RecyclerView的数据加载
            frag_item_listView.setLayoutManager(new LinearLayoutManager(getActivity()));
            adapter = new FragTwoItemAdapter(getActivity(), datas);
            frag_item_listView.setAdapter(adapter);

            adapter.setLinster(new FragTwoItemAdapter.ItemOnClickLinster(){
                @Override
                public void textItemOnClick(View view, int position) {
                    Log.i("getActivity()", "点击事件");
                    Intent intent = new Intent(getActivity(), NewDetailActivity.class);
                    intent.putExtra("url", datas.get(position).getDateilurl());
                    intent.putExtra("img", datas.get(position).getThumbnail_pic_s());
                    intent.putExtra("title", datas.get(position).getTitle());
                    startActivity(intent);
                }
            });
        }
    };

    Map<String, String> params;


    @Override
    protected int setContentView() {
        return R.layout.frag_two_frag_item;
    }

    @Override
    protected void init() {
        Bundle bundle = getArguments();
        if(bundle != null){
            item_title = bundle.getString(BUNDLE_TITLE);
        }
        frag_item_listView = rootView.findViewById(R.id.frag_item_listView);
        img_itemtwofrag_load = rootView.findViewById(R.id.img_itemtwofrag_load);
    }

    @Override
    protected void lazyLoad() {
        img_itemtwofrag_load.setVisibility(View.VISIBLE);
        openA(getActivity(), img_itemtwofrag_load);
        handler.post(getDatas);


        frag_item_listView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if(newState == RecyclerView.SCROLL_STATE_IDLE ){
                    Log.i("getActivity()", "这里应该是一动不动的");
                    //这里滑动停止,开始加载可见项
                    System.out.println(firstItemPosition + "   " + lastItemPosition);
                    adapter.setScrolling(false);
                    adapter.notifyDataSetChanged();
                }else if(newState == RecyclerView.SCROLL_STATE_DRAGGING){
                    Log.i("getActivity()", "这里应该是开始滑动");
                    //这里做处理(停止加载一切事情)
                    adapter.setScrolling(true);
                }else if(newState == RecyclerView.SCROLL_STATE_SETTLING){
                    Log.i("getActivity()", "这里应该是手指离开屏幕的事件");
                    //

                }
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
                //判断是当前layoutManager是否为LinearLayoutManager
                // 只有LinearLayoutManager才有查找第一个和最后一个可见view位置的方法
                if (layoutManager instanceof LinearLayoutManager) {
                    LinearLayoutManager linearManager = (LinearLayoutManager) layoutManager;
                    //获取最后一个可见view的位置
                    lastItemPosition = linearManager.findLastVisibleItemPosition();
                    //获取第一个可见view的位置
                    firstItemPosition = linearManager.findFirstVisibleItemPosition();
                }
            }
        });

        //如果确定每个item的内容不会改变RecyclerView的大小,设置这个选项可以提高性能
        frag_item_listView.setHasFixedSize(true);
        frag_item_listView.setItemAnimator(new DefaultItemAnimator());

    }


    /**
     * 获取数据
     */
    Runnable getDatas = new Runnable() {
        @Override
        public void run() {
            switch (item_title){
                case "头条":
                    params = new HashMap<>();
                    params.put("key", APPKEY);
                    HttpRequest.post(HTTPURLS.toutiao, (HashMap<String, String>) params, new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                            e.printStackTrace();
                        }

                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            String reponse = response.body().string();
                            Log.i("getActivity()", "===" + reponse);
                            JsonDta(reponse);
                        }
                    });
                    break;
                case "社会":
                    params = new HashMap<>();
                    params.put("key", APPKEY);
                    HttpRequest.post(HTTPURLS.shehui, (HashMap<String, String>) params, new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                            e.printStackTrace();
                        }

                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            String reponse = response.body().string();
                            Log.i("getActivity()", "===" + reponse);
                            JsonDta(reponse);
                        }
                    });
                    break;
                case "国内":
                    params = new HashMap<>();
                    params.put("key", APPKEY);
                    HttpRequest.post(HTTPURLS.guonei, (HashMap<String, String>) params, new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                            e.printStackTrace();
                        }

                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            String reponse = response.body().string();
                            Log.i("getActivity()", "===" + reponse);
                            JsonDta(reponse);
                        }
                    });
                    break;
                case "国际":
                    params = new HashMap<>();
                    params.put("key", APPKEY);
                    HttpRequest.post(HTTPURLS.guoji, (HashMap<String, String>) params, new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                            e.printStackTrace();
                        }

                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            String reponse = response.body().string();
                            Log.i("getActivity()", "===" + reponse);
                            JsonDta(reponse);
                        }
                    });
                    break;
                case "娱乐":
                    params = new HashMap<>();
                    params.put("key", APPKEY);
                    HttpRequest.post(HTTPURLS.yule, (HashMap<String, String>) params, new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                            e.printStackTrace();
                        }

                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            String reponse = response.body().string();
                            Log.i("getActivity()", "===" + reponse);
                            JsonDta(reponse);
                        }
                    });
                    break;
                case "体育":
                    params = new HashMap<>();
                    params.put("key", APPKEY);
                    HttpRequest.post(HTTPURLS.tiyu, (HashMap<String, String>) params, new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                            e.printStackTrace();
                        }

                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            String reponse = response.body().string();
                            Log.i("getActivity()", "===" + reponse);
                            JsonDta(reponse);
                        }
                    });
                    break;
                case "军事":
                    params = new HashMap<>();
                    params.put("key", APPKEY);
                    HttpRequest.post(HTTPURLS.junshi, (HashMap<String, String>) params, new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                            e.printStackTrace();
                        }

                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            String reponse = response.body().string();
                            Log.i("getActivity()", "===" + reponse);
                            JsonDta(reponse);
                        }
                    });
                    break;
                case "科技":
                    params = new HashMap<>();
                    params.put("key", APPKEY);
                    HttpRequest.post(HTTPURLS.keji, (HashMap<String, String>) params, new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                            e.printStackTrace();
                        }

                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            String reponse = response.body().string();
                            Log.i("getActivity()", "===" + reponse);
                            JsonDta(reponse);
                        }
                    });
                    break;
                case "财经":
                    params = new HashMap<>();
                    params.put("key", APPKEY);
                    HttpRequest.post(HTTPURLS.caijing, (HashMap<String, String>) params, new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                            e.printStackTrace();
                        }

                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            String reponse = response.body().string();
                            Log.i("getActivity()", "===" + reponse);
                            JsonDta(reponse);
                        }
                    });
                    break;
                case "时尚":
                    params = new HashMap<>();
                    params.put("key", APPKEY);
                    HttpRequest.post(HTTPURLS.shishang, (HashMap<String, String>) params, new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                            e.printStackTrace();
                        }

                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            String reponse = response.body().string();
                            Log.i("getActivity()", "===" + reponse);
                            JsonDta(reponse);
                        }
                    });
                    break;
                    default :
                        break;
            }
        }
    };

    /**
     * 解析json数据
     * @param reponse
     */
    private void JsonDta(String reponse) {
        //创建对象接收返回的数据
        TwoFragData data = null;
        data = new Gson().fromJson(reponse, TwoFragData.class);
        if(data.getError_code() != 0){
            //模仿网络请求返回的参数
            Message message = handler.obtainMessage();
            message.arg1 = data.getError_code();
            handler.sendMessage(message);
        }else {
            for (int i = 0; i < data.getResult().getData().size(); i++){
                News newInfo = new News();
                newInfo.setUniquekey(data.getResult().getData().get(i).getUniquekey());
                newInfo.setTitle(data.getResult().getData().get(i).getTitle());
                newInfo.setDate(data.getResult().getData().get(i).getDate());
                newInfo.setCategory(data.getResult().getData().get(i).getCategory());
                newInfo.setAuthor_name(data.getResult().getData().get(i).getAuthor_name());
                newInfo.setDateilurl(data.getResult().getData().get(i).getUrl());
                newInfo.setThumbnail_pic_s(data.getResult().getData().get(i).getThumbnail_pic_s());
                newInfo.setThumbnail_pic_s02(data.getResult().getData().get(i).getThumbnail_pic_s02());
                newInfo.setThumbnail_pic_s03(data.getResult().getData().get(i).getThumbnail_pic_s03());
                datas.add(newInfo);
            }
            //模仿网络请求返回的参数
            Message message = handler.obtainMessage();
            handler.sendMessage(message);
        }
    }

    /**
     * 传值
     * @param item_title
     * @return
     */
    public static Frag_Two_Frag_Item getInstance(String item_title){
        Bundle bundle = new Bundle();
        bundle.putString(BUNDLE_TITLE, item_title);
        Frag_Two_Frag_Item frag_two_frag_item = new Frag_Two_Frag_Item();
        frag_two_frag_item.setArguments(bundle);
        return frag_two_frag_item;
    }

    @Override
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        if (!hidden) {
            StatusBarCompat.setStatusBarColor(getActivity(), ContextCompat.getColor(getContext(), R.color.cyan));
        }
    }

    /**
     * 开启一个动画
     * @param img
     */
    public static void openA(Activity activity, ImageView img){
        //加载loading动画
        rotateAnimation = AnimationUtils.loadAnimation(activity, R.anim.loading);
        LinearInterpolator interpolator = new LinearInterpolator();
        rotateAnimation.setInterpolator(interpolator);
        img.startAnimation(rotateAnimation);
    }

    private static Animation rotateAnimation;

}

FragTwoItemAdapter.class

public class FragTwoItemAdapter extends RecyclerView.Adapter<FragTwoItemAdapter.ViewHolder> {

    Activity context;

    List<News> data;

    LayoutInflater inflater;

    View view;

    /**
     * 图片缓存技术的核心类,用于缓存所有下载好的图片,在程序内存达到设定值时会将最少最近使用的图片移除掉。
     */
    LruCache<String, BitmapDrawable> mMemoryCache;


    public FragTwoItemAdapter(Activity activity, List<News> datas){
        this.context = activity;
        this.data = datas;
        inflater = LayoutInflater.from(activity);
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        view = LayoutInflater.from(parent.getContext()).inflate(R.layout.frag_two_frag_listview_item, parent, false);
        return new ViewHolder(view);
    }

    /** 标记是否正在滑动,如果为true,就暂停加载图片 */
    protected boolean isScrolling = false;

    /**
     * 赋值
     * @param scrolling
     */
    public void setScrolling(boolean scrolling) {
        isScrolling = scrolling;
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    public void onBindViewHolder(final ViewHolder viewHolder, int position) {
        //改变item的背景
        ChangeItemBG(viewHolder);

        viewHolder.txt_title.setText(data.get(position).getTitle());
        viewHolder.txt_content.setText(data.get(position).getAuthor_name());
        viewHolder.txt_time.setText(data.get(position).getDate());

        //图片加载框架
        Glide
                .with(context)
                .load(data.get(position).getThumbnail_pic_s())
                .placeholder(R.mipmap.default_image)
                .error(R.mipmap.default_image)
                .into(viewHolder.img_icon);

    }

    /**
     * 改变背景
     * @param viewHolder
     */
    private void ChangeItemBG(ViewHolder viewHolder) {
        viewHolder.txt_title.setBackgroundResource(R.color.transparent);
        viewHolder.txt_content.setBackgroundResource(R.color.transparent);
        viewHolder.txt_time.setBackgroundResource(R.color.transparent);
        RelativeLayout.LayoutParams txt_title = (RelativeLayout.LayoutParams) viewHolder.txt_title.getLayoutParams();
        txt_title.width = LinearLayout.LayoutParams.WRAP_CONTENT;
        txt_title.height = LinearLayout.LayoutParams.WRAP_CONTENT;
        viewHolder.txt_title.setLayoutParams(txt_title);
        LinearLayout.LayoutParams txt_content = (LinearLayout.LayoutParams) viewHolder.txt_content.getLayoutParams();
        txt_content.width = LinearLayout.LayoutParams.WRAP_CONTENT;
        txt_content.height = LinearLayout.LayoutParams.WRAP_CONTENT;
        viewHolder.txt_content.setLayoutParams(txt_content);
        LinearLayout.LayoutParams txt_time = (LinearLayout.LayoutParams) viewHolder.txt_time.getLayoutParams();
        txt_time.width = LinearLayout.LayoutParams.WRAP_CONTENT;
        txt_time.height = LinearLayout.LayoutParams.WRAP_CONTENT;
        viewHolder.txt_time.setLayoutParams(txt_time);
    }

    @Override
    public int getItemCount() {
        return data.size();
    }

    /**
     * //自定义的ViewHolder,持有每个Item的的所有界面元素
     */
    public class ViewHolder extends RecyclerView.ViewHolder {

        public TextView txt_title, txt_content, txt_time;
        public ImageView img_icon;
        public LinearLayout lin_all;

        public ViewHolder(View rootView) {
            super(rootView);
            this.lin_all = rootView.findViewById(R.id.lin_all);
            this.img_icon = rootView.findViewById(R.id.img_icon);
            this.txt_title = rootView.findViewById(R.id.txt_title);
            this.txt_content = rootView.findViewById(R.id.txt_content);
            this.txt_time = rootView.findViewById(R.id.txt_time);

            lin_all.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Linster.textItemOnClick(v, getPosition());
                }
            });
        }
    }

    public ItemOnClickLinster Linster;

    public void setLinster(ItemOnClickLinster linster) {
        Linster = linster;
    }

    public interface ItemOnClickLinster{
        void textItemOnClick(View view, int position);
    }


}

frag_two_frag_listview_item.xml

<?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="wrap_content"
    android:padding="@dimen/dimen_10_dip">

    <LinearLayout
        android:id="@+id/lin_all"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dimen_110_dip"
        android:orientation="horizontal">

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="match_parent">

            <ImageView
                android:id="@+id/img_icon"
                android:layout_width="@dimen/dimen_85_dip"
                android:layout_height="@dimen/dimen_85_dip"
                android:layout_gravity="center"
                android:baselineAligned="false"
                android:contentDescription="TODO"
                android:scaleType="fitXY"
                android:src="@mipmap/default_image" />

        </LinearLayout>

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="@dimen/dimen_85_dip"
            android:layout_marginLeft="@dimen/dimen_10_dip"
            android:orientation="vertical"
            android:layout_gravity="center">

            <TextView
                android:id="@+id/txt_title"
                android:layout_width="@dimen/dimen_100_dip"
                android:layout_height="wrap_content"
                android:layout_alignParentStart="true"
                android:layout_alignParentTop="true"
                android:background="@color/gainsboro"
                android:textColor="@color/black"
                android:textSize="@dimen/dimen_18_dip" />

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_alignParentStart="true"
                android:orientation="horizontal">

                <TextView
                    android:id="@+id/txt_content"
                    android:layout_width="@dimen/dimen_120_dip"
                    android:layout_height="wrap_content"
                    android:background="@color/gainsboro"
                    android:gravity="center"
                    android:textColor="@color/black"
                    android:textSize="@dimen/dimen_14_dip" />

                <TextView
                    android:id="@+id/txt_time"
                    android:layout_width="@dimen/dimen_150_dip"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="@dimen/dimen_15_dip"
                    android:background="@color/gainsboro"
                    android:gravity="center"
                    android:textColor="@color/black"
                    android:textSize="@dimen/dimen_14_dip" />

            </LinearLayout>

        </RelativeLayout>

    </LinearLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="@dimen/dimen_0.5_dip"
        android:background="@color/gainsboro" />

</LinearLayout>

其实吧,整个功能没有难懂的地方,只要理解了代码,换到自己的项目里面能够熟练的使用就可以,可以根据不同的需求去定制不同的实现方式,而这里的这种方式只是一种,给大家借鉴一下而已,同时有什么好方法也可以给我推荐下,代码的不足也可以指出!!

附上demo源码,因不太熟练GitHub,所以这里的链接还是csdn的。

点这里下载源码,快,戳我戳我…

本文引用GitHub的刷新框架,不拥有解释权,如果想进一步了解刷新框架,请前往下面的地址阅读
https://github.com/scwang90/SmartRefreshLayout

q:486789970
email:[email protected]

如果有什么问题,欢迎大家指导。并相互联系,希望能够通过文章互相学习。

												---财财亲笔

猜你喜欢

转载自blog.csdn.net/qq_35840038/article/details/85231596