毕设.基本完善版

完成了一组文章(综合)的显示,继续的工作就是要显示文章区的五类热门了。
本篇依赖的爬虫脚本
既然要显示五类,从上一回走过来,那自然最容易想到用五个ListView一一显示了。在衍生出来的想法有a.通过ViewPager、TabLayout、BottomNavigationBar等进行按键分页显示,b.通过ScrollView纵向滑动显示,由于当时第一个安卓项目也是急功近利,直接网上搜罗下来的蓝牙项目,导致吃了布局的亏,a方法实现起来有点繁琐;b方法看似简单然而只是简单初始化5个ListView的结果只会显示到一个因此b的方法还需要进一步的研究。综上所述啊衍生出了c.利用Android Studio自带的Navigation Drawer Activity侧滑页进行分页显示

毕设.基本完善版_第1张图片
Navigation Drawer Activity

---

Navigation Drawer Activity

新建一个Navigation Drawer Activity,先来介绍布局:

  • content_main.xml:页面的主要内容,将ListView存放在这里以显示
  • app_bar_main.xml:使用'com.android.support:design:24.2.1'的CoodinatorLayout,包含上面的conteng_main.xml内容以及一个工具栏
  • nav_header_main.xml:从左侧划出的页面的head布局
  • activity_main_drawer.xml:在menu目录里面,从左侧划出的页面的content布局
    毕设.基本完善版_第2张图片
    新建项目结构

大体思路就是通过左侧划出页的“按钮”,多次取得不同的json数据,利用这些返回的数据重绘主页面的ListView,达到“分页”的效果。还好android的网络访问以及处理获取到的json的操作用时很短,实现的效果跟分页没差

---

MainActivity

由于选择了最简单的方案,大部分问题都已经让Android Studio处理好了,我们可以进一步完善。
新建一个Item数组,存放类别。

//默认“页面”
private void setDefault(int arg){    
mTextView.setText(Item[arg]);    
new ArticleAsyncTask().execute(Urls[arg]);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {    
// Handle navigation view item clicks here.    
int id = item.getItemId();    
if (id == R.id.nav_camera) {        
mTextView.setText(Item[0]);        
new ArticleAsyncTask().execute(cpURL);    
} else if (id == R.id.nav_gallery) {        
mTextView.setText(Item[1]);        
new ArticleAsyncTask().execute(wkURL);    
} else if (id == R.id.nav_slideshow) {        
mTextView.setText(Item[2]);        
new ArticleAsyncTask().execute(anURL);    
} else if (id == R.id.nav_manage) {        
mTextView.setText(Item[3]);        
new ArticleAsyncTask().execute(cmURL);    
} else if (id == R.id.nav_share) {        
mTextView.setText(Item[4]);        
new ArticleAsyncTask().execute(gmURL);    
}    
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);    
drawer.closeDrawer(GravityCompat.START);    
return true;
}

---

WebView

每篇文章的链接、附加信息爬取之后,可以使用WebView一一访问链接。其中用到几个方法

  • loadUrl():加载连接资源
  • setWebViewClient:设置webview通过何种浏览器访问
  • getSettings().setJavaScriptEnable():设置webview对JS的支持
  • getSettings().setCacheMode():设置webview加载模式(考虑是否使用缓存)
  • getSettings().setBlockNetworkImage():设置webview是否加载图片
  • setWebChromeClient():设置加载进度栏(优化体验)
public void startReadUrl(String url) {
// TODO Auto-generated method stub
webView.loadUrl(url);// 加载连接资源    
webView.setWebViewClient(new WebViewClient() {        
@Override        
public boolean shouldOverrideUrlLoading(android.webkit.WebView view, String url) {
// 覆盖webView默认通过系统或者第三方浏览器打开网页的行为            
// 如果为false调用系统或者第三方浏览器打开网页的行为            
// TODO Auto-generated method stub            
view.loadUrl(url);// webView加载web资源            
return true;        
}    
});    
WebSettings settings = webView.getSettings();// 启用支持javascript    
settings.setJavaScriptEnabled(true);    
settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);// web加载页面优先使用缓存加载    
webView.getSettings().setBlockNetworkImage(false);    
webView.setWebChromeClient(new WebChromeClient(){//设置网页加载进度条        
@Override        
public void onProgressChanged(WebView view, int newProgress) {            
if(newProgress==100){                
closeDialog();            
}else{                
openDialog(newProgress);            
}        
}        
private void closeDialog(){            
if(dialog!=null && dialog.isShowing()){                
dialog.dismiss();                
dialog = null;            
}        
}        
private void openDialog(int newProgress){            
if(dialog == null){                
dialog = new ProgressDialog(webViewer.this);                
dialog.setTitle("Loading");                
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);                
dialog.setProgress(newProgress);                
dialog.show();            
}else {                
dialog.setProgress(newProgress);            
}        
}    
}); 
);
}

需要声明窗口


---
上一回:通过ListView一览文章
下一回:继续爬AcFun
本篇代码

你可能感兴趣的:(毕设.基本完善版)