获取解析聚合新闻数据,并显示到主界面上(简易新闻 二)

关于之前的功能实现可以从制作简易新闻App导航篇中查看

先上一下最终效果图:

关于界面的搭建请看上一篇

使用Fragment+ViewPager +TabLayout自制简易新闻 app主要框架(简易新闻 一)

准备事项

1. 需要在聚合数据上注册帐号,然后申请获取聚合数据新闻头条这个API,等到申请成功后,可以在我的接口中找到新闻头条API,并可以看到自己的AppKey,点击测试发送请求,将获取到的内容复制下来。
如下图:

2. 打开Android Studio ,点击左上角的file,在出现的选项中点击settings/Plugins中选择Browse,在在如下弹出的页面中选择搜索GsonFromat,然后选择安装 。
3. 在项目中新建一个 NewsBean.class,在打开的空白类中,右键选择Generate如图:

选择GsonFormat,然后将复制到的新闻json内容放入进去,点击ok,会自动生成聚合数据新闻头条API实体类。

聚合数据新闻头条json实体类NewsBean.class

package com.example.frametest.json;import java.util.List;public class NewsBean {private String reason;private ResultBean result;private int error_code;public String getReason() {return reason;}public void setReason(String reason) {this.reason = reason;}public ResultBean getResult() {return result;}public void setResult(ResultBean result) {this.result = result;}public int getError_code() {return error_code;}public void setError_code(int error_code) {this.error_code = error_code;}public static class ResultBean {private String stat;private List<DataBean> data;public String getStat() {return stat;}public void setStat(String stat) {this.stat = stat;}public List<DataBean> getData() {return data;}public void setData(List<DataBean> data) {this.data = data;}public static class DataBean {private String uniquekey;private String title;private String date;private String category;private String author_name;private String url;private String thumbnail_pic_s;private String thumbnail_pic_s02;private String thumbnail_pic_s03;public String getUniquekey() {return uniquekey;}public void setUniquekey(String uniquekey) {this.uniquekey = uniquekey;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getDate() {return date;}public void setDate(String date) {this.date = date;}public String getCategory() {return category;}public void setCategory(String category) {this.category = category;}public String getAuthor_name() {return author_name;}public void setAuthor_name(String author_name) {this.author_name = author_name;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getThumbnail_pic_s() {return thumbnail_pic_s;}public void setThumbnail_pic_s(String thumbnail_pic_s) {this.thumbnail_pic_s = thumbnail_pic_s;}public String getThumbnail_pic_s02() {return thumbnail_pic_s02;}public void setThumbnail_pic_s02(String thumbnail_pic_s02) {this.thumbnail_pic_s02 = thumbnail_pic_s02;}public String getThumbnail_pic_s03() {return thumbnail_pic_s03;}public void setThumbnail_pic_s03(String thumbnail_pic_s03) {this.thumbnail_pic_s03 = thumbnail_pic_s03;}}}
}

项目结构图

第一步修改list_item.xml文件

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><FrameLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><android.support.v4.widget.SwipeRefreshLayoutandroid:id="@+id/swipe_refresh"android:layout_width="match_parent"android:layout_height="match_parent"><ListViewandroid:id="@+id/listView"android:layout_width="match_parent"android:layout_height="match_parent"android:scrollbars="none"></ListView></android.support.v4.widget.SwipeRefreshLayout><android.support.design.widget.FloatingActionButtonandroid:id="@+id/fab"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="bottom|end"android:layout_margin="16dp"android:src="@drawable/ic_vertical_align_top"app:elevation="8dp" /></FrameLayout>
</android.support.design.widget.CoordinatorLayout>

第二步修改NewsFragment.class类

package com.example.frametest;import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;import com.example.frametest.json.NewsBean;
import com.example.frametest.TabAdapter.MyTabAdapter;
import com.google.gson.Gson;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.util.List;public class NewsFragment extends Fragment {private FloatingActionButton fab;private ListView listView;private SwipeRefreshLayout swipeRefreshLayout;private List<NewsBean.ResultBean.DataBean> list;private static final int UPNEWS_INSERT = 0;@SuppressLint("HandlerLeak")private Handler newsHandler = new Handler(){@Overridepublic void handleMessage(Message msg) {String uniquekey,title,date, category,author_name,url,thumbnail_pic_s,thumbnail_pic_s02,thumbnail_pic_s03;switch (msg.what){case UPNEWS_INSERT:list = ((NewsBean) msg.obj).getResult().getData();MyTabAdapter adapter = new MyTabAdapter(getActivity(),list);listView.setAdapter(adapter);adapter.notifyDataSetChanged();break;}}};@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.list_item,container,false);listView = (ListView) view.findViewById(R.id.listView);fab = (FloatingActionButton) view.findViewById(R.id.fab);swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_refresh);return view;}@SuppressLint("HandlerLeak")@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);onAttach(getActivity());//获取传递的值Bundle bundle = getArguments();final String data = bundle.getString("name","top");//置顶功能fab.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {listView.smoothScrollToPosition(0);}});//下拉刷新swipeRefreshLayout.setColorSchemeResources(R.color.colorRed);swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {@Overridepublic void onRefresh() {new Handler().postDelayed(new Runnable() {@Overridepublic void run() {swipeRefreshLayout.setRefreshing(false);// 下一步实现从数据库中读取数据刷新到listview适配器中}},1000);}});//异步加载数据getDataFromNet(data);listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {//获取点击条目的路径,传值显示webview页面String url = list.get(position).getUrl();String uniquekey = list.get(position).getUniquekey();final NewsBean.ResultBean.DataBean dataBean = (NewsBean.ResultBean.DataBean) list.get(position);Intent intent = new Intent(getActivity(),WebActivity.class);intent.putExtra("url",url);startActivity(intent);}});}private void getDataFromNet(final String data){@SuppressLint("StaticFieldLeak") AsyncTask<Void,Void,String> task = new AsyncTask<Void, Void, String>() {@Overrideprotected String doInBackground(Void... params) {String path = "http://v.juhe.cn/toutiao/index?type="+data+"&key=547ee75ef186fc55a8f015e38dcfdb9a";URL url = null;try {url = new URL(path);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setReadTimeout(5000);connection.setConnectTimeout(5000);int responseCode = connection.getResponseCode();if (responseCode == 200){InputStream inputStream = connection.getInputStream();String json = streamToString(inputStream,"utf-8");return json;} else {System.out.println(responseCode);return "已达到今日访问次数上限";}} catch (MalformedURLException e) {e.printStackTrace();} catch (ProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return "";}protected void onPostExecute(final String result){new Thread(new Runnable() {@Overridepublic void run() {NewsBean newsBean = new Gson().fromJson(result,NewsBean.class);System.out.println(newsBean.getError_code());if ("10012".equals(""+newsBean.getError_code())){//下一篇将要实现从数据库加载数据}Message msg=newsHandler.obtainMessage();msg.what=UPNEWS_INSERT;msg.obj = newsBean;newsHandler.sendMessage(msg);}}).start();}@Overrideprotected void onProgressUpdate(Void... values) {super.onProgressUpdate(values);}};task.execute();}private String streamToString(InputStream inputStream, String charset){try {InputStreamReader inputStreamReader = new InputStreamReader(inputStream,charset);BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String s = null;StringBuilder builder = new StringBuilder();while ((s = bufferedReader.readLine()) != null){builder.append(s);}bufferedReader.close();return builder.toString();} catch (IOException e) {e.printStackTrace();}return null;}}

第三步添加加载图片与解析json的引用

implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'

其中图片加载使用的第三方库的github地址为:https://github.com/nostra13/Android-Universal-Image-Loader

第四步添加新闻图片格式文件

在res/layout中新建一个item_layout01.xml文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"><ImageViewandroid:id="@+id/image"android:layout_width="80dp"android:layout_height="80dp"android:layout_alignParentRight="true"android:src="@mipmap/ic_launcher"/><TextViewandroid:id="@+id/title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textStyle="bold"android:layout_toLeftOf="@id/image"android:layout_marginTop="8dp"android:layout_marginLeft="10dp"android:layout_marginBottom="8dp"android:text="Title"android:textSize="18sp"/><TextViewandroid:id="@+id/author_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/title"android:layout_marginLeft="10dp"android:layout_marginBottom="8dp"android:text="Author"android:textSize="13sp"/><!--<TextViewandroid:id="@+id/tvTime"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_toLeftOf="@+id/ivPic"android:layout_below="@id/tvTitle"android:layout_marginRight="10dp"android:text="Time"android:textSize="15sp"/>--></RelativeLayout>

在res/layout中新建一个item_layout02.xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:textSize="18sp"android:id="@+id/title"android:textStyle="bold"android:layout_marginLeft="10dp"android:layout_marginTop="20dp"android:layout_width="match_parent"android:layout_height="wrap_content" /><LinearLayoutandroid:orientation="horizontal"android:layout_marginTop="18dp"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:layout_width="match_parent"android:layout_height="wrap_content" ><ImageViewandroid:layout_weight="1"android:layout_width="0dp"android:id="@+id/image001"android:layout_height="120dp"   /><ImageViewandroid:layout_weight="1"android:layout_width="0dp"android:id="@+id/image002"android:layout_height="120dp"android:layout_marginLeft="3dp"/><ImageViewandroid:layout_weight="1"android:layout_width="0dp"android:layout_height="120dp"android:layout_marginLeft="3dp"/></LinearLayout></LinearLayout>

在res/layout中新建一个item_layout03.xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:textSize="18sp"android:id="@+id/title"android:textStyle="bold"android:layout_marginLeft="10dp"android:layout_marginTop="20dp"android:layout_width="match_parent"android:layout_height="wrap_content" /><LinearLayoutandroid:orientation="horizontal"android:layout_marginTop="18dp"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:layout_width="match_parent"android:layout_height="wrap_content" ><ImageViewandroid:layout_weight="1"android:id="@+id/image01"android:layout_width="0dp"android:layout_height="120dp"   /><ImageViewandroid:layout_weight="1"android:id="@+id/image02"android:layout_width="0dp"android:layout_height="120dp"android:layout_marginLeft="3dp"/><ImageViewandroid:layout_weight="1"android:id="@+id/image03"android:layout_width="0dp"android:layout_height="120dp"android:layout_marginLeft="3dp"/></LinearLayout></LinearLayout>

第五步添加listview的适配器MyTabAdapter.class类

根据图片的数量可知有三种不同ViewType类型

package com.example.frametest.TabAdapter;import android.content.Context;
import android.graphics.Bitmap;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.frametest.R;
import com.example.frametest.json.NewsBean;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import java.util.List;public class MyTabAdapter extends BaseAdapter {private List<NewsBean.ResultBean.DataBean> list;private Context context;private int IMAGE_01 =0;private int IMAGE_02 = 1;private int IMAGE_03 = 2;public MyTabAdapter(Context context, List<NewsBean.ResultBean.DataBean> list){this.context = context;this.list = list;//配置lmageloader类ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(context));}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic int getViewTypeCount() {return 3;}@Overridepublic int getItemViewType(int position) {if (list.get(position).getThumbnail_pic_s() != null &&list.get(position).getThumbnail_pic_s02() !=null &&list.get(position).getThumbnail_pic_s03() !=null){return IMAGE_03;}else if (list.get(position).getThumbnail_pic_s() !=null &&list.get(position).getThumbnail_pic_s02() !=null){return IMAGE_02;}return IMAGE_01;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if (getItemViewType(position) == IMAGE_01){Image01_ViewHolder holder;if (convertView == null){convertView =View.inflate(context, R.layout.item_layout01,null);holder =new Image01_ViewHolder();//查找控件holder.author_name = (TextView) convertView.findViewById(R.id.author_name);holder.title = (TextView) convertView.findViewById(R.id.title);holder.image = (ImageView) convertView.findViewById(R.id.image);convertView.setTag(holder);}else {holder = (Image01_ViewHolder) convertView.getTag();}//获取数据重新赋值holder.title.setText(list.get(position).getTitle());holder.author_name.setText(list.get(position).getAuthor_name());ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s(),holder.image,getOption());}else if (getItemViewType(position) == IMAGE_02){Image02_ViewHolder holder;if (convertView == null){convertView =View.inflate(context, R.layout.item_layout02,null);holder =new Image02_ViewHolder();//查找控件holder.image002 = (ImageView) convertView.findViewById(R.id.image002);holder.image001 = (ImageView) convertView.findViewById(R.id.image001);holder.title = (TextView) convertView.findViewById(R.id.title);convertView.setTag(holder);}else {holder = (Image02_ViewHolder) convertView.getTag();}//获取数据重新赋值holder.title.setText(list.get(position).getTitle());ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s(),holder.image001,getOption());ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s02(),holder.image002,getOption());} else {Image03_ViewHolder holder;if (convertView == null){convertView =View.inflate(context, R.layout.item_layout03,null);holder =new Image03_ViewHolder();//查找控件holder.image01 = (ImageView) convertView.findViewById(R.id.image01);holder.image02 = (ImageView) convertView.findViewById(R.id.image02);holder.image03 = (ImageView) convertView.findViewById(R.id.image03);holder.title = (TextView) convertView.findViewById(R.id.title);convertView.setTag(holder);}else {holder = (Image03_ViewHolder) convertView.getTag();}//获取数据重新赋值holder.title.setText(list.get(position).getTitle());ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s(),holder.image01,getOption());ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s02(),holder.image02,getOption());ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s03(),holder.image03,getOption());}return convertView;}//配置图片加载失败和加载中显示的Android小机器人logopublic static DisplayImageOptions getOption() {DisplayImageOptions options = new DisplayImageOptions.Builder().showImageOnLoading(R.mipmap.ic_launcher) // 设置图片下载期间显示的图片.showImageForEmptyUri(R.mipmap.ic_launcher) // 设置图片Uri为空或是错误的时候显示的图片.showImageOnFail(R.mipmap.ic_launcher) // 设置图片加载或解码过程中发生错误显示的图片.resetViewBeforeLoading(true)  // default 设置图片在加载前是否重置、复位.delayBeforeLoading(1000)  // 下载前的延迟时间.cacheInMemory(true) // default  设置下载的图片是否缓存在内存中.cacheOnDisk(true) // default  设置下载的图片是否缓存在SD卡中.imageScaleType(ImageScaleType.EXACTLY_STRETCHED) // default 设置图片以如何的编码方式显示.bitmapConfig(Bitmap.Config.RGB_565) // default 设置图片的解码类型.build();return options;}static  class  Image01_ViewHolder{TextView title,author_name;ImageView image;}static  class  Image02_ViewHolder{TextView title;ImageView image001,image002;}static  class  Image03_ViewHolder{TextView title;ImageView image01,image02,image03;}
}

第六步添加网络权限

在AndroidManifest.xml文件中添加权限:

    <uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

好了,本篇到此结束,总体来说还是比较容易实现的,下篇将会实现连接数据库,并实现用户交互的的一些功能(注册,个人收藏以及下拉刷新等等)。

连接数据库,实现下拉刷新(简易新闻 三)

项目源码GitHub地址为:https://github.com/ziruiliu1/MyBlog

资源点此处下载

新做出的改动,去掉listView的间隔线

修改list_item.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><FrameLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><android.support.v4.widget.SwipeRefreshLayoutandroid:id="@+id/swipe_refresh"android:layout_width="match_parent"android:layout_height="match_parent"><ListViewandroid:id="@+id/listView"android:layout_width="match_parent"android:layout_height="match_parent"android:divider="@color/colorWhite"android:scrollbars="none">
//对listview进行添加divider属性修改间隔线为透明白色</ListView></android.support.v4.widget.SwipeRefreshLayout><android.support.design.widget.FloatingActionButtonandroid:id="@+id/fab"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="bottom|end"android:layout_margin="16dp"android:src="@drawable/ic_vertical_align_top"app:elevation="8dp" /></FrameLayout>
</android.support.design.widget.CoordinatorLayout>

修改后的效果图:

本人博客地址:www.tobey-r1.top

解析聚合新闻数据,并显示到主界面上(简易新闻 二)相关推荐

  1. Android实现第三方Mob短信验证登录以及手机号显示和修改用户名(简易新闻 五)

    Android实现第三方Mob短信验证登录以及手机号显示和修改用户名(简易新闻 五) 关于之前的功能实现可以从制作简易新闻App导航篇中查看 因为这篇是写了有一段时间的博客,所以这篇(包括后面的简易新 ...

  2. iphone手机上卸载非主界面上的软件

    近日在iphone手机上卸载非主界面上的软件,发现原来在"设置"里的卸载选项消失了.后来通过左右滑动,进入有手电筒图标的界面,发现有一个与财经相关的小框,里面显示了非主界面的app ...

  3. 新增我的推荐歌单、通过ViewPager2+RadioGroup重构主界面( 简易音乐 六)

    新增我的推荐歌单.通过ViewPager2+RadioGroup重构主界面( 简易音乐 六) 关于 效果 添加Api接口 重构主界面 新增推荐歌单功能 新增推荐歌单适配器 关于   在本篇开始之前,我 ...

  4. Silverlight+WCF 新手实例 象棋 主界面-实时聊天区(二十五)

    在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 演示已更新到此节介绍:Silverlight+WCF 新手实例 象棋 介绍III(二十三) 本节连着Silverlight+WC ...

  5. Python解析英雄联盟数据,教你带妹上分啦!

    前言 如今,只要随便进入一个网吧,都会发现玩<英雄联盟>的人是最多的,可以这么说,<英雄联盟>已经是当之无愧的端游一哥.而在拥有如此基数玩家的<英雄联盟>,已经不仅 ...

  6. Qt嵌入外部EXE程序,并显示在主界面中!

    一.获取程序句柄以及类 打开Visual Studio 进行查询 二.QT调用程序 H文件 #ifndef VISUAL_H #define VISUAL_H#include <QWidget& ...

  7. 【IMOOC学习笔记】多种多样的App主界面Tab实现方法(二)

    Fragment实现Tab 首先把activity_main.xml 文件中的ViewPager标签改成Fragment标签 1 <FrameLayout 2 android:id=" ...

  8. app开发历程————Android程序解析服务器端的JSON格式数据,显示在界面上

    上一篇文章写的是服务器端利用Servlet 返回JSON字符串,本文主要是利用android客户端访问服务器端链接,解析JSON格式数据,放到相应的位置上. 首先,android程序的布局文件main ...

  9. 中文预处理流程(以搜狐语料全网新闻数据为例)

    数据集 使用了搜狗实验室公开语料集-全网新闻数据(SogouCA),完整语料包含来自若干新闻站点2012年6月-7月期间国内,国际,体育,社会,娱乐等18个频道的新闻数据,提供URL和正文信息. 其格 ...

最新文章

  1. jvm 系列(九):如何优化 Java GC 「译」
  2. 关于Windows不能在本地计算机启动Apache2.......并参考特定服务错误代码1问题解决...
  3. CMake Error: CMake was unable to find a build program corresponding to Ninja.
  4. 【Scratch】青少年蓝桥杯_每日一题_2.13_碰苹果
  5. Android应用自动更新功能的代码实现
  6. shell命令总结一
  7. 接收机端口电压dBuV如何转化为功率dBmW
  8. 怎样使用裁剪图片软件随意裁剪图片尺寸?
  9. 第09篇:Spring处理Mybatis事务
  10. CentOS6启用密钥登陆
  11. SUSE收购Rancher Labs,云原生时代大幕拉开
  12. vbs进阶——常用函数之inputbox篇(末尾有彩蛋)
  13. c#微信企业号开发之消息推送
  14. cocos creator麻将教程系列(九)—— 幼麟棋牌代码讲解
  15. 深入理解网络通信与tcp/ip协议
  16. excel 锁定第一行
  17. 无接触招聘,AI催生HCM SaaS新动向
  18. 门店定位怎么在地图上显示_怎样让自己的店地理位置显示在高德地图上
  19. 计算机专业笔记本低压,笔记本win7系统下CPU低压u和标压m的区别对比
  20. Crawlab(crawlab github)

热门文章

  1. Java基础学习(6)---Java面向对象
  2. poi设置word表格单元格宽度_java poi 设置word 格式如表格一类的
  3. webRTC(十一):webrtc 实时共享桌面
  4. Android Studio 快速连接 MuMu 模拟器调试
  5. XMPPFramework开发(四):电子名片
  6. 树莓派入门(MacBook本)
  7. mysql mmm 虚拟ip不通_mysql-mmm故障解决一例
  8. Linux下安装和使用杀毒软件AntiVir
  9. Perfect Office Manner for Secretary 完美文秘办公礼仪
  10. 用VideoView实现播放本地的m3u8