布局
// 开权限
<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 的实现一样)。这么实现的好处就是当拥有大量的页面时,不必在内存中占用大量的内存。