Toolbar、TabLayout、ViewPager(Json解析版)

这里写图片描述

布局

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

<LinearLayout 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:orientation="vertical"
    tools:context="com.example.lenovo.month08_test_health.MainActivity">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?android:actionBarSize"
        android:background="#82d844" />

    <android.support.design.widget.TabLayout
        android:id="@+id/tab_layou"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#ffffff"
        app:tabIndicatorColor="#82d844"
        app:tabMode="scrollable"
        app:tabSelectedTextColor="#82d844"
        app:tabTextColor="#000" />

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#bebcbc" />

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

</LinearLayout>

Activity

import android.graphics.Color;
import android.os.Handler;
import android.os.Message;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;

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

public class MainActivity extends AppCompatActivity {
    private Toolbar toolbar;
    private TabLayout tabLayout;
    private ViewPager viewPager;
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case Path.DOWNLOADSUCCESS:
                    initViews(msg);
                    break;
                case Path.DOWNLOADFAILED:
                    break;
            }
        }
    };

    private void initViews(Message msg) {
        List<Fragment> fragments = new ArrayList<>();
        List<ClassifyBean> beanList = (List<ClassifyBean>) msg.obj;
        for (int i = 0; i < beanList.size(); i++) {
            ClassifyBean bean = beanList.get(i);
            fragments.add(BeanFragment.getBundle(bean.getId()));
        }
        BeanAdapter adapter = new BeanAdapter(getSupportFragmentManager(), beanList, fragments);
        viewPager.setAdapter(adapter);
        // 对应的内容显示到TabLayout上
        tabLayout.setupWithViewPager(viewPager);
    }

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

        init();
    }

    private void init() {
        // 自己建立工具栏
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        toolbar.setTitle("健康资讯");
        toolbar.setTitleTextColor(Color.BLUE);
        setSupportActionBar(toolbar);

        tabLayout = (TabLayout) findViewById(R.id.tab_layou);
        viewPager = (ViewPager) findViewById(R.id.view_pager);

        initView();
    }

    private void initView() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 传入网址进行解析
                String json = HttpUtil.getHttp(Path.CLASSFYURL);
                if (json != null && !"".equals(json)) {
                    List<ClassifyBean> beanList = JsonUtil.getJsonClassify(json);
                    Message msg = handler.obtainMessage();
                    msg.what = Path.DOWNLOADSUCCESS;
                    msg.obj = beanList;
                    handler.sendMessage(msg);
                }
            }
        }).start();
    }
}

HTTP与JSON解析

// 此块都没什么太多注释,上篇有些说明
public class HttpUtil {

    public static String getHttp(String jsonUrl) {
        HttpURLConnection conn = null;
        BufferedReader reader = null;
        StringBuffer buffer = new StringBuffer();
        try {
            URL url = new URL(jsonUrl);
            conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(5000);
            conn.connect();
            if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                String result;
                while ((result = reader.readLine()) != null) {
                    buffer.append(result);
                }
                return buffer.toString();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            if (conn != null){
                conn.disconnect();
            }
            if (reader != null){
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
}
public class JsonUtil {
    public static List<ClassifyBean> getJsonClassify(String json) {
        List<ClassifyBean> bean = new ArrayList<>();
        try {
            JSONObject jo = new JSONObject(json);
            JSONArray tngou = jo.getJSONArray("tngou");
            for (int i = 0; i < tngou.length(); i++) {
                JSONObject data = tngou.getJSONObject(i);
                String description = data.getString("description");
                String keywords = data.getString("keywords");
                String name = data.getString("name");
                String title = data.getString("title");
                int foodclass = data.getInt("foodclass");
                int id = data.getInt("id");
                int seq = data.getInt("seq");
                ClassifyBean classifyBean = new ClassifyBean(description, foodclass, id, keywords, name, seq, title);
                bean.add(classifyBean);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return bean;
    }
}

FragmentPagerAdapter

// FragmentPagerAdapter 来处理多 Fragment 页面的横向滑动。
// 结合 ViewPager 使用
public class BeanAdapter extends FragmentPagerAdapter {
    private List<ClassifyBean> beanList;
    private List<Fragment> fragments;

    public BeanAdapter(FragmentManager fm, List<ClassifyBean> beanList, List<Fragment> fragments) {
        super(fm);
        this.beanList = beanList;
        this.fragments = fragments;
    }

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

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

    @Override
    public CharSequence getPageTitle(int position) {
        // 显示在TabLayout 上的内容,我们只要name信息
        return beanList.get(position).getName();
    }
}

Fragement

public class BeanFragment extends Fragment {
    // 定义回调方法
    public static BeanFragment getBundle(int id) {
        BeanFragment fragment = new BeanFragment();
        Bundle bundle = new Bundle();
        bundle.putInt("id", id);
        // 传入参数
        fragment.setArguments(bundle);
        return fragment;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        // 获取参数
        Bundle bundle = getArguments();
        int id = bundle.getInt("id");
        TextView tv = new TextView(getActivity());
        tv.setText(id + "");
        return tv;
    }
}

FragmentStatePagerAdapter和FragmentPagerAdapter 区别

【FragmentPagerAdapter】

FragmentPagerAdapter 继承自 PagerAdapter。相比通用的 PagerAdapter,该类更专注于每一页均为 Fragment 的情况。如文档所述,该类内的每一个生成的 Fragment 都将保存在内存之中,因此适用于那些相对静态的页,数量也比较少的那种;如果需要处理有很多页,并且数据动态性较大、占用内存较多的情况,应该使用FragmentStatePagerAdapter。FragmentPagerAdapter 重载实现了几个必须的函数,因此来自 PagerAdapter 的函数,我们只需要实现 getCount(),即可。且,由于 FragmentPagerAdapter.instantiateItem() 的实现中,调用了一个新增的虚函数 getItem(),因此,我们还至少需要实现一个 getItem()。因此,总体上来说,相对于继承自 PagerAdapter,更方便一些。

【FragmentStatePagerAdapter】

FragmentStatePagerAdapter 和前面的 FragmentPagerAdapter 一样,是继承子 PagerAdapter。但是,和 FragmentPagerAdapter 不一样的是,正如其类名中的 ‘State’ 所表明的含义一样,该 PagerAdapter 的实现将只保留当前页面,当页面离开视线后,就会被消除,释放其资源;而在页面需要显示时,生成新的页面(就像 ListView 的实现一样)。这么实现的好处就是当拥有大量的页面时,不必在内存中占用大量的内存。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pluto_Min8

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值