android 基於天狗網開放平臺的新聞app

偶然在一個QQ羣看到有學生在問關於這個平臺的事,剛好無聊就登錄看了一下。剛好自己自學android到了一個瓶頸。就寫了一個基於這個平臺的新聞app,平臺是免費,而且講解的很詳細,有時候第一次打開比較慢,多試幾次等等就好了。這是平臺的地址:

http://www.tngou.net/
下面是接口:
http://www.tngou.net/blog/show/1296

向提供免費平臺的前輩致敬!

目前我已經實現的功能有:
讀取最新的新聞列表(最近好像新聞列表很久沒更新了。不過原來的能讀取,用來學習已經夠了)
讀取新聞的內容
讀取相關評論
賬號註冊,賬號登錄,個人信息設置(這裏偷懶了,個人信息設置點擊後直接跳轉到網站去了。。。)

這個項目適合新手練習,涉及和服務端的數據交互以及數據解析。不足之處是界面比較挫,沒有框架可言,所以越寫到後面代碼耦合度越高,邏輯比較混亂。
這裏寫圖片描述

因爲圖片只能2M,所以只錄了一部分。

項目構造:
這裏寫圖片描述

Account 主要是賬號登錄,註冊,以及個人信息修改
Adapter包含兩個適配器,一個是評論列表的適配器,一個是新聞列表的適配器
GetContext 用來在像某種獲取Context對象
ImageCache 圖像緩存,計劃用來將圖片緩存到本地,就不用每次打開app都要去服務端下載圖片,功能還沒添加
JSON JSON數據解析

CommentsActivity 評論列表相關邏輯操作
ItemActivity 新聞內容界面相關邏輯操作
MainActivity 主題框架邏輯事件以及新聞列表邏輯事件,大部分UI刷新
RecyclerItem 新聞類 包含一條新聞的基本信息

每個類裏面都有詳細的註釋,不多說了。下面貼出來MainActivity :


/**
 * 主頁 app第一頁
 */
public class MainActivity extends AppCompatActivity {

    private String PATH = "http://www.tngou.net/api/top/list";//熱點詞api,通過獲取熱點詞彙的id獲取熱詞詳情
    private RecyclerView recyclerView;  //新聞列表
    private DrawerLayout drawerLayout;  //抽屜視圖
    private NavigationView navigationView; //導航視圖
    private SwipeRefreshLayout swipeRefreshLayout; //下拉刷新
    private FloatingActionButton actionButton; //懸浮按鈕
    private RecyclerAdapter adapter; //新聞列表適配器
    private CircleImageView circleImageView;//頭像
    private TextView individuality_text;//個性簽名
    private List<RecyclerItem> list_items = new ArrayList<>(); //新聞列表子項
    private User user; //用戶信息獲取類
    private String domain = null;    //用戶主頁域名
//    private String access_token = null;//訪問令牌
    private static int[] image_ID = {R.drawable.aa, R.drawable.bb, R.drawable.cc, R.drawable.dd, R.drawable.ee, R.drawable.ff, R.drawable.gg, R.drawable.hh, R.drawable.ii,
            R.drawable.jj, R.drawable.kk, R.drawable.ll, R.drawable.mm, R.drawable.nn, R.drawable.bb, R.drawable.cc, R.drawable.dd, R.drawable.ee, R.drawable.ff, R.drawable.gg};

    public static int get_Image_ID() {   //爲沒有圖片的新聞隨機一個圖片
        Random random = new Random();
        return image_ID[random.nextInt(image_ID.length)];
    }

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);       //網絡數據獲取後通過message發送給UI線程
            switch (msg.what) {
                case 1:   //新聞列表
                    JSON json = new JSON();
                    json.withJSONObject(msg.getData().getString("JSON_data"));   //JSON數據解析
                    List<String> list_img = json.getImg_list(); // 新聞圖片地址
                    List<String> list_title = json.getList_title(); //新聞標題
                    List<String> list_description = json.getList_description(); //新聞摘要
                    List<Long> list_ID = json.getList_ID(); //新聞詳情地址
                    for (int i = 0; i < list_img.size(); i++) {
                        list_items.add(new RecyclerItem(list_title.get(i), list_img.get(i), list_description.get(i), list_ID.get(i)));
                    }
                    adapter.notifyDataSetChanged();  //通知適配器數據更新
                    break;
                case 2: //顯示個人信息
                    individuality_text.setText(user.getSignature());
                    Glide.with(MainActivity.this).load("http://tnfs.tngou.net/img" + user.getAvatar()).into(circleImageView);
                    domain = user.getDomain();
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);  //設置自定義tab
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);//顯示HomeAsUp鍵
            actionBar.setHomeAsUpIndicator(R.drawable.ic_menu);  //設置HomeAsUp鍵圖標
        }
        drawerLayout = (DrawerLayout) findViewById(R.id.activity_main);
        navigationView = (NavigationView) findViewById(R.id.navigation_view);
        navigationView.setCheckedItem(R.id.nav_call); //設置導航視圖默認選中項
        //導航視圖子項事件監聽
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.nav_task://切換到賬號註冊
                        AccountOperation accountOperation = new AccountOperation(MainActivity.this, new UserLoginCallback() {
                            @Override
                            public void LoginSuccessful(String access_token, String refresh_token) { // 註冊成功,反饋回access_token訪問令牌 refresh_token 刷新令牌
                                user = new User(access_token, null, handler); // 子線程從服務器獲取到用戶個人信息,發送一個msg
//                                MainActivity.this.access_token = access_token;
                            }

                            @Override
                            public void loginFailed(String msg) { //註冊失敗服務端反饋的消息

                            }
                        });
                        break;
                    case R.id.nav_mail://切換到賬號登錄
                        AccountLogin accountLogin = new AccountLogin(MainActivity.this, new UserLoginCallback() {
                            @Override
                            public void LoginSuccessful(String access_token, String refresh_token) {//登錄成功,反饋回來access_token訪問令牌 refresh_token 刷新令牌
                                user = new User(access_token, null, handler); // 子線程從服務器獲取到用戶個人信息,發送一個msg
//                                MainActivity.this.access_token = access_token;
                            }

                            @Override
                            public void loginFailed(String msg) {//登錄失敗服務端反饋的消息
                            }
                        });
                        break;
                }
                return true;
            }
        });

//        headerLayout = navigationView.inflateHeaderView(R.layout.nav_header_main);//加載頭部view
        View headerView = navigationView.getHeaderView(0);//獲得頭部View
        circleImageView = (CircleImageView) headerView.findViewById(R.id.head_portrait);
        circleImageView.setOnClickListener(new View.OnClickListener() { //點擊用戶頭像 進入個人資料頁面
            @Override
            public void onClick(View view) {//頭像點擊事件監聽
                if (domain == null) {//如果domain爲空 則先登錄
                    AccountLogin accountLogin = new AccountLogin(MainActivity.this, new UserLoginCallback() {
                        @Override
                        public void LoginSuccessful(String access_token, String refresh_token) {//登錄成功,反饋回來access_token訪問令牌 refresh_token 刷新令牌
                            user = new User(access_token, null, handler); // 子線程從服務器獲取到用戶個人信息,發送一個msg
//                            MainActivity.this.access_token = access_token;
                        }

                        @Override
                        public void loginFailed(String msg) {//登錄失敗服務端反饋的消息
                        }
                    });
                } else {
                    Intent intent = new Intent(MainActivity.this, UserInformation.class);
                    intent.putExtra("path", "http://www.tngou.net/my/"+domain);
                    MainActivity.this.startActivity(intent);
                }
            }
        });
        individuality_text = (TextView) headerView.findViewById(R.id.individuality_signature);
        circleImageView.setImageResource(R.drawable.bb);//默認頭像
        individuality_text.setText("我在等待,一個有你的未來!");//默認簽名
        actionButton = (FloatingActionButton) findViewById(R.id.FAButton);//懸浮按鈕設置及事件監聽
        actionButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "懸浮按鈕,功能待添加", Snackbar.LENGTH_LONG).setAction("確定", new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Toast.makeText(MainActivity.this, "點擊懸浮按鈕", Toast.LENGTH_SHORT).show();
                    }
                }).show();
            }
        });
        data_init(); //新聞數據初始化(包括加載網絡數據)
        recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        adapter = new RecyclerAdapter(list_items);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.setAdapter(adapter);//recyclerView相關設置
        swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe);
        swipeRefreshLayout.setColorSchemeResources(R.color.colorPrimary);
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                data_init();//下拉刷新數據
                swipeRefreshLayout.setRefreshing(false);
            }
        });
    }

    public void data_init() {
        HttpUtil.sendHttpRequest(PATH, new HttpCallbackListener() {//加載網絡數據並將數據通過msg發送到UI線程
            @Override
            public void onFinish(final String response) {
                Bundle bundle = new Bundle();
                bundle.putString("JSON_data", response);
//                Message msg = new Message();
                Message msg = Message.obtain();
                msg.setData(bundle);
                msg.what = 1;
                handler.sendMessage(msg);
            }

            @Override
            public void onError(Exception e) {
                Toast.makeText(MainActivity.this, "數據請求失敗", Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.toolbar, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) { //菜單選項點擊監聽
        switch (item.getItemId()) {
            case R.id.ic_backup:
                Toast.makeText(this, "" + item.getTitle(), Toast.LENGTH_SHORT).show();
                break;
            case R.id.ic_comment:
                Toast.makeText(this, "" + item.getTitle(), Toast.LENGTH_SHORT).show();
                break;
            case android.R.id.home:
                drawerLayout.openDrawer(GravityCompat.START);
                break;
        }
        return true;
    }
}

整個項目上傳到了github:https://github.com/Guojiankai/news
歡迎交流指正!

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