网上有很多很有名的开源框架,这里就来拉拉PullToRefresh这个框架,也就是我们平时用的下拉刷新啦,当然你问我这个有什么用啊?别人已经写好了,这里主要是学习以及练习,练习的次数多了,一切就顺其自然的会了.

废话少说,先上图,再上代码:

1.要想实现下拉刷新功能必须要有个下拉刷新的布局,是吧?

[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >
  6. <RelativeLayout
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content"
  9. android:paddingBottom="10dip"
  10. android:paddingTop="10dip" >
  11. <LinearLayout
  12. android:id="@+id/layout"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:layout_centerInParent="true"
  16. android:gravity="center"
  17. android:orientation="vertical" >
  18. <TextView
  19. android:id="@+id/tip"
  20. android:layout_width="wrap_content"
  21. android:layout_height="wrap_content"
  22. android:text="@string/state" />
  23. <TextView
  24. android:id="@+id/lastupdate_time"
  25. android:layout_width="wrap_content"
  26. android:layout_height="wrap_content" />
  27. </LinearLayout>
  28. <ProgressBar
  29. android:id="@+id/progress"
  30. style="?android:attr/progressBarStyleSmall"
  31. android:layout_width="wrap_content"
  32. android:layout_height="wrap_content"
  33. android:layout_toLeftOf="@id/layout"
  34. android:layout_marginRight="20dip"
  35. android:visibility="gone" />
  36. <ImageView
  37. android:id="@+id/arrow"
  38. android:layout_width="wrap_content"
  39. android:layout_height="wrap_content"
  40. android:layout_alignTop="@+id/layout"
  41. android:layout_marginRight="19dp"
  42. android:layout_toLeftOf="@+id/layout"
  43. android:src="@drawable/arrow_down" />
  44. </RelativeLayout>
  45. </LinearLayout>

2.你要把它加入到布局里面吧!

[java] view plaincopy
  1. headView=layoutInflater.from(context).inflate(R.layout.header_layout, null);
  2. this.addHeaderView(headView);

3.加入到布局直接显示出来也不符合需求啊,所以这一步需要隐藏布局,当然不能和前一篇博客( Android自定义控件(四)仿网易客户端上拉加载更多 )一样直接隐藏,直接隐藏满足不了如图的要求,我们这里采取的是设置头部布局的高度为实际高度的负值,这样就实现了隐藏功能,当下拉的时候,还不至于一次就全部显示出来,ok这种办法能够实现图中的要求

[java] view plaincopy
  1. headerHeight = headView.getMeasuredHeight();
  2. setHeaderViewHeight(-headerHeight);
[java] view plaincopy
  1. /**
  2. * 设置头部布局的高度
  3. *
  4. * @param i
  5. */
  6. private void setHeaderViewHeight(int headerHeight) {
  7. headView.setPadding(headView.getPaddingLeft(), headerHeight,
  8. headView.getPaddingRight(), headView.getPaddingBottom());
  9. //重绘
  10. headView.invalidate();
  11. }

4.跑起来之后,白瞎了,没实现想要的功能,也就是说没有把头部布局隐藏掉,哎,跟踪代码之后发现高度为0,郭神说过在measure之前,getMeasureWidth()和getMeasureHeight()都为零,好吧,那就先measure吧!

[java] view plaincopy
  1. private void measureView(View view) {
  2. ViewGroup.LayoutParams lp = view.getLayoutParams();
  3. if (lp == null) {
  4. lp = new ViewGroup.LayoutParams(
  5. ViewGroup.LayoutParams.MATCH_PARENT,
  6. ViewGroup.LayoutParams.WRAP_CONTENT);
  7. }
  8. int width = ViewGroup.getChildMeasureSpec(0, 0, lp.width);
  9. int height;
  10. int tempHeight=lp.height;
  11. if (tempHeight > 0) {
  12. height = MeasureSpec.makeMeasureSpec(tempHeight,
  13. MeasureSpec.EXACTLY);
  14. } else {
  15. height = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
  16. }
  17. view.measure(width, height);
  18. }

5.隐藏成功了,下面就要实现具体的功能了,下拉刷新,松开刷新,正在刷新这三个状态,是通过手势改变状态,所以这里要实现onTouch,当然还有OnScrollListener

需要用到firstVisibleItem判断Listview向上滑动还是向下滑动,如果firstVisibleItem==0说明到达ListView的头部了,当然你还需要一个布尔值判断是否按下滑动

[java] view plaincopy
  1. @Override
  2. public void onScroll(AbsListView view, int firstVisibleItem,
  3. int visibleItemCount, int totalItemCount) {
  4. this.firstVisibleItem=firstVisibleItem;
  5. }

重写onTouchEvent,通过firstVisibleItem和布尔值判断按下,抬起,滑动

[java] view plaincopy
  1. @Override
  2. public boolean onTouchEvent(MotionEvent ev) {
  3. switch (ev.getAction()) {
  4. case MotionEvent.ACTION_DOWN:
  5. if (firstVisibleItem == 0) {
  6. isRemark = true;
  7. startY = (int) ev.getY();
  8. }
  9. break;
  10. case MotionEvent.ACTION_MOVE:
  11. onMove(ev);
  12. break;
  13. case MotionEvent.ACTION_UP:
  14. if (state==RELEASE) {
  15. state=REFRASH;
  16. reflashViewByState();
  17. //更新数据
  18. isRefreshListener.onRefresh();
  19. }else if (state==PULL) {
  20. state=NONE;
  21. isRemark=false;
  22. refreshDrawableState();
  23. }
  24. break;
  25. }
  26. return super.onTouchEvent(ev);
  27. }

代码不全,先解释一下,后面附上全部代码

按下时,如果firstVisibleItem为0,说明到达listview的顶部,并且可以按下,把isRemark赋值为true,滑动时改变头部布局的状态

[java] view plaincopy
  1. /**
  2. * 移动过程的状态变换
  3. *
  4. * @param ev
  5. */
  6. private void onMove(MotionEvent ev) {
  7. if (!isRemark) {
  8. return;
  9. }
  10. int tempY = (int) ev.getY();
  11. int space = tempY - startY;
  12. int topPadding = space - headerHeight;
  13. switch (state) {
  14. case NONE:
  15. if (space>0) {
  16. state=PULL;
  17. reflashViewByState();
  18. }
  19. break;
  20. case PULL:
  21. setHeaderViewHeight(topPadding);
  22. if (space>headerHeight+30&&scrollState==SCROLL_STATE_IDLE) {
  23. state=RELEASE;
  24. reflashViewByState();
  25. }
  26. break;
  27. case RELEASE:
  28. setHeaderViewHeight(topPadding);
  29. if (space<headerHeight+30) {
  30. state=PULL;
  31. reflashViewByState();
  32. }else if (space<=0) {
  33. state=NONE;
  34. reflashViewByState();
  35. }
  36. break;
  37. }
  38. }

根据滑动之后和动画前y值的变化判断滑动状态,当space大于零时,当前状态变为下拉刷新,如果space大于某个值时,当前状态变为松开可以刷新,当space大于零小于某个值时,当前状态为下拉刷新状态,当space小于零时,当前状态变为正常状态.当然状态改变时,界面也要随着改变

[java] view plaincopy
  1. /**
  2. *根据状态刷新当前页面
  3. */
  4. private void reflashViewByState() {
  5. TextView tip = (TextView) headView.findViewById(R.id.tip);
  6. ImageView arrow = (ImageView) headView.findViewById(R.id.arrow);
  7. ProgressBar progress = (ProgressBar) headView.findViewById(R.id.progress);
  8. RotateAnimation anim = new RotateAnimation(0, 180,
  9. RotateAnimation.RELATIVE_TO_SELF, 0.5f,
  10. RotateAnimation.RELATIVE_TO_SELF, 0.5f);
  11. anim.setDuration(500);
  12. anim.setFillAfter(true);
  13. RotateAnimation anim1 = new RotateAnimation(180, 0,
  14. RotateAnimation.RELATIVE_TO_SELF, 0.5f,
  15. RotateAnimation.RELATIVE_TO_SELF, 0.5f);
  16. anim1.setDuration(500);
  17. anim1.setFillAfter(true);
  18. switch (state) {
  19. case NONE:
  20. setHeaderViewHeight(-headerHeight);
  21. arrow.clearAnimation();
  22. break;
  23. case PULL:
  24. arrow.setVisibility(View.VISIBLE);
  25. progress.setVisibility(View.GONE);
  26. tip.setText("下拉刷新");
  27. arrow.clearAnimation();
  28. arrow.setAnimation(anim1);
  29. break;
  30. case RELEASE:
  31. arrow.setVisibility(View.VISIBLE);
  32. progress.setVisibility(View.GONE);
  33. tip.setText("松开刷新");
  34. arrow.clearAnimation();
  35. arrow.setAnimation(anim);
  36. break;
  37. case REFRASH:
  38. setHeaderViewHeight(50);
  39. arrow.setVisibility(View.GONE);
  40. progress.setVisibility(View.VISIBLE);
  41. tip.setText("正在刷新");
  42. arrow.clearAnimation();
  43. break;
  44. }
  45. }

界面上主要改变的就是提示,箭头和progress,正常状态下,界面不可见,下拉刷新状态下,箭头可见并且朝下,提示信息为下拉刷新并且progress不可见,松开刷新状态,箭头朝上,progress不可见,提示信息为下拉刷新,正在加载状态箭头不可见,progress可见,提示信息改为正在刷新

当然,在变成正在加载状态时,还要加载更过数据

[java] view plaincopy
  1. public interface IsRefreshListener{
  2. public void onRefresh();
  3. }
  4. public void setIsRefreshListener(IsRefreshListener isRefreshListener){
  5. this.isRefreshListener=isRefreshListener;
  6. }

加载完数据后,还要通知listview刷新结束

[java] view plaincopy
  1. /**
  2. * 获取完数据;
  3. */
  4. public void reflashComplete() {
  5. state = NONE;
  6. isRemark = false;
  7. reflashViewByState();
  8. TextView lastupdatetime = (TextView) headView
  9. .findViewById(R.id.lastupdate_time);
  10. SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
  11. Date date = new Date(System.currentTimeMillis());
  12. String time = format.format(date);
  13. lastupdatetime.setText(time);
  14. }

自定义下拉刷新控件就这样完成了,不懂得留言吧,我尽量给你解答,自定义这东西,写多了也就知道怎么写了

下面附上自定义下拉刷新控件的全部代码:

[java] view plaincopy
  1. package com.sdufe.thea.guo.view;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;
  4. import android.content.Context;
  5. import android.util.AttributeSet;
  6. import android.view.LayoutInflater;
  7. import android.view.MotionEvent;
  8. import android.view.View;
  9. import android.view.ViewGroup;
  10. import android.view.animation.RotateAnimation;
  11. import android.widget.AbsListView;
  12. import android.widget.ImageView;
  13. import android.widget.ProgressBar;
  14. import android.widget.TextView;
  15. import android.widget.AbsListView.OnScrollListener;
  16. import android.widget.ListView;
  17. import com.sdufe.thea.guo.R;
  18. public class PullToRefreshListView extends ListView implements OnScrollListener {
  19. View headView;
  20. int headerHeight;
  21. int firstVisibleItem;
  22. int scrollState;
  23. boolean isRemark;
  24. int startY;
  25. int state;
  26. final int NONE = 0;
  27. final int PULL = 1;
  28. final int RELEASE = 2;
  29. final int REFRASH = 3;
  30. IsRefreshListener isRefreshListener;
  31. public PullToRefreshListView(Context context, AttributeSet attrs,
  32. int defStyle) {
  33. super(context, attrs, defStyle);
  34. initView(context);
  35. }
  36. public PullToRefreshListView(Context context, AttributeSet attrs) {
  37. super(context, attrs);
  38. initView(context);
  39. }
  40. public PullToRefreshListView(Context context) {
  41. super(context);
  42. initView(context);
  43. }
  44. private void initView(Context context) {
  45. headView = LayoutInflater.from(context).inflate(R.layout.header_layout,
  46. null);
  47. measureView(headView);
  48. headerHeight = headView.getMeasuredHeight();
  49. setHeaderViewHeight(-headerHeight);
  50. addView(headView);
  51. setOnScrollListener(this);
  52. }
  53. /**
  54. * 计算宽高
  55. *
  56. * @param view
  57. */
  58. private void measureView(View view) {
  59. ViewGroup.LayoutParams lp = view.getLayoutParams();
  60. if (lp == null) {
  61. lp = new ViewGroup.LayoutParams(
  62. ViewGroup.LayoutParams.MATCH_PARENT,
  63. ViewGroup.LayoutParams.WRAP_CONTENT);
  64. }
  65. int width = ViewGroup.getChildMeasureSpec(0, 0, lp.width);
  66. int height;
  67. int tempHeight = lp.height;
  68. if (tempHeight > 0) {
  69. height = MeasureSpec.makeMeasureSpec(tempHeight,
  70. MeasureSpec.EXACTLY);
  71. } else {
  72. height = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
  73. }
  74. view.measure(width, height);
  75. }
  76. /**
  77. * 设置头部布局的高度
  78. *
  79. * @param i
  80. */
  81. private void setHeaderViewHeight(int headerHeight) {
  82. headView.setPadding(headView.getPaddingLeft(), headerHeight,
  83. headView.getPaddingRight(), headView.getPaddingBottom());
  84. // 重绘
  85. headView.invalidate();
  86. }
  87. @Override
  88. public void onScrollStateChanged(AbsListView view, int scrollState) {
  89. this.scrollState = scrollState;
  90. }
  91. @Override
  92. public void onScroll(AbsListView view, int firstVisibleItem,
  93. int visibleItemCount, int totalItemCount) {
  94. this.firstVisibleItem = firstVisibleItem;
  95. }
  96. @Override
  97. public boolean onTouchEvent(MotionEvent ev) {
  98. switch (ev.getAction()) {
  99. case MotionEvent.ACTION_DOWN:
  100. if (firstVisibleItem == 0) {
  101. isRemark = true;
  102. startY = (int) ev.getY();
  103. }
  104. break;
  105. case MotionEvent.ACTION_MOVE:
  106. onMove(ev);
  107. break;
  108. case MotionEvent.ACTION_UP:
  109. if (state==RELEASE) {
  110. state=REFRASH;
  111. reflashViewByState();
  112. //更新数据
  113. isRefreshListener.onRefresh();
  114. }else if (state==PULL) {
  115. state=NONE;
  116. isRemark=false;
  117. refreshDrawableState();
  118. }
  119. break;
  120. }
  121. return super.onTouchEvent(ev);
  122. }
  123. /**
  124. * 移动过程的状态变换
  125. *
  126. * @param ev
  127. */
  128. private void onMove(MotionEvent ev) {
  129. if (!isRemark) {
  130. return;
  131. }
  132. int tempY = (int) ev.getY();
  133. int space = tempY - startY;
  134. int topPadding = space - headerHeight;
  135. switch (state) {
  136. case NONE:
  137. if (space>0) {
  138. state=PULL;
  139. reflashViewByState();
  140. }
  141. break;
  142. case PULL:
  143. setHeaderViewHeight(topPadding);
  144. if (space>headerHeight+30&&scrollState==SCROLL_STATE_IDLE) {
  145. state=RELEASE;
  146. reflashViewByState();
  147. }
  148. break;
  149. case RELEASE:
  150. setHeaderViewHeight(topPadding);
  151. if (space<headerHeight+30) {
  152. state=PULL;
  153. reflashViewByState();
  154. }else if (space<=0) {
  155. state=NONE;
  156. reflashViewByState();
  157. }
  158. break;
  159. }
  160. }
  161. /**
  162. * 获取完数据;
  163. */
  164. public void reflashComplete() {
  165. state = NONE;
  166. isRemark = false;
  167. reflashViewByState();
  168. TextView lastupdatetime = (TextView) headView
  169. .findViewById(R.id.lastupdate_time);
  170. SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
  171. Date date = new Date(System.currentTimeMillis());
  172. String time = format.format(date);
  173. lastupdatetime.setText(time);
  174. }
  175. /**
  176. *根据状态刷新当前页面
  177. */
  178. private void reflashViewByState() {
  179. TextView tip = (TextView) headView.findViewById(R.id.tip);
  180. ImageView arrow = (ImageView) headView.findViewById(R.id.arrow);
  181. ProgressBar progress = (ProgressBar) headView.findViewById(R.id.progress);
  182. RotateAnimation anim = new RotateAnimation(0, 180,
  183. RotateAnimation.RELATIVE_TO_SELF, 0.5f,
  184. RotateAnimation.RELATIVE_TO_SELF, 0.5f);
  185. anim.setDuration(500);
  186. anim.setFillAfter(true);
  187. RotateAnimation anim1 = new RotateAnimation(180, 0,
  188. RotateAnimation.RELATIVE_TO_SELF, 0.5f,
  189. RotateAnimation.RELATIVE_TO_SELF, 0.5f);
  190. anim1.setDuration(500);
  191. anim1.setFillAfter(true);
  192. switch (state) {
  193. case NONE:
  194. setHeaderViewHeight(-headerHeight);
  195. arrow.clearAnimation();
  196. break;
  197. case PULL:
  198. arrow.setVisibility(View.VISIBLE);
  199. progress.setVisibility(View.GONE);
  200. tip.setText("下拉刷新");
  201. arrow.clearAnimation();
  202. arrow.setAnimation(anim1);
  203. break;
  204. case RELEASE:
  205. arrow.setVisibility(View.VISIBLE);
  206. progress.setVisibility(View.GONE);
  207. tip.setText("松开刷新");
  208. arrow.clearAnimation();
  209. arrow.setAnimation(anim);
  210. break;
  211. case REFRASH:
  212. setHeaderViewHeight(50);
  213. arrow.setVisibility(View.GONE);
  214. progress.setVisibility(View.VISIBLE);
  215. tip.setText("正在刷新");
  216. arrow.clearAnimation();
  217. break;
  218. }
  219. }
  220. public interface IsRefreshListener{
  221. public void onRefresh();
  222. }
  223. public void setIsRefreshListener(IsRefreshListener isRefreshListener){
  224. this.isRefreshListener=isRefreshListener;
  225. }
  226. }

下面就是怎么用了

[html] view plaincopy
  1. <com.sdufe.thea.guo.view.PullToRefreshListView
  2. android:id="@+id/pull_to_refresh"
  3. android:layout_width="match_parent"
  4. android:layout_height="wrap_content"/>

下面的用法就跟listview差不多了,提示一点要实现IsRefreshListener接口,在onRefresh()里面加载更多数据

[java] view plaincopy
  1. package com.sdufe.thea.guo;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import com.sdufe.thea.guo.view.PullToRefreshListView;
  5. import com.sdufe.thea.guo.view.PullToRefreshListView.IsRefreshListener;
  6. import android.os.Bundle;
  7. import android.app.Activity;
  8. import android.view.Menu;
  9. import android.widget.ArrayAdapter;
  10. public class MainActivity extends Activity implements IsRefreshListener{
  11. PullToRefreshListView listView;
  12. ArrayAdapter<String> adapter;
  13. List<String> list;
  14. @Override
  15. protected void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.activity_main);
  18. listView = (PullToRefreshListView) findViewById(R.id.pull_to_refresh);
  19. initData();
  20. adapter = new ArrayAdapter<String>(this,
  21. android.R.layout.simple_list_item_1, list);
  22. listView.setAdapter(adapter);
  23. }
  24. private void initData() {
  25. list = new ArrayList<String>();
  26. list.add("123456789");
  27. list.add("123456789");
  28. list.add("123456789");
  29. }
  30. @Override
  31. public void onRefresh() {
  32. list.add("爸爸");
  33. list.add("妈妈");
  34. list.add("我");
  35. adapter.notifyDataSetChanged();
  36. listView.reflashComplete();
  37. }
  38. }

今天就到此结束啦,不懂的,留言

Android自定义控制(五)仿新浪微博的下拉刷新相关推荐

  1. Android仿苹果版QQ下拉刷新实现(二) ——贝塞尔曲线开发鼻涕下拉粘连效果

    前言 接着上一期 Android仿苹果版QQ下拉刷新实现(一) --打造简单平滑的通用下拉刷新控件 的博客开始,同样,在开始前我们先来看一下目标效果: 下面上一下本章需要实现的效果图: 大家看到这个效 ...

  2. Android仿苹果版QQ下拉刷新实现(三)

    前言 第三篇下拉刷新的博客来的稍微有点晚,因为前两篇的博客访问量一直不是很高,所以博主花了点时间修改了整体的Demo效果,处理了很多极端下拉情况下的显示问题,给大家呈现一个完美的下拉刷新控件.因为本文 ...

  3. html js微信朋友圈下拉刷新效果,仿朋友圈下拉刷新动画(基础动画)

    示意图: 2.0.gif demo地址:仿朋友圈下拉刷新动画 动画的起源源于好奇 因为刚开是学动画,恨不得把所有的都实现一遍,试了一下微信朋友圈的下拉刷新动画. 如果ViewController的第一 ...

  4. vue 仿B站下拉刷新上拉加载

    vue 仿B站下拉刷新上拉加载 功能大部分都是跟B站一样的,还是有一些瑕疵和小bug的,φ(>ω<*) 先上demo连接和gitHub项目地址吧 demo展示 https://github ...

  5. Android自定义下拉刷新动画--仿百度外卖下拉刷新

    好久没写博客了,小编之前一段时间一直在找工作,从天津来到了我们的大帝都,感觉还不错.好了废话不多说了,开始我们今天的主题吧.现如今的APP各式各样,同样也带来了各种需求,一个下拉刷新都能玩出花样了,前 ...

  6. Android仿苹果版QQ下拉刷新实现(一) ——打造简单平滑的通用下拉刷新控件

    前言: 因为公司人员变动原因,导致了博主四个月没有动安卓,一直在做IOS开发,如今接近年前,终于可以花一定的时间放在安卓上了.好了,废话不多说,今天我们要带来的效果是苹果版本的QQ下拉刷新.首先看一下 ...

  7. android新闻项目、饮食助手、下拉刷新、自定义View进度条、ReactNative阅读器等源码...

    Android精选源码 Android仿照36Kr官方新闻项目课程源码 一个优雅美观的下拉刷新布局,众多样式可选 安卓版本的VegaScroll滚动布局 android物流详情的弹框 健身饮食记录助手 ...

  8. android支付宝动态更新,Android仿支付宝首页下拉刷新

    题外话 学习了Behavior之后,发现效果都可以通过Behavior来实现,包括支付宝首页的下拉刷新效果,其重点效果指标在于下滑上部分的布局,同样能够进行下拉刷新,其下拉刷新的布局展开的位置在中间部 ...

  9. 使用SwipeRefreshLayout和RecyclerView实现仿“简书”下拉刷新和上拉加载更多

    原文地址: http://blog.csdn.net/leoleohan/article/details/50989549/ 一.概述 我们公司目前开发的所有Android APP都是遵循iOS风格设 ...

最新文章

  1. 关于python的比赛_【蓝桥杯】——python集团的比赛技巧,Python,组
  2. 2.3.3 操作系统之实现临界区进程互斥的硬件实现方法
  3. linux中xargs用法,Linux中xargs的用法
  4. C:简单的学生信息处理程序实现
  5. 软核、硬核以及固核的概念
  6. android string拼接字符串_为什么阿里巴巴不建议在循环体中使用+进行字符串拼接?...
  7. 226. Invert Binary Tree 1
  8. codevs 1576 最长严格上升子序列
  9. 51单片机除c语言 中断嵌套,关于51系列单片机中断嵌套 - 关于单片机中断嵌套总结...
  10. LeetCode 2090. 半径为 k 的子数组平均值(滑窗)
  11. java并发编程之Thread.sleep方法详解
  12. 【小记事】电脑命令行开WiFi
  13. RFID技术正助力物流行业进入新时代
  14. pads中如何设置等长_如何给PDF中的文本设置高亮显示
  15. 【转】Jsp自定义标签详解
  16. echarts配置项图文介绍——xAxis
  17. 【django】简易视频播放功能
  18. [附源码]计算机毕业设计JAVA旅游管理系统
  19. 转载:Linux下用mutt给QQ邮箱发匿名邮件
  20. CSDN格式字体颜色入门

热门文章

  1. 【开发环境】为 Visual Studio Community 2013 版本安装中文语言包 ( 安装 Test Agents 2013 | 安装 Visual Studio 2013 简体中文 )
  2. 【C 语言】内存四区原理 ( 栈内存属性增长方向 | 栈内存开口方向 | 代码示例 )
  3. 【C 语言】编译过程 分析 ( 预处理 | 编译 | 汇编 | 链接 | 宏定义 | 条件编译 | 编译器指示字 )
  4. LeetCode-337 House Robber III
  5. bzoj4592[SHOI2015]脑洞治疗仪
  6. bzoj 4711 小奇挖矿 ——“承诺”类树形dp
  7. 初学Python——RabbitMQ的安装
  8. Class对象和反射
  9. [高级软件工程教学]结队第1次作业成绩公布
  10. docker虚拟机动态扩展内存