手把手帶你擼一個校園APP(五):新聞中心模塊

這個項目是很早之前在學校做的,如今再回首点骑。很多代碼很是粗糙酣难,邏輯也不盡完善谍夭。還望各位看官海涵。

前言

通過上一篇文章的功能設計憨募,我們可以發(fā)現(xiàn)新聞通知公告等是APP的最主要功能點紧索。主要是聚合展示學校官網(wǎng)的通知公告,官方微信菜谣,微博的重要信息珠漂,學校社團的活動,以及學校優(yōu)秀自媒體的文章等等。

系列文章:

  1. 手把手帶你擼一個校園APP(一):項目簡介
  2. 手把手帶你擼一個校園APP(二):應用啟動和歡迎頁面
  3. 手把手帶你擼一個校園APP(三):用戶模塊(登錄注冊等)
  4. 手把手帶你擼一個校園APP(四):APP框架及功能設計
  5. 手把手帶你擼一個校園APP(五):新聞中心模塊
  6. 手把手帶你擼一個校園APP(六):失物招領&二手交易模塊
  7. 手把手帶你擼一個校園APP(七):圖說校園模塊
  8. 手把手帶你擼一個校園APP(八):校園通訊錄模塊
  9. 手把手帶你擼一個校園APP(九):課程表模塊(模擬登陸爬取教務處課程信息)
  10. 手把手帶你擼一個校園APP(十):APP通用模塊(更新,意見反饋等)

實現(xiàn)效果

新聞部分主要是分了“通知公告”憨攒,“新聞速遞”,“自媒體”待笑,“校園文化”四個欄目,之間可以通過左右滑動進行切換抓谴。效果圖如下:


科師有約新聞模塊

分析

其實這是挺常見的一個新聞資訊模塊滋觉。我們也可以輕易得出以下內(nèi)容:

  1. 新聞條目 一般都有標題,配圖齐邦,作者,發(fā)表時間等組成第租。我們的新聞只是聚合展示使用措拇,可以外加一個資訊鏈接;
  2. 配圖數(shù)量并不一致慎宾,有無圖的丐吓,1 張配圖的,以及 3 張配圖的趟据。我們需要根據(jù)配圖的數(shù)量進行不同布局的設置券犁;
  3. 新聞列表應該擁有下拉刷新,上拉加載的功能汹碱。

實現(xiàn)

本項目基于Bmob進行開發(fā)粘衬,很多地方需要Bmob相關(guān)知識。大家如果沒了解過的話咳促,可先自行查看 Bmob開發(fā)文檔 稚新。

數(shù)據(jù)庫

當初設計數(shù)據(jù)庫字段的時候,很多東西都為了簡單跪腹,沒有做更合理的規(guī)劃褂删。字段如下:

字段名 描述 類型 主鍵
objectId 用戶id String
title 標題 String
author 作者 String
time 發(fā)布時間 String
kind 欄目分類 String
content 內(nèi)容鏈接 String
pic1 縮略圖一 String
pic2 縮略圖二 String
pic3 縮略圖三 String
tag 布局樣式(圖片數(shù)量) String

大家如果自己從頭來的話,建議適當更改部分字段的類型以及組合方式冲茸,會更合理些屯阀。比如time改為時間類型缅帘,圖片改為列表等。本文暫且不表难衰。

安卓

邏輯流程講解

本模塊邏輯設計如下:

  1. 使用CoordinatorTabLayout + ViewPager + Fragment 完成新聞模塊主頁面的顯示钦无;
  2. Fragment 進行網(wǎng)絡請求,獲取新聞數(shù)據(jù)并展示召衔,使用 RecyclerView 展示新聞列表铃诬,根據(jù)縮略圖數(shù)量對應3種條目布局;
  3. 新聞詳情頁面使用WebView 用于展示新聞詳情苍凛。

代碼實現(xiàn)

在這里為了能快速開發(fā)趣席,我們使用了 CoordinatorTabLayout 。

文章:CoordinatorTabLayout組件庫
Github地址:CoordinatorTabLayout
作者:hugeterry

使用 CoordinatorTabLayout 搭建新聞主頁面

使用步驟如下:

  1. 在 app 的 build.gradle 中添加依賴
dependencies {
    implementation 'cn.hugeterry.coordinatortablayout:coordinatortablayout:1.2.2'
}
  1. 布局文件中使用
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <cn.hugeterry.coordinatortablayout.CoordinatorTabLayout
        android:id="@+id/cootablayout_news"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v4.view.ViewPager
            android:id="@+id/vp_news"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />
    </cn.hugeterry.coordinatortablayout.CoordinatorTabLayout>

</RelativeLayout>
  1. 在 java 代碼中使用
// 四個欄目標題
String[] mTitles = {"通知公告", "新聞速遞", "自媒體", "校園文化"}
// 初始化 Fragment 列表
ArrayList<Fragment> mFragments = new ArrayList<>();
mFragments.add(MainFragment1.getInstance(mTitles[0]));
mFragments.add(MainFragment2.getInstance(mTitles[1]));
mFragments.add(MainFragment3.getInstance(mTitles[2]));
mFragments.add(MainFragment4.getInstance(mTitles[3]));

// 設置Viewpager
mViewPager.setOffscreenPageLimit(4);
mViewPager.setAdapter(new MyPagerAdapter(getChildFragmentManager(), mFragments, mTitles));

// 設置頂部 展開后 4 張背景圖
mImageArray = new int[]{
        R.mipmap.keshi1,
        R.mipmap.keshi4,
        R.mipmap.img_bg_news3,
        R.mipmap.img_bg_news4};
// 設置頂部 收縮后 4 種背景色
mColorArray = new int[]{
        android.R.color.holo_blue_light,
        android.R.color.holo_red_light,
        android.R.color.holo_orange_light,
        android.R.color.holo_green_light};
// 設置 CoordinatorTabLayout 屬性
mCoordinatorTabLayout.setTransulcentStatusBar(mActivity)
        .setTitle("")
        .setImageArray(mImageArray, mColorArray)
        .setupWithViewPager(mViewPager);
網(wǎng)絡請求醇蝴,數(shù)據(jù)填充
  1. 建立數(shù)據(jù)庫對應表 bean 類
public class NewsBean extends BmobObject {
    private String title;
    private String author;
    private String time;
    private String tag;
    private String pic1;
    private String pic2;
    private String pic3;
    private String content;
    
    // ....get set 方法
}
  1. 網(wǎng)絡請求數(shù)據(jù)宣肚,并填充
mAdapter = new NNNAdapter();
newsBeanList = new ArrayList<>();
BmobQuery<NewsBean> query = new BmobQuery<NewsBean>();
query.order("-time");
// kind: [a="通知公告", b="新聞速遞", c="自媒體", d="校園文化"]
query.addWhereEqualTo("kind", "a");
query.setLimit(10);
query.findObjects(new FindListener<NewsBean>() {
    @Override
    public void done(List<NewsBean> object, BmobException e) {
        if (e == null) {
            for (NewsBean newsBean : object) {
                newsBeanList.add(newsBean);
                LogUtils.e(newsBean.getAuthor());
            }
            mAdapter.setData(newsBeanList);
        } else {
        }
    }
});
mRecyclerView.setAdapter(mAdapter);
  1. 圖片數(shù)量不同對應不同的布局
public class NewsBean extends BmobObject implements IMultiItem {

    @Override
    public int getLayoutRes() {
        if ("3".equals(tag)) {
            return R.layout.item_news_type3;
        } else if ("2".equals(tag)) {
            return R.layout.item_news_type2;
        } else {
            return R.layout.item_news_type1;
        }
    }
    // 省略其它...
}
  1. 新聞詳情頁面
    Fragment 中給 RecycleView 設置點擊事件,傳遞網(wǎng)址到詳情Activity
mAdapter.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(@NonNull View view, int position) {
        Intent intent = new Intent(getActivity(), NewsWebActivity.class);
        intent.putExtra("url", newsBeanList.get(position).getContent());
        startActivity(intent);
    }
});

網(wǎng)頁詳情頁面 NewsActivity 中只有一個WebView悠栓。接收上個頁面?zhèn)鬟f過來的參數(shù)霉涨,并且展示頁面。這里做了一些初始化操作惭适,大家在別處需要的話笙瑟,也可以直接復制過去

String url = getIntent().getStringExtra("url");
if (TextUtils.isEmpty(url)) {
    Toast.makeText(this, "該新聞已經(jīng)失效!", Toast.LENGTH_SHORT).show();
    return;
}
MyWebViewClient myWebViewClient = new MyWebViewClient();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    wvNews.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
wvNews.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);//設置js可以直接打開窗口癞志,如window.open()往枷,默認為false
wvNews.getSettings().setJavaScriptEnabled(true);//是否允許執(zhí)行js,默認為false凄杯。設置true時错洁,會提醒可能造成XSS漏洞
wvNews.getSettings().setSupportZoom(true);//是否可以縮放,默認true
wvNews.getSettings().setBuiltInZoomControls(true);//是否顯示縮放按鈕戒突,默認false
wvNews.getSettings().setUseWideViewPort(true);//設置此屬性屯碴,可任意比例縮放。大視圖模式
wvNews.getSettings().setLoadWithOverviewMode(true);//和setUseWideViewPort(true)一起解決網(wǎng)頁自適應問題
wvNews.getSettings().setAppCacheEnabled(true);//是否使用緩存
wvNews.getSettings().setDomStorageEnabled(true);//DOM Storage
wvNews.setWebChromeClient(new WebChromeClient());
wvNews.setWebViewClient(myWebViewClient);
wvNews.loadUrl(url);

// ....
private class MyWebViewClient extends WebViewClient {
    //重寫父類方法膊存,讓新打開的網(wǎng)頁在當前的WebView中顯示
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
}

至此导而,新聞模塊頁面基本完成。還有就是本文挺長的膝舅,很感謝你可以看到這里嗡载。

如果本文對你有所幫助,還望可以隨手賞一個點贊哈 ~ ~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仍稀,一起剝皮案震驚了整個濱河市洼滚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌技潘,老刑警劉巖遥巴,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件千康,死亡現(xiàn)場離奇詭異,居然都是意外死亡铲掐,警方通過查閱死者的電腦和手機拾弃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摆霉,“玉大人豪椿,你說我怎么就攤上這事⌒埃” “怎么了搭盾?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長婉支。 經(jīng)常有香客問我鸯隅,道長,這世上最難降的妖魔是什么向挖? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任蝌以,我火速辦了婚禮,結(jié)果婚禮上何之,老公的妹妹穿的比我還像新娘跟畅。我一直安慰自己,他們只是感情好溶推,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布碍彭。 她就那樣靜靜地躺著,像睡著了一般悼潭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舞箍,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天舰褪,我揣著相機與錄音,去河邊找鬼疏橄。 笑死占拍,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的捎迫。 我是一名探鬼主播晃酒,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼窄绒!你這毒婦竟也來了贝次?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤彰导,失蹤者是張志新(化名)和其女友劉穎蛔翅,沒想到半個月后敲茄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡山析,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年堰燎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笋轨。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡秆剪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出爵政,到底是詐尸還是另有隱情仅讽,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布茂卦,位于F島的核電站何什,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏等龙。R本人自食惡果不足惜处渣,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蛛砰。 院中可真熱鬧罐栈,春花似錦、人聲如沸泥畅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽位仁。三九已至柑贞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間聂抢,已是汗流浹背钧嘶。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留琳疏,地道東北人有决。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像空盼,于是被迫代替她去往敵國和親书幕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容