Toolbar、TabLayout、ViewPager(Json解析版)

来源:互联网 发布:古希腊神话 知乎 编辑:程序博客网 时间:2024/05/20 05:23

这里写图片描述

布局

// 开权限    <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 0
原创粉丝点击