看到大家都习惯写博客,我也来写自己的第一个博客吧,也算是对项目的备份。

首先ui部分

布局如图所示

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/drawer_layout"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"tools:openDrawer="start"><includelayout="@layout/tablayout"android:layout_width="match_parent"android:layout_height="match_parent" /><android.support.design.widget.NavigationViewandroid:id="@+id/nav_view"android:layout_width="250dp"android:layout_height="match_parent"android:layout_gravity="start"android:fitsSystemWindows="true"app:headerLayout="@layout/nav_header_main"app:menu="@menu/activity_main_drawer" /></android.support.v4.widget.DrawerLayout>
itms.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="@dimen/cardview_layout_hight"xmlns:app="http://schemas.android.com/apk/res-auto"><android.support.v7.widget.CardViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_alignParentStart="true"android:id="@+id/cardView_news"android:background="#dddddd"android:layout_margin="7dp"android:paddingTop="1dp"android:layout_alignParentTop="true"><com.dqj.fakeithomes.siv.SmartImageViewandroid:id="@+id/news_img"android:layout_width="@dimen/cardview_img_withhig"android:layout_height="@dimen/cardview_img_withhig"android:layout_marginLeft="20dp"android:layout_marginTop="20dp"android:elevation="50dp"android:src="@drawable/nv_bg"android:transitionName="img" /><TextViewandroid:id="@+id/news_title"android:layout_width="200dp"android:layout_height="102dp"android:layout_marginLeft="160dp"android:layout_marginTop="10dp"android:background="#1a000000"android:fontFamily="sans-serif"android:maxLength="34"android:text="小米今日发布小米mix3:高通845 屏占比99% 售价1999起"android:textColor="#464445"android:textSize="@dimen/news_title_size"android:transitionName="title" /><TextViewandroid:id="@+id/news_from"android:layout_width="@dimen/news_from_width"android:layout_height="@dimen/news_from_heigh"android:layout_marginLeft="160dp"android:layout_marginTop="80dp"android:gravity="center"android:maxLength="7"android:text="it之家"android:textColor="#d61200"android:textSize="@dimen/news_from_size"android:textStyle="bold" /><TextViewandroid:id="@+id/news_time"android:layout_width="@dimen/news_time_width"android:layout_height="@dimen/news_time_heigh"android:layout_marginLeft="200dp"android:layout_marginTop="110dp"android:fontFamily="sans-serif"android:gravity="center"android:text="12:24 12-30 2019"android:textColor="#838383"android:textSize="@dimen/news_time_size" /></android.support.v7.widget.CardView></RelativeLayout>
nav_header_main.xml:<?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"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="@dimen/nav_header_height"android:background="@drawable/nv_bg"android:orientation="vertical"android:theme="@style/ThemeOverlay.AppCompat.Dark"><ImageViewandroid:backgroundTint="#177c6f"android:id="@+id/Login_ico"android:textSize="30dp"app:elevation="20dp"android:layout_width="130dp"android:layout_height="130dp"android:layout_centerVertical="true"android:layout_centerHorizontal="true"tools:ignore="MissingPrefix" /><Buttonandroid:id="@+id/btn_login"android:layout_width="match_parent"android:layout_height="wrap_content"android:backgroundTint="#3b8e8d"android:text="@string/onclick_to_login"android:layout_alignParentBottom="true"android:layout_alignParentStart="true" /></RelativeLayout>
news_content_fragment.xml:<?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"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="@dimen/nav_header_height"android:background="@drawable/nv_bg"android:orientation="vertical"android:theme="@style/ThemeOverlay.AppCompat.Dark"><ImageViewandroid:backgroundTint="#177c6f"android:id="@+id/Login_ico"android:textSize="30dp"app:elevation="20dp"android:layout_width="130dp"android:layout_height="130dp"android:layout_centerVertical="true"android:layout_centerHorizontal="true"tools:ignore="MissingPrefix" /><Buttonandroid:id="@+id/btn_login"android:layout_width="match_parent"android:layout_height="wrap_content"android:backgroundTint="#3b8e8d"android:text="@string/onclick_to_login"android:layout_alignParentBottom="true"android:layout_alignParentStart="true" /></RelativeLayout>
 

r

ecycler_view_fragment.xml:<?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"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="@dimen/nav_header_height"android:background="@drawable/nv_bg"android:orientation="vertical"android:theme="@style/ThemeOverlay.AppCompat.Dark"><ImageViewandroid:backgroundTint="#177c6f"android:id="@+id/Login_ico"android:textSize="30dp"app:elevation="20dp"android:layout_width="130dp"android:layout_height="130dp"android:layout_centerVertical="true"android:layout_centerHorizontal="true"tools:ignore="MissingPrefix" /><Buttonandroid:id="@+id/btn_login"android:layout_width="match_parent"android:layout_height="wrap_content"android:backgroundTint="#3b8e8d"android:text="@string/onclick_to_login"android:layout_alignParentBottom="true"android:layout_alignParentStart="true" /></RelativeLayout>
tablayout.xml:<?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"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="@dimen/nav_header_height"android:background="@drawable/nv_bg"android:orientation="vertical"android:theme="@style/ThemeOverlay.AppCompat.Dark"><ImageViewandroid:backgroundTint="#177c6f"android:id="@+id/Login_ico"android:textSize="30dp"app:elevation="20dp"android:layout_width="130dp"android:layout_height="130dp"android:layout_centerVertical="true"android:layout_centerHorizontal="true"tools:ignore="MissingPrefix" /><Buttonandroid:id="@+id/btn_login"android:layout_width="match_parent"android:layout_height="wrap_content"android:backgroundTint="#3b8e8d"android:text="@string/onclick_to_login"android:layout_alignParentBottom="true"android:layout_alignParentStart="true" /></RelativeLayout>
 

在网络方面,用的是it之家的api接口,不是公开的,是我抓包抓的哈哈,侵权删!

json协议如图

新闻列表 https://api.ithome.com/json/newslist/news?r=0
文章详情 https://api.ithome.com/xml/newscontent/350/412.xml
相关文章 https://api.ithome.com/json/tags/0350/350362.json
最热评论 https://dyn.ithome.com/json/hotcommentlist/350/87a8e5b144d81938.json
评论列表 https://dyn.ithome.com/json/commentlist/350/87a8e5b144d81938.json
评论详情 https://dyn.ithome.com/json/commentcontent/d739ee8f2ceb0a27.json
轮播新闻 https://api.ithome.com/xml/slide/slide.xml
圈子列表 https://apiquan.ithome.com/api/post?categoryid=0&type=0&orderTime=&visistCount&pageLength
圈子详情 https://apiquan.ithome.com/api/post/236076
圈子评论 https://apiquan.ithome.com/api/reply?postid=236076&replyidlessthan=3241294

/** newsid : 413374* title : 小米王腾:无线充电鼠标垫已在路上,还能更酷* postdate : 2019-03-09T23:54:50.357* orderdate : 2019-03-09T23:54:50.357* description : 小米9手机搭载了全球首款20W无线闪充,堪比有线快充。现在小米产品总监王腾微博表示,支持无线充电的大鼠标垫已经在路上了,相比网友的一些想法,可能更酷一些。* image : http://img.ithome.com/newsuploadfiles/thumbnail/2019/3/413374_240.jpg?r=1552146890357* hitcount : 9849* commentcount : 101* cid : 71* sid : 0* url : /0/413/374.htm* v : 001* lapinid : 1829277* imagelist : ["http://img.ithome.com/newsuploadfiles/2019/3/20190309_210543_50.jpg@s_2,w_240,h_180","http://img.ithome.com/newsuploadfiles/2019/3/20190306_004559_435.png@s_2,w_240,h_180","http://img.ithome.com/newsuploadfiles/2019/3/20190306_004634_944.png@s_2,w_240,h_180"]*/

json解析用的是fastjson这个插件

bean.class如下package com.dqj.fakeithomes;import java.util.List;public class bean {private boolean lapin;private List<?> toplist;private List<NewslistBean> newslist;public boolean isLapin() {return lapin;}public void setLapin(boolean lapin) {this.lapin = lapin;}public List<?> getToplist() {return toplist;}public void setToplist(List<?> toplist) {this.toplist = toplist;}public List<NewslistBean> getNewslist() {return newslist;}public void setNewslist(List<NewslistBean> newslist) {this.newslist = newslist;}public static class NewslistBean {public   NewslistBean(String title,int sid,String postdate,String image){this.title=title;this.postdate=postdate;this.image=image;this.sid=sid;}/*** newsid : 413374* title : 小米王腾:无线充电鼠标垫已在路上,还能更酷* postdate : 2019-03-09T23:54:50.357* orderdate : 2019-03-09T23:54:50.357* description : 小米9手机搭载了全球首款20W无线闪充,堪比有线快充。现在小米产品总监王腾微博表示,支持无线充电的大鼠标垫已经在路上了,相比网友的一些想法,可能更酷一些。* image : http://img.ithome.com/newsuploadfiles/thumbnail/2019/3/413374_240.jpg?r=1552146890357* hitcount : 9849* commentcount : 101* cid : 71* sid : 0* url : /0/413/374.htm* v : 001* lapinid : 1829277* imagelist : ["http://img.ithome.com/newsuploadfiles/2019/3/20190309_210543_50.jpg@s_2,w_240,h_180","http://img.ithome.com/newsuploadfiles/2019/3/20190306_004559_435.png@s_2,w_240,h_180","http://img.ithome.com/newsuploadfiles/2019/3/20190306_004634_944.png@s_2,w_240,h_180"]*/private int newsid;private String title;private String postdate;private String orderdate;private String description;private String image;private int hitcount;private int commentcount;private int cid;private int sid;private String url;private String v;private int lapinid;private List<String> imagelist;public int getNewsid() {return newsid;}public void setNewsid(int newsid) {this.newsid = newsid;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getPostdate() {return postdate;}public void setPostdate(String postdate) {this.postdate = postdate;}public String getOrderdate() {return orderdate;}public void setOrderdate(String orderdate) {this.orderdate = orderdate;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public String getImage() {return image;}public void setImage(String image) {this.image = image;}public int getHitcount() {return hitcount;}public void setHitcount(int hitcount) {this.hitcount = hitcount;}public int getCommentcount() {return commentcount;}public void setCommentcount(int commentcount) {this.commentcount = commentcount;}public int getCid() {return cid;}public void setCid(int cid) {this.cid = cid;}public int getSid() {return sid;}public void setSid(int sid) {this.sid = sid;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getV() {return v;}public void setV(String v) {this.v = v;}public int getLapinid() {return lapinid;}public void setLapinid(int lapinid) {this.lapinid = lapinid;}public List<String> getImagelist() {return imagelist;}public void setImagelist(List<String> imagelist) {this.imagelist = imagelist;}}
}然后是retrofit2的接口public interface DoRequset {
@GET("news")Call<bean> getCall();}MainActivity如下:
public class MainActivity extends AppCompatActivity  implements NavigationView.OnNavigationItemSelectedListener {public Handler Mhandler = new Handler() {public void handleMessage(Message message) {String a = (String) message.obj;switch (message.what) {case 1:drawer.openDrawer(Gravity.START);break;case 2:Toast.makeText(MainActivity.this, a + "00", Toast.LENGTH_LONG).show();}}};DrawerLayout drawer;List<bean.NewslistBean> arrayList=new ArrayList<>();recFragmnet mrecFragmnet=null;webViewFragment mwebViewFragment=null;private fragmentAdapter mSectionsPagerAdapter;/*** The {@link ViewPager} that will host the section contents.*/private ViewPager mViewPager;
public void requset(){Retrofit retrofit=new Retrofit.Builder().baseUrl("https://api.ithome.com/json/newslist/").addConverterFactory(GsonConverterFactory.create()).build();DoRequset doRequset=retrofit.create(DoRequset.class);Call<bean> call=doRequset.getCall();call.enqueue(new Callback<bean>() {@Overridepublic void onResponse(Call<bean> call, Response<bean> response) {arrayList = response.body().getNewslist();mrecFragmnet.recyclerView.setLayoutManager(new LinearLayoutManager(mrecFragmnet.recyclerView.getContext()));homeadpter holder=new homeadpter(mrecFragmnet.recyclerView.getContext(),arrayList);mrecFragmnet.recyclerView.setAdapter(holder);//Toast.makeText(MainActivity.this,  response.body().getNewslist().get(1).getDescription(),Toast.LENGTH_LONG).show();}@Overridepublic void onFailure(Call<bean> call, Throwable t) {Toast.makeText(MainActivity.this, "error!!!2",Toast.LENGTH_LONG).show();}});}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);requset();List<Fragment> list=new ArrayList<>();Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);setSupportActionBar(toolbar);mViewPager = (ViewPager) findViewById(R.id.viewpager);mrecFragmnet=new recFragmnet();mrecFragmnet.dod(null);mwebViewFragment=new webViewFragment();list.add(mrecFragmnet);list.add(mwebViewFragment);mSectionsPagerAdapter = new fragmentAdapter(getSupportFragmentManager(),list);// Set up the ViewPager with the sections adapter.mViewPager.setAdapter(mSectionsPagerAdapter);TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);fab.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG).setAction("Action", null).show();}});drawer = (DrawerLayout) findViewById(R.id.drawer_layout);ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);drawer.addDrawerListener(toggle);toggle.syncState();NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);navigationView.setNavigationItemSelectedListener(this);Mhandler.sendEmptyMessageDelayed(1, 700);}
public void showDW(){}@Overridepublic void onBackPressed() {DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);if (drawer.isDrawerOpen(GravityCompat.START)) {drawer.closeDrawer(GravityCompat.START);} else {super.onBackPressed();}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();//noinspection SimplifiableIfStatementif (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}@SuppressWarnings("StatementWithEmptyBody")@Overridepublic boolean onNavigationItemSelected(MenuItem item) {// Handle navigation view item clicks here.int id = item.getItemId();DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);drawer.closeDrawer(GravityCompat.START);return true;}public class fragmentAdapter extends FragmentPagerAdapter {List<Fragment> list;public fragmentAdapter(FragmentManager fm, List list) {super(fm);this.list=list;}@Overridepublic Fragment getItem(int position) {// getItem is called to instantiate the fragment for the given page.// Return a PlaceholderFragment (defined as a static inner class below).return list.get(position);}@Overridepublic int getCount() {// Show 3 total pages.return list.size();}}}有些代码是模板自动生成的
recylerview的适配器如下class homeadpter extends RecyclerView.Adapter<homeadpter.MyViewHolder> {Context context;List<bean.NewslistBean> list=new ArrayList<>();public homeadpter(Context context,List list){this.context=context;this.list=list;}class MyViewHolder extends RecyclerView.ViewHolder{SmartImageView imageView;TextView title;TextView time;TextView from;int id;public MyViewHolder(@NonNull View itemView) {super(itemView);imageView=(SmartImageView) itemView.findViewById(R.id.news_img);title=(TextView) itemView.findViewById(R.id.news_title);time=(TextView)itemView.findViewById(R.id.news_time);from=(TextView)itemView.findViewById(R.id.news_from);}}@NonNull@Overridepublic MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view=LayoutInflater.from(context).inflate(R.layout.item,viewGroup,false);
MyViewHolder myViewHolder=new MyViewHolder(view);return myViewHolder;}@NonNullpublic void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) {
String[] strings=list.get(i).getPostdate().split("T");
String time=strings[1].substring(0,5)+" "+strings[0];
myViewHolder.from.setText(list.get(i).getSid()==0?"it之家":"位置");
myViewHolder.title.setText(list.get(i).getTitle());
myViewHolder.time.setText(time);
myViewHolder.imageView.setImageUrl(list.get(i).getImage());}@Overridepublic int getItemCount() {return list.size();}}webViewFragment:(这个还没有完成,等待后续博客更新)
package com.dqj.fakeithomes;import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;import com.dqj.fakeithomes.MainActivity;
import com.dqj.fakeithomes.R;public class webViewFragment extends Fragment {/*** The fragment argument representing the section number for this* fragment.*/private static final String ARG_SECTION_NUMBER = "section_number";public webViewFragment() {}/*** Returns a new instance of this fragment for the given section* number.*/@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View rootView = inflater.inflate(R.layout.news_content_fragment, container, false);return rootView;}
}

最后要忘记清单的权限

说一下这个里面的坑,

因为首先onCreate里面会zhix执行网络操作,所有改变recylerview的操作也可以retorfit的

onResponse里面进行
 arrayList = response.body().getNewslist();
mrecFragmnet.recyclerView.setLayoutManager(new LinearLayoutManager(mrecFragmnet.recyclerView.getContext()
/**
一定不要用getApllicationContext(),要用recyclerView.getContext()。这个一个找了很久的bug
**/));
homeadpter holder=new homeadpter(mrecFragmnet.recyclerView.getContext(),arrayList);
mrecFragmnet.recyclerView.setAdapter(holder);

第二就是bean类的gouz构造方法为静态

public static class NewslistBean {public   NewslistBean(String title,int sid,String postdate,String image){this.title=title;this.postdate=postdate;this.image=image;this.sid=sid;}

最后 版权所有,api侵权请联系我,不支持转发

RecyclerView 结合cardview和materia degisn通过retrofit的一个项目,山寨it之家相关推荐

  1. Android之 RecyclerView,CardView 详解和相对应的上拉刷新下拉加载

    为什么80%的码农都做不了架构师?>>>    随着 Google 推出了全新的设计语言 Material Design,还迎来了新的 Android 支持库 v7,其中就包含了 M ...

  2. RecyclerView与CardView的使用

    对于博文标题的两个View,其并没有引入默认的SDK中,需要自己手动导入使用,下面将介绍导入的方式与使用的细节问题. 1.将RecyclerView与CardView导入Android Studio ...

  3. 安卓高级3 RecyclerView 和cardView使用案例

    cardView: 添加依赖:在Studio搜索cardview即可 在V7包中 或者直接在gradle中添加 compile 'com.android.support:cardview-v7:24. ...

  4. kotterKnife+dagger2+otto+okhttp+picasso+retrofit+rxjava示例项目,使用kotlin编写。

    kotterKnife+dagger2+otto+okhttp+picasso+retrofit+rxjava示例项目,使用kotlin编写. 链接:https://github.com/zengzh ...

  5. Kotlin使用Coroutine+ViewModel+retrofit构建一个网络请求框架

    Kotlin使用Coroutine+ViewModel+retrofit构建一个网络请求框架 公司里的老代码用的网络请求框架技术都比较老,为了快速搭建一个网络请求框架,提高工作效率,记录一下用jetp ...

  6. [安卓开发Android][叠层 层叠 卡片效果]RecyclerView与CardView的混合使用

    实现效果 RecyclerView起到一个叠层效果 CardView起到一个阴影效果 一.引入依赖 引入依赖到[bind.gradle]dependencies{}下 implementation ' ...

  7. Android框架之路——Glide加载图片(结合RecyclerView、CardView)

    Android框架之路--Glide加载图片 一.简介: 在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载库,作者是bumptech.这个库被广泛的运用在google的开 ...

  8. java dagger2_从零开始搭建一个项目(rxJava+Retrofit+Dagger2) ---上

    工程结构 Androd studio 替代eclipse给我带来最大的感觉,就是不用每次需要用到什么类库,就得去网上下载一个jar包.只要在项目app/build.gradle中加入代码,就能远程使用 ...

  9. 模仿Retrofit封装一个使用更简单的网络请求框架

    本文已授权微信公众号:郭霖  在微信公众号平台原创首发.会用Retrofit了?你也能自己动手写一个! 前言 想封装一套网络请求,不想直接上来就用别人写好的,或者说对项目可以更好的掌控,所以自己模仿着 ...

最新文章

  1. Django MEDIA_URL 路径正确仍然不显示照片
  2. 数值比较器实现_电动开窗器、手动开窗器使用介绍
  3. 这是霄哥的天气预报,屌不屌?
  4. Github(1)-概览,初始化仓库
  5. LeetCode 309: 一个很清晰的DP解题思路
  6. AUTOSAR – RTE(3)任务的并发
  7. Scaled Exponential Linear Unit
  8. 分享80个贺卡图片PHP源码,总有一款适合你
  9. 大学计算机教学ppt,大学计算机基本教学教程3.ppt
  10. Cesium中的相机—方向余弦阵
  11. 快乐数Python解法
  12. 洛谷P1867 【Mc生存】经验值
  13. PWM控制的基本原理
  14. 医德:《大医精诚》和《希波克拉底誓言》
  15. Statistics 基础之Hypothesis Tests1---t检验
  16. AcWing 3215 网络延时
  17. apktool 用法命令详解
  18. usb disconnect
  19. 数理统计之协方差矩阵
  20. C++ double 转string方法 精度保持到小数点15位

热门文章

  1. php curl模拟客户端,PHP cURL 模拟Amazon登陆
  2. Python日历模块| 使用示例的weekday()方法
  3. 机器学习系列笔记一:Introduction
  4. 工作流之activiti6新手上路
  5. crond atd 定时处理
  6. 场景中配置阴影(个人笔记)
  7. Shiro(1.3.2)——入门
  8. 技术探究 通用场景描述(Universial Scene Description, USD)
  9. [原创]手把手教你Linux下的多线程设计--Linux下多线程编程详解(一)
  10. Git 储藏(stash)详解