Android實戰簡單新聞客戶端(3)---網絡數據請求,json包解析

首先是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);

具體效果如下:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章