main.calss


/**** 自定义拖拉ListView* * @author zhangjia* */
public class DragListView extends ListView implements OnScrollListener,OnClickListener {// 拖拉ListView枚举所有状态private enum DListViewState {LV_NORMAL, // 普通状态LV_PULL_REFRESH, // 下拉状态(为超过mHeadViewHeight)LV_RELEASE_REFRESH, // 松开可刷新状态(超过mHeadViewHeight)LV_LOADING;// 加载状态}// 点击加载更多枚举所有状态private enum DListViewLoadingMore {LV_NORMAL, // 普通状态LV_LOADING, // 加载状态LV_OVER; // 结束状态}private View mHeadView;// 头部headViewprivate TextView mRefreshTextview; // 刷新msg(mHeadView)private TextView mLastUpdateTextView;// 更新事件(mHeadView)private ImageView mArrowImageView;// 下拉图标(mHeadView)private ProgressBar mHeadProgressBar;// 刷新进度体(mHeadView)private int mHeadViewWidth; // headView的宽(mHeadView)private int mHeadViewHeight;// headView的高(mHeadView)private View mFootView;// 尾部mFootViewprivate View mLoadMoreView;// mFootView 的view(mFootView)private TextView mLoadMoreTextView;// 加载更多.(mFootView)private View mLoadingView;// 加载中...View(mFootView)private Animation animation, reverseAnimation;// 旋转动画,旋转动画之后旋转动画.private int mFirstItemIndex = -1;// 当前视图能看到的第一个项的索引// 用于保证startY的值在一个完整的touch事件中只被记录一次private boolean mIsRecord = false;private int mStartY, mMoveY;// 按下是的y坐标,move时的y坐标private DListViewState mlistViewState = DListViewState.LV_NORMAL;// 拖拉状态.(自定义枚举)private DListViewLoadingMore loadingMoreState = DListViewLoadingMore.LV_NORMAL;// 加载更多默认状态.private final static int RATIO = 2;// 手势下拉距离比.private boolean mBack = false;// headView是否返回.private OnRefreshLoadingMoreListener onRefreshLoadingMoreListener;// 下拉刷新接口(自定义)private boolean isScroller = true;// 是否屏蔽ListView滑动。public DragListView(Context context) {super(context, null);initDragListView(context);}public DragListView(Context context, AttributeSet attrs) {super(context, attrs);initDragListView(context);}// 注入下拉刷新接口public void setOnRefreshListener(OnRefreshLoadingMoreListener onRefreshLoadingMoreListener) {this.onRefreshLoadingMoreListener = onRefreshLoadingMoreListener;}/**** 初始化ListView*/public void initDragListView(Context context) {String time = "1994.12.05";// 更新时间initHeadView(context, time);// 初始化该head.initLoadMoreView(context);// 初始化footersetOnScrollListener(this);// ListView滚动监听}/**** 初始话头部HeadView* * @param context*            上下文* @param time*            上次更新时间*/public void initHeadView(Context context, String time) {mHeadView = LayoutInflater.from(context).inflate(R.layout.head, null);mArrowImageView = (ImageView) mHeadView.findViewById(R.id.head_arrowImageView);mArrowImageView.setMinimumWidth(60);mHeadProgressBar = (ProgressBar) mHeadView.findViewById(R.id.head_progressBar);mRefreshTextview = (TextView) mHeadView.findViewById(R.id.head_tipsTextView);mLastUpdateTextView = (TextView) mHeadView.findViewById(R.id.head_lastUpdatedTextView);// 显示更新事件mLastUpdateTextView.setText("最近更新:" + time);measureView(mHeadView);// 获取宽和高mHeadViewWidth = mHeadView.getMeasuredWidth();mHeadViewHeight = mHeadView.getMeasuredHeight();addHeaderView(mHeadView, null, false);// 将初始好的ListView add进拖拽ListView// 在这里我们要将此headView设置到顶部不显示位置.mHeadView.setPadding(0, -1 * mHeadViewHeight, 0, 0);initAnimation();// 初始化动画}/**** 初始化底部加载更多控件*/private void initLoadMoreView(Context context) {mFootView = LayoutInflater.from(context).inflate(R.layout.footer, null);mLoadMoreView = mFootView.findViewById(R.id.load_more_view);mLoadMoreTextView = (TextView) mFootView.findViewById(R.id.load_more_tv);mLoadingView = (LinearLayout) mFootView.findViewById(R.id.loading_layout);mLoadMoreView.setOnClickListener(this);addFooterView(mFootView);}/**** 初始化动画*/private void initAnimation() {// 旋转动画animation = new RotateAnimation(0, -180,RotateAnimation.RELATIVE_TO_SELF, 0.5f,RotateAnimation.RELATIVE_TO_SELF, 0.5f);animation.setInterpolator(new LinearInterpolator());// 匀速animation.setDuration(250);animation.setFillAfter(true);// 停留在最后状态.// 反向旋转动画reverseAnimation = new RotateAnimation(-180, 0,RotateAnimation.RELATIVE_TO_SELF, 0.5f,RotateAnimation.RELATIVE_TO_SELF, 0.5f);reverseAnimation.setInterpolator(new LinearInterpolator());reverseAnimation.setDuration(250);reverseAnimation.setFillAfter(true);}/**** 作用:测量 headView的宽和高.* * @param child*/private void measureView(View child) {ViewGroup.LayoutParams p = child.getLayoutParams();if (p == null) {p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);}int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 0 + 0, p.width);int lpHeight = p.height;int childHeightSpec;if (lpHeight > 0) {childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight,MeasureSpec.EXACTLY);} else {childHeightSpec = MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED);}child.measure(childWidthSpec, childHeightSpec);}/**** touch 事件监听*/@Overridepublic boolean onTouchEvent(MotionEvent ev) {switch (ev.getAction()) {// 按下case MotionEvent.ACTION_DOWN:doActionDown(ev);break;// 移动case MotionEvent.ACTION_MOVE:doActionMove(ev);break;// 抬起case MotionEvent.ACTION_UP:doActionUp(ev);break;default:break;}/**** 如果是ListView本身的拉动,那么返回true,这样ListView不可以拖动.* 如果不是ListView的拉动,那么调用父类方法,这样就可以上拉执行.*/if (isScroller) {return super.onTouchEvent(ev);} else {return true;}}/**** 摁下操作* * 作用:获取摁下是的y坐标* * @param event*/void doActionDown(MotionEvent event) {if (mIsRecord == false && mFirstItemIndex == 0) {mStartY = (int) event.getY();mIsRecord = true;}}/**** 拖拽移动操作* * @param event*/void doActionMove(MotionEvent event) {mMoveY = (int) event.getY();// 获取实时滑动y坐标// 检测是否是一次touch事件.if (mIsRecord == false && mFirstItemIndex == 0) {mStartY = (int) event.getY();mIsRecord = true;}/**** 如果touch关闭或者正处于Loading状态的话 return.*/if (mIsRecord == false || mlistViewState == DListViewState.LV_LOADING) {return;}// 向下啦headview移动距离为y移动的一半.(比较友好)int offset = (mMoveY - mStartY) / RATIO;switch (mlistViewState) {// 普通状态case LV_NORMAL: {// 如果<0,则意味着上滑动.if (offset > 0) {// 设置headView的padding属性.mHeadView.setPadding(0, offset - mHeadViewHeight, 0, 0);switchViewState(DListViewState.LV_PULL_REFRESH);// 下拉状态}}break;// 下拉状态case LV_PULL_REFRESH: {setSelection(0);// 选中第一项,可选.// 设置headView的padding属性.mHeadView.setPadding(0, offset - mHeadViewHeight, 0, 0);if (offset < 0) {/**** 要明白为什么isScroller = false;*/isScroller = false;switchViewState(DListViewState.LV_NORMAL);// 普通状态Log.e("jj", "isScroller=" + isScroller);} else if (offset > mHeadViewHeight) {// 如果下拉的offset超过headView的高度则要执行刷新.switchViewState(DListViewState.LV_RELEASE_REFRESH);// 更新为可刷新的下拉状态.}}break;// 可刷新状态case LV_RELEASE_REFRESH: {setSelection(0);// 设置headView的padding属性.mHeadView.setPadding(0, offset - mHeadViewHeight, 0, 0);// 下拉offset>0,但是没有超过headView的高度.那么要goback 原装.if (offset >= 0 && offset <= mHeadViewHeight) {mBack = true;switchViewState(DListViewState.LV_PULL_REFRESH);} else if (offset < 0) {switchViewState(DListViewState.LV_NORMAL);} else {}}break;default:return;};}/**** 手势抬起操作* * @param event*/public void doActionUp(MotionEvent event) {mIsRecord = false;// 此时的touch事件完毕,要关闭。isScroller = true;// ListView可以Scrooler滑动.mBack = false;// 如果下拉状态处于loading状态.if (mlistViewState == DListViewState.LV_LOADING) {return;}// 处理相应状态.switch (mlistViewState) {// 普通状态case LV_NORMAL:break;// 下拉状态case LV_PULL_REFRESH:mHeadView.setPadding(0, -1 * mHeadViewHeight, 0, 0);switchViewState(mlistViewState.LV_NORMAL);break;// 刷新状态case LV_RELEASE_REFRESH:mHeadView.setPadding(0, 0, 0, 0);switchViewState(mlistViewState.LV_LOADING);onRefresh();// 下拉刷新break;}}// 切换headview视图private void switchViewState(DListViewState state) {switch (state) {// 普通状态case LV_NORMAL: {mArrowImageView.clearAnimation();// 清除动画mArrowImageView.setImageResource(R.drawable.arrow);}break;// 下拉状态case LV_PULL_REFRESH: {mHeadProgressBar.setVisibility(View.GONE);// 隐藏进度条mArrowImageView.setVisibility(View.VISIBLE);// 下拉图标mRefreshTextview.setText("下拉可以刷新");mArrowImageView.clearAnimation();// 清除动画// 是有可刷新状态(LV_RELEASE_REFRESH)转为这个状态才执行,其实就是你下拉后在上拉会执行.if (mBack) {mBack = false;mArrowImageView.clearAnimation();// 清除动画mArrowImageView.startAnimation(reverseAnimation);// 启动反转动画}}break;// 松开刷新状态case LV_RELEASE_REFRESH: {mHeadProgressBar.setVisibility(View.GONE);// 隐藏进度条mArrowImageView.setVisibility(View.VISIBLE);// 显示下拉图标mRefreshTextview.setText("松开获取更多");mArrowImageView.clearAnimation();// 清除动画mArrowImageView.startAnimation(animation);// 启动动画}break;// 加载状态case LV_LOADING: {Log.e("!!!!!!!!!!!", "convert to IListViewState.LVS_LOADING");mHeadProgressBar.setVisibility(View.VISIBLE);mArrowImageView.clearAnimation();mArrowImageView.setVisibility(View.GONE);mRefreshTextview.setText("载入中...");}break;default:return;}// 切记不要忘记时时更新状态。mlistViewState = state;}/**** 下拉刷新*/private void onRefresh() {if (onRefreshLoadingMoreListener != null) {onRefreshLoadingMoreListener.onRefresh();}}/**** 下拉刷新完毕*/public void onRefreshComplete() {mHeadView.setPadding(0, -1 * mHeadViewHeight, 0, 0);// 回归.switchViewState(mlistViewState.LV_NORMAL);//}/**** 点击加载更多* * @param flag*            数据是否已全部加载完毕*/public void onLoadMoreComplete(boolean flag) {if (flag) {updateLoadMoreViewState(DListViewLoadingMore.LV_OVER);} else {updateLoadMoreViewState(DListViewLoadingMore.LV_NORMAL);}}// 更新Footview视图private void updateLoadMoreViewState(DListViewLoadingMore state) {switch (state) {// 普通状态case LV_NORMAL:mLoadingView.setVisibility(View.GONE);mLoadMoreTextView.setVisibility(View.VISIBLE);mLoadMoreTextView.setText("查看更多");break;// 加载中状态case LV_LOADING:mLoadingView.setVisibility(View.VISIBLE);mLoadMoreTextView.setVisibility(View.GONE);break;// 加载完毕状态case LV_OVER:mLoadingView.setVisibility(View.GONE);mLoadMoreTextView.setVisibility(View.VISIBLE);mLoadMoreTextView.setText("加载完毕");break;default:break;}loadingMoreState = state;}/**** ListView 滑动监听*/@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {mFirstItemIndex = firstVisibleItem;}/**** 底部点击事件*/@Overridepublic void onClick(View v) {// 防止重复点击if (onRefreshLoadingMoreListener != null&& loadingMoreState == DListViewLoadingMore.LV_NORMAL) {updateLoadMoreViewState(DListViewLoadingMore.LV_LOADING);onRefreshLoadingMoreListener.onLoadMore();// 对外提供方法加载更多.}}/**** 自定义接口*/public interface OnRefreshLoadingMoreListener {/**** // 下拉刷新执行*/void onRefresh();/**** 点击加载更多*/void onLoadMore();}}

main.class

package com.jj.drag;import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends Activity implementsDragListView.OnRefreshLoadingMoreListener {private DragListView dlv_main;// 下拉ListViewprivate MyAdapter adapter;private final static int DRAG_INDEX = 1;// 下拉刷新标识private final static int LOADMORE_INDEX = 2;// 加载更多标识@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);dlv_main = (DragListView) findViewById(R.id.dlv_main);adapter = new MyAdapter(this);dlv_main.setAdapter(adapter);dlv_main.setOnRefreshListener(this);}/**** * @author jia*/class MyAdapter extends BaseAdapter {private Context context;private LayoutInflater inflater;public MyAdapter(Context context) {super();this.context = context;inflater = LayoutInflater.from(context);}@Overridepublic int getCount() {return 10;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {holder = new ViewHolder();convertView = inflater.inflate(R.layout.item, null);holder.textView = (TextView) convertView.findViewById(R.id.tv_tripline_content_item_1);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}return convertView;}}class ViewHolder {public TextView textView;public TextView textView2;}/**** 执行类 异步* * @author zhangjia* */class MyAsyncTask extends AsyncTask<Void, Void, Void> {private Context context;private int index;// 用于判断是下拉刷新还是点击加载更多public MyAsyncTask(Context context, int index) {this.context = context;this.index = index;}@Overrideprotected Void doInBackground(Void... params) {try {Thread.sleep(2000);} catch (InterruptedException e1) {e1.printStackTrace();}return null;}@Overrideprotected void onPreExecute() {super.onPreExecute();}@Overrideprotected void onPostExecute(Void result) {super.onPostExecute(result);if (index == DRAG_INDEX)dlv_main.onRefreshComplete();else if (index == LOADMORE_INDEX)dlv_main.onLoadMoreComplete(false);}}/**** 下拉刷新*/@Overridepublic void onRefresh() {new MyAsyncTask(this, DRAG_INDEX).execute();}/**** 点击加载更多*/@Overridepublic void onLoadMore() {new MyAsyncTask(this, LOADMORE_INDEX).execute();}}

layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="@color/white"android:orientation="vertical" ><com.jj.drag.DragListViewandroid:id="@+id/dlv_main"android:layout_width="fill_parent"android:layout_height="fill_parent"android:cacheColorHint="#00000000" /></LinearLayout>

head.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- ListView的头部 --><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content" ><!-- 内容 --><RelativeLayoutandroid:id="@+id/head_contentLayout"android:layout_width="fill_parent"android:layout_height="70dp" ><!-- 箭头图像、进度条 --><FrameLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_centerVertical="true"android:layout_marginLeft="30dp" ><!-- 箭头 --><ImageViewandroid:id="@+id/head_arrowImageView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:src="@drawable/arrow" /><!-- 进度条 --><ProgressBarandroid:id="@+id/head_progressBar"style="?android:attr/progressBarStyleSmall"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:visibility="gone" /></FrameLayout><!-- 提示、最近更新 --><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:gravity="center_horizontal"android:orientation="vertical" ><!-- 提示 --><TextViewandroid:id="@+id/head_tipsTextView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="下拉可以刷新"android:textColor="@color/grey21"android:textSize="20sp" /><!-- 最近更新 --><TextViewandroid:id="@+id/head_lastUpdatedTextView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="上次更新"android:textColor="@color/grey21"android:textSize="10sp" /></LinearLayout><Viewandroid:layout_width="fill_parent"android:layout_height="1px"android:layout_alignParentBottom="true"android:background="@color/gray" ></View></RelativeLayout></LinearLayout>

footer.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/load_more_view"android:layout_width="match_parent"android:layout_height="match_parent"android:clickable="true"android:gravity="center"android:minHeight="80dp" ><TextViewandroid:id="@+id/load_more_tv"android:layout_width="fill_parent"android:layout_height="wrap_content"android:gravity="center"android:text="查看更多"android:textColor="@color/grey21"android:textSize="20sp" /><LinearLayoutandroid:id="@+id/loading_layout"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center_vertical"android:orientation="horizontal"android:visibility="gone" ><ProgressBarstyle="?android:attr/progressBarStyleSmall"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginRight="10dp" /><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:gravity="center"android:text="加载中..."android:textColor="@color/grey21"android:textSize="18sp" /></LinearLayout></RelativeLayout>

item:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:padding="5dp" ><ImageViewandroid:id="@+id/iv_tripline_content_item"android:layout_width="100dp"android:layout_height="60dp"android:src="@drawable/car" /><TextViewandroid:id="@+id/tv_tripline_content_item_1"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center_vertical"android:text="法拉利的忠实热爱者."android:textColor="@color/black"android:textSize="18sp" /></LinearLayout>

自定义ListVIew添加上下更多项相关推荐

  1. 自定义listView添加滑动删除功能

    今天研究了一下android里面的手势,结合昨天学习的自定义View,做了一个自定义的listview,继承自listView,添加了条目的滑动手势操作,滑动后出现一个删除按钮,点击删除按钮,触发一个 ...

  2. android开发 listview 头部 轮播,listview添加的头部布局超过一屏头部内容显示不全...

    headView的实际高度超过一个屏幕,但是显示的结果只有一个屏幕,超过一个屏幕高度意外的部分显示不全. 只使用了listView.getRefreshable().addHeadView(headV ...

  3. 【Android开发】自定义ListView,使用通用适配器,并实现ListView上的每一项和每一项上的按钮等控件同时监听

    ListView在Android开发中是比较常用的系统组件,但是有时候我们除了需要做ListView上每一行的点击监听事件之外,如果每一行上还有其他需要监听的控件例如Button.CheckBox等, ...

  4. Android 自定义 ListView 上下拉动“刷新最新”和“加载更多”歌曲列表

    本文内容 环境 测试数据 项目结构 演示 参考资料 本文演示,上拉刷新最新的歌曲列表,和下拉加载更多的歌曲列表.所谓"刷新最新"和"加载更多"是指日期.演示代码 ...

  5. 探索SwipeRefreshLayout配合自定义ListView完成下拉刷新、滑到底部自动加载更多

    在Android开发过程中经常需要实现上下拉刷新功能,Google推出的下拉刷新控件SwipeRefreshLayout(彩虹条),由于官方版本只有下拉刷新而没有上拉加载更多的功能,很多人也尝试在这个 ...

  6. ListView隐藏右侧滚动条,listview去掉分割线,自定义分割线,ListView添加HeaderView和FooterView

    ListView添加HeaderView和FooterView View headerView = LayoutInflater.from(AddwcrrActivity.this).inflate( ...

  7. 【Android游戏开发二十三】自定义ListView【通用】适配器并实现监听控件!

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/374.html L ...

  8. 自定义ListView【通用】适配器并实现监听控件

    ListView:在Android应用开发过程中属于最常用的系统组件之一,当然可能童鞋们问为什么会突然游戏开发中讲这个,呵呵,其实在游戏开发中,也会常常使用到系统组件,比如游戏排行榜,简单的游戏关卡选 ...

  9. vue.jsr入门_JSR-308和Checker框架为jOOQ 3.9添加了更多类型安全性

    vue.jsr入门 Java 8引入了JSR-308,它为Java语言添加了新的注释功能. 最重要的是:键入注释. 现在可以像下面这样设计怪物了: 比注解更疯狂的是类型注解. 在数组上. 谁认为这是有 ...

  10. JSR-308和Checker框架为jOOQ 3.9添加了更多类型安全性

    Java 8引入了JSR-308,它为Java语言添加了新的注释功能. 最重要的是:键入注释. 现在可以像下面这样设计怪物了: 比注解更疯狂的是类型注解. 在数组上. 谁认为这是有效的Java代码? ...

最新文章

  1. java操作storm,Storm集群常用批量操作命令
  2. wav音量和分贝转换关系_Permute 3 for mac(音视频格式转换器) 最新版
  3. 基于Silverlight+WCF的SAAS开发平台TAP(二)之核心技术
  4. cpu和memory性能监控
  5. 编辑index.html
  6. linux命令行快捷命令及vim常用快捷命令
  7. 1.部署netcore之安装或升级 netcore2.1.1
  8. caj格式转pdf的3种方法
  9. python在规划类专业的作用_城乡规划学Python、Gis有哪些具体的作用?
  10. 拓端tecdat|Python用时变马尔可夫区制转换(Markov regime switching)自回归模型分析经济时间序列
  11. ubuntu下安装2个mysql_Ubuntu下MySQL的手工安装
  12. google earth 卫星无偏移免费下载,91卫图助手
  13. 计算机组装工具以及装机流程,如何组装电脑,图文教程详解电脑组装全过程
  14. 前端和后端哪个工资更高呢?
  15. ICP备案不等于ICP许可证
  16. 牛客小白月赛28 C-单词记忆方法——dfs
  17. “征服自己是最大的胜利,被征服是最大的耻辱和邪恶。”
  18. CTFhub备份文件下载
  19. 仿微博、微信、qq 点击缩略图, 查看高清图 UI 组件
  20. 玩转iOS开发:集成 Union Pay - 银联支付

热门文章

  1. 华为浏览器不能下载linux,H5下载手游页面,华为手机浏览器不兼容
  2. 描写计算机教室的词语,关于描写教室的词语
  3. Game of Thrones : 权利的游戏
  4. 李沐动手学深度学习V2-基于注意力机制的seq2seq
  5. Spring配置文件中的parent与abstract
  6. X_mind思维导图应用以及Windows和安卓软件下载(Free)
  7. 疫情数据汇总为csv文件
  8. 被挂上热搜的“最惨程序员”:别等到失业,才想起专业
  9. Url Rewrite Filter 使用全攻略
  10. 百度竞价ocpc投放是一门玄学吗