首先是Fragment嵌套一個包含listview的fragment。
參考文章:Fragment嵌套Fragment實現多tab頁面的效果
在父fragemnt的oncreateview裏面給父fragment添加子fragment,具體步驟如下:
1.獲取fragmentmanager,但是是使用getChildFragmentManager()
返回,賦值給viewpageadapter。
MyPagerAdapter adapter = new MyPagerAdapter(getChildFragmentManager());
2.重寫viewpageadapter
public static class MyPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragments = new ArrayList<>();
private final List<String> mFragmentTitles = new ArrayList<>();
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
public void addFragment(Fragment fragment, String title) {
mFragments.add(fragment);
mFragmentTitles.add(title);
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return mFragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitles.get(position);
}
}
3.定義新的子fragment,加入adapter列表即可。
改寫後的NewsFragment:
public class NewsFragment extends Fragment {
private TabLayout mTablayout;
private ViewPager mViewPager;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_news, null);
mTablayout = (TabLayout) view.findViewById(R.id.tab_layout);
mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
mViewPager.setOffscreenPageLimit(3);
MyPagerAdapter adapter = new MyPagerAdapter(getChildFragmentManager());
TestFragment fg1 = new TestFragment();
Bundle args1 = new Bundle();
args1.putString("text", "第1個Fragment");
fg1.setArguments(args1);
TestFragment fg2 = new TestFragment();
Bundle args2 = new Bundle();
args2.putString("text", "第2個Fragment");
fg2.setArguments(args2);
TestFragment fg3 = new TestFragment();
Bundle args3 = new Bundle();
args3.putString("text", "第3個Fragment");
fg3.setArguments(args3);
TestFragment fg4 = new TestFragment();
Bundle args4 = new Bundle();
args4.putString("text", "第4個Fragment");
fg4.setArguments(args4);
adapter.addFragment(fg1, getString(R.string.top));
adapter.addFragment(fg2, getString(R.string.nba));
adapter.addFragment(fg3, getString(R.string.jokes));
adapter.addFragment(fg4, getString(R.string.cars));
mViewPager.setAdapter(adapter);
mTablayout.addTab(mTablayout.newTab().setText(R.string.top));
mTablayout.addTab(mTablayout.newTab().setText(R.string.nba));
mTablayout.addTab(mTablayout.newTab().setText(R.string.cars));
mTablayout.addTab(mTablayout.newTab().setText(R.string.jokes));
mTablayout.setupWithViewPager(mViewPager);
return view;
}
public static class MyPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragments = new ArrayList<>();
private final List<String> mFragmentTitles = new ArrayList<>();
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
public void addFragment(Fragment fragment, String title) {
mFragments.add(fragment);
mFragmentTitles.add(title);
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return mFragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitles.get(position);
}
}
}
test_fragment:
public class TestFragment extends Fragment {
String text;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.test_fragment, null);
TextView textView = (TextView) view.findViewById(R.id.text_1);
Bundle args = getArguments();
if (args != null) {
text = args.getString("text");
}
textView.setText(text);
return view;
}
}
測試:
新聞信息獲取:
關於這個可以去抓包或者使用爬蟲的方式獲取數據。我這裏去百度API找一個新聞類的api使用。
原作者使用okhttp這個庫訪問網絡。其實無所謂,使用其他網絡框架也是一樣的。
我不想使用框架,就是用基本的的HttpURLConnection訪問網絡。
具體沒什麼介紹的,最基本的get請求。獲得json包進行解析。
獲取JsonCode:
public class HttpUtils {
public static String urlConnget(String uri) {
String content = "";
try {
URL url = new URL(uri);
HttpURLConnection httpconn = (HttpURLConnection) url.openConnection();
httpconn.setRequestMethod("GET");
httpconn.setRequestProperty("apikey", "你的apikey");
httpconn.connect();
if (httpconn.getResponseCode() == HttpURLConnection.HTTP_OK) {
InputStreamReader isr = new InputStreamReader(httpconn.getInputStream(), "utf-8");
int i;
// read
while ((i = isr.read()) != -1) {
content = content + (char) i;
}
isr.close();
Log.d("xxxx", content);
return content;
}
httpconn.disconnect();
} catch (Exception e) {
Log.d("xxxx", e.toString());
e.printStackTrace();
}
return content;
}
}
解析json:
public class JsonUtils {
public static List<News> NewslistData(String jsonstring) {
List<News> newsList = new ArrayList<News>();
try {
JSONObject jsonObject = new JSONObject(jsonstring);
int resultCode = jsonObject.getInt("code");
if (resultCode == 200) {
//獲取新聞列表
JSONArray resultJsonArray = jsonObject.getJSONArray("newslist");
//循環列表
for (int i = 0; i < resultJsonArray.length(); i++) {
News news = new News();
JSONObject resultJsonObject = resultJsonArray.getJSONObject(i);
news.setTitle(resultJsonObject.getString("title"));
news.setCtime(resultJsonObject.getString("ctime"));
news.setDescription(resultJsonObject.getString("description"));
news.setPicurl(resultJsonObject.getString("picUrl"));
news.setUrl(resultJsonObject.getString("url"));
newsList.add(news);
}
return newsList;
}
} catch (Exception e) {
e.printStackTrace();
}
return newsList;
}
}
數據填入Fragment:
在fragment裏寫一個listview:
這裏使用了volley這個框架來加載網絡圖片:
RequestQueue mQueue = Volley.newRequestQueue(getContext());
ImageLoader imageLoader = new ImageLoader(mQueue, new ImageLoader.ImageCache() {
@Override
public void putBitmap(String url, Bitmap bitmap) {
}
@Override
public Bitmap getBitmap(String url) {
return null;
}
});
networkImageView.setDefaultImageResId(R.mipmap.ic_launcher);
networkImageView.setErrorImageResId(R.mipmap.ic_launcher);
networkImageView.setImageUrl(news.getPicurl(),
imageLoader);
具體效果如下: