RecycleView万能适配器

一导入

  • implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.24'
  • implementation 'com.android.support:recyclerview-v7:25.3.1'
allprojects {repositories {...maven { url "https://jitpack.io" }}}

二:基本应用

  1. activity_main 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.support.v7.widget.RecyclerViewandroid:id="@+id/recycler_view"android:layout_width="match_parent"android:layout_height="wrap_content" />
</RelativeLayout>

2.条目布局文件

<?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="wrap_content"android:padding="5dp"><TextViewandroid:id="@+id/tv_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_marginLeft="10dp"android:layout_marginTop="10dp"android:text="我是标题"android:textColor="#f00"android:textSize="20dp" /><TextViewandroid:id="@+id/tv_age"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_toRightOf="@+id/tv_title"android:layout_marginLeft="10dp"android:textSize="20dp"android:layout_marginTop="10dp"android:text="我年龄" /><TextViewandroid:id="@+id/tv_content"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/tv_title"android:textSize="18dp"android:layout_marginLeft="10dp"android:layout_marginTop="10dp"android:text="我是描述" />
</RelativeLayout>

3.编写数据实体类型

public class Person {private String name;private int age;private String des;生成 get set方法
}
  1. 编写适配器
public class QuickAdapter extends BaseQuickAdapter<Person, BaseViewHolder> {private Context context;public QuickAdapter(int layoutResId, @Nullable List<Person> data, Context context) {super(layoutResId, data);this.context = context;}@SuppressLint("ResourceAsColor")@Overrideprotected void convert(@NonNull BaseViewHolder helper, Person item) {helper.setText(R.id.tv_title, item.getName()+"").setTextColor(R.id.tv_title, context.getResources().getColor(R.color.colorPrimary)).setText(R.id.tv_age, item.getAge()+"").setText(R.id.tv_content, item.getDes()+"").setTextColor(R.id.tv_content, context.getResources().getColor(R.color.colorAccent));}
}

5: 最后一步:在Activity中使用该适配器

public class MainActivity extends AppCompatActivity {private RecyclerView recyclerView;private QuickAdapter adapter;private ArrayList<Person> list;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);recyclerView =findViewById(R.id.recycler_view);list =new ArrayList<>();for (int i = 0; i < 20; i++) {Person person =new Person();person.setAge(i);person.setName("我是第"+i+"条数据");person.setDes("我是描述"+i);list.add(person);}LinearLayoutManager manager =new LinearLayoutManager(this);manager.setOrientation(LinearLayoutManager.VERTICAL);recyclerView.setLayoutManager(manager);adapter =new QuickAdapter(R.layout.item_rv,list,this);recyclerView.setAdapter(adapter);}
}

三:点击事件
1:Item的点击事件

 adapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {@Overridepublic void onItemClick(BaseQuickAdapter adapter, View view, int position) {Toast.makeText(MainActivity.this, "点击了第"+position+"条目", Toast.LENGTH_SHORT).show();}});

2:长按点击事件

adapter.setOnItemLongClickListener(new BaseQuickAdapter.OnItemLongClickListener() {@Overridepublic boolean onItemLongClick(BaseQuickAdapter adapter, View view, int position) {Toast.makeText(MainActivity.this, "长按"+position+"条目", Toast.LENGTH_SHORT).show();return false;}});

3:条目子控件事件
首先,在adapter的convert方法里面通过 helper.addOnClickListener 绑定一下子控件的控件id

 @SuppressLint("ResourceAsColor")@Overrideprotected void convert(@NonNull BaseViewHolder helper, Person item) {helper.setText(R.id.tv_title, item.getName()+"").setTextColor(R.id.tv_title, context.getResources().getColor(R.color.colorPrimary)).setText(R.id.tv_age, item.getAge()+"").setText(R.id.tv_content, item.getDes()+"").setTextColor(R.id.tv_content, context.getResources().getColor(R.color.colorAccent)).addOnClickListener(R.id.tv_title); //给标题增加点击事件}

然后设置

 //条目子控件事件adapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {@Overridepublic void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {//多个事件Toast.makeText(MainActivity.this, "标题子控件点击"+position+"条目", Toast.LENGTH_SHORT).show();}}});

4:Item子控件的长按事件 跟点击条目控件事件做法相同
5:多个Item子控件事件
首先绑定

 @SuppressLint("ResourceAsColor")@Overrideprotected void convert(@NonNull BaseViewHolder helper, Person item) {helper.setText(R.id.tv_title, item.getName()+"").setTextColor(R.id.tv_title, context.getResources().getColor(R.color.colorPrimary)).setText(R.id.tv_age, item.getAge()+"").setText(R.id.tv_content, item.getDes()+"").setTextColor(R.id.tv_content, context.getResources().getColor(R.color.colorAccent)).addOnClickListener(R.id.tv_title) //给标题增加点击事件.addOnClickListener(R.id.tv_content)给描述增加点击事件;}

然后区分id

 adapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {@Overridepublic void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {//多个事件switch (view.getId()){case R.id.tv_title:Toast.makeText(MainActivity.this, "标题子控件点击"+position+"条目", Toast.LENGTH_SHORT).show();break;case R.id.tv_content:Toast.makeText(MainActivity.this, "描述子控件点击"+position+"条目", Toast.LENGTH_SHORT).show();break;}}});

那么如果是长按事件呢?当然也是相同的处理方法。

6如果需要在子控件事件中获取其他子控件可以使用:

getViewByPosition(RecyclerView recyclerView, int position, @IdRes int viewId)
 adapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {@Overridepublic void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {//多个事件switch (view.getId()){case R.id.tv_title:Toast.makeText(MainActivity.this, "标题子控件点击"+position+"条目", Toast.LENGTH_SHORT).show();// TODO 子控件事件中获取其他子控件可以使用//TODO getViewByPosition(RecyclerView recyclerView, int position, @IdRes int viewId)TextView tv_title = (TextView) adapter.getViewByPosition(recyclerView, position, R.id.tv_title);Log.e("wudi", "onItemChildClick: tv_title.getText()="+tv_title.getText() );TextView tv_content = (TextView) adapter.getViewByPosition(recyclerView, position, R.id.tv_content);Log.e("wudi", "onItemChildClick: tv_content.getText()="+tv_content.getText() );break;case R.id.tv_content:Toast.makeText(MainActivity.this, "描述子控件点击"+position+"条目", Toast.LENGTH_SHORT).show();break;}}});

四、添加列表加载动画
1://开启动画(默认为渐显效果)
adapter.openLoadAnimation();
2:五种状态 (渐显、缩放、从下到上,从左到右、从右到左)

public static final int ALPHAIN = 0x00000001;/*** Use with {@link #openLoadAnimation}*/public static final int SCALEIN = 0x00000002;/*** Use with {@link #openLoadAnimation}*/public static final int SLIDEIN_BOTTOM = 0x00000003;/*** Use with {@link #openLoadAnimation}*/public static final int SLIDEIN_LEFT = 0x00000004;/*** Use with {@link #openLoadAnimation}*/public static final int SLIDEIN_RIGHT = 0x00000005;

//使用缩放
adapter.openLoadAnimation(BaseQuickAdapter.SCALEIN);

如果想自定义动画,该适配器也提供了接口

//自定义动画效果adapter.openLoadAnimation(new BaseAnimation() {@Overridepublic Animator[] getAnimators(View view) {return new Animator[]{ObjectAnimator.ofFloat(view, "scaleY", 1, 0.5f, 1),ObjectAnimator.ofFloat(view, "scaleX", 1, 0.5f, 1)};}});

动画默认只执行一次,如果想重复执行可设置

//设置重复执行动画
adapter.isFirstOnly(false);

设置不显示动画数量(老实讲,我没明白这个方法的效果是啥,因为我并没有看到效果 0.0

adapter.setNotDoAnimationCount(count);

首次到界面的item每次都依次执行加载动画
由于进入界面的item都是很多的速度进来的所以不会出现滑动显示的依次执行动画效果,这个时候会一起执行动画,如果觉得这样的效果不好可以使用setNotDoAnimationCount设置第一屏item不执行动画,但是如果需要依次执行动画可以重写startAnim让第一个屏幕的item动画延迟执行即可。

@Overrideprotected void startAnim(Animator anim, int index) {super.startAnim(anim, index);if (index < count)anim.setStartDelay(index * 150);}

五:添加头部、尾部

     View headView = View.inflate(MainActivity.this, R.layout.head_view, null);View footView = View.inflate(MainActivity.this, R.layout.foot_view, null);adapter.addHeaderView(headView);adapter.addFooterView(footView);

删除指定view

        adapter.removeHeaderView(headView);adapter.removeFooterView(footView);

删除所有布局

     adapter.removeAllHeaderView();adapter.removeAllFooterView();

出现了头布局就不会显示Empty

adapter.setHeaderAndEmpty(true);
adapter.setHeaderFooterEmpty(true,true);

六、上拉加载
1:创建一个数据管理

public class DataServer {//分页加载数据public static List<Person> getData(int lenth) {List<Person> list = new ArrayList<>();for (int i = 0; i < lenth; i++) {Person person = new Person();person.setName("name"+i);person.setDes("描述"+i);person.setAge(i);list.add(person);}return list;}
}

2:设置上啦加载

 //当前个数private  int mCurrentCounter =0;//总数private  int TOTAL_COUNTER =100;//每次取多少个private  int PAGE_SIZE =10;//是否加载失败private boolean isErr =true;adapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() {@Overridepublic void onLoadMoreRequested() {recyclerView.postDelayed(new Runnable() {@Overridepublic void run() {if (mCurrentCounter >= TOTAL_COUNTER) {//数据全部加载完毕adapter.loadMoreEnd();} else {if (isErr) {//成功获取更多数据(可以直接往适配器添加数据)adapter.addData(DataServer.getData(PAGE_SIZE));mCurrentCounter = adapter.getData().size();//主动调用加载完成,停止加载adapter.loadMoreComplete();} else {//获取更多数据失败isErr = true;Toast.makeText(MainActivity.this, R.string.network_err, Toast.LENGTH_LONG).show();//同理,加载失败也要主动调用加载失败来停止加载(而且该方法会提示加载失败)adapter.loadMoreFail();}}}}, 300);}},recyclerView);

加载完成(注意不是加载结束,而是本次数据加载结束并且还有下页数据)

 adapter.loadMoreComplete()

加载失败

adapter.loadMoreFail();

加载结束

adapter.loadMoreEnd();

注意:如果上拉结束后,下拉刷新需要再次开启上拉监听,需要使用setNewData方法填充数据。
打开或关闭加载(一般用于下拉的时候做处理,因为上拉下拉不能同时操作)

adapter.setEnableLoadMore(boolean);

预加载(这个功能屌炸天)

// 当列表滑动到倒数第N个Item的时候(默认是1)回调onLoadMoreRequested方法
adapter.setPreLoadNumber(int);
adapter.setPreLoadNumber(3);

设置自定义加载布局

adapter.setLoadMoreView(new CustomLoadMoreView());public final class CustomLoadMoreView extends LoadMoreView {@Overridepublic int getLayoutId() {return R.layout.view_load_more;}/*** 如果返回true,数据全部加载完毕后会隐藏加载更多* 如果返回false,数据全部加载完毕后会显示getLoadEndViewId()布局*/@Overridepublic boolean isLoadEndGone() {return true;}@Overrideprotected int getLoadingViewId() {return R.id.load_more_loading_view;}@Overrideprotected int getLoadFailViewId() {return R.id.load_more_load_fail_view;}/*** isLoadEndGone()为true,可以返回0* isLoadEndGone()为false,不能返回0*/@Overrideprotected int getLoadEndViewId() {return 0;}
}

七、下拉加载(符合聊天软件下拉历史数据需求)

mAdapter.setUpFetchEnable(true);
mAdapter.setUpFetchListener(new BaseQuickAdapter.UpFetchListener() {@Overridepublic void onUpFetch() {startUpFetch();}});
private void startUpFetch() {count++;/*** set fetching on when start network request.*/mAdapter.setUpFetching(true);/*** get data from internet.*/mRecyclerView.postDelayed(new Runnable() {@Overridepublic void run() {mAdapter.addData(0, genData());/*** set fetching off when network request ends.*/mAdapter.setUpFetching(false);/*** set fetch enable false when you don't need anymore.*/if (count > 5) {mAdapter.setUpFetchEnable(false);}}}, 300);}

八:多布局
1:实体类

public class Person {private String name;private int age;private String des;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getDes() {return des;}public void setDes(String des) {this.des = des;}
}

2:多布局设置类型 MultipleItem implements MultiItemEntity

/*** 多布局展示* */
//实体类必须实现MultiItemEntity,在设置数据的时候,需要给每一个数据设置itemType
public class MultipleItem implements MultiItemEntity {public static final int FIRST_TYPE = 1;public static final int SECOND_TYPE = 2;public static final int NORMAL_TYPE = 3;private int itemType;private Person person;public MultipleItem(int itemType, Person person) {this.itemType = itemType;this.person = person;}@Overridepublic int getItemType() {return itemType;}public Person getPerson(){return person;}
}

3:适配器 继承 BaseMultiItemQuickAdapter
addItemType 区分类型
helper.getItemViewType() 实现多布局展示

/*** 多布局adapter* */
public class MoreQuickAdapter extends BaseMultiItemQuickAdapter<MultipleItem, BaseViewHolder> {private Context context;public MoreQuickAdapter(List<MultipleItem> data, Context context) {super(data);this.context = context;addItemType(MultipleItem.FIRST_TYPE, R.layout.first_type_layout);addItemType(MultipleItem.SECOND_TYPE, R.layout.second_type_layout);addItemType(MultipleItem.NORMAL_TYPE, R.layout.item_rv);}@Overrideprotected void convert(@NonNull BaseViewHolder helper, MultipleItem item) {switch (helper.getItemViewType()) {case MultipleItem.FIRST_TYPE:helper.setText(R.id.tv_title,item.getPerson().getName()+"布局一").setTextColor(R.id.tv_title,context.getResources().getColor(R.color.colorAccent)).setText(R.id.tv_age,item.getPerson().getAge()+"").setTextColor(R.id.tv_age,context.getResources().getColor(R.color.colorAccent)).setText(R.id.tv_content,item.getPerson().getDes()+"").setTextColor(R.id.tv_content,context.getResources().getColor(R.color.colorAccent));break;case MultipleItem.SECOND_TYPE:helper.setText(R.id.tv_title,item.getPerson().getName()+"布局二").setTextColor(R.id.tv_title,context.getResources().getColor(R.color.colorPrimary)).setText(R.id.tv_age,item.getPerson().getAge()+"").setTextColor(R.id.tv_age,context.getResources().getColor(R.color.colorPrimary)).setText(R.id.tv_content,item.getPerson().getDes()+"").setTextColor(R.id.tv_content,context.getResources().getColor(R.color.colorPrimary));break;case MultipleItem.NORMAL_TYPE:helper.setText(R.id.tv_title,item.getPerson().getName()+"正常").setTextColor(R.id.tv_title,context.getResources().getColor(R.color.color1bd)).setText(R.id.tv_age,item.getPerson().getAge()+"").setTextColor(R.id.tv_age,context.getResources().getColor(R.color.color1bd)).setText(R.id.tv_content,item.getPerson().getDes()+"").setTextColor(R.id.tv_content,context.getResources().getColor(R.color.color1bd));break;}}
}

4:activity

     private RecyclerView recyclerView;private ArrayList<Person> data;private ArrayList<MultipleItem> multipleItems;private MoreQuickAdapter adapter;
     recyclerView =findViewById(R.id.recycler_view);data =new ArrayList<>();multipleItems =new ArrayList<>();for (int i = 0; i < 30; i++) {Person person =new Person();person.setAge(i);person.setName("name"+i);person.setDes("描述"+i);data.add(person);}//这里我是随机给某一条目加载不同的布局for (int i = 0; i < 30; i++) {if (i % 3 == 0) {multipleItems.add(new MultipleItem(MultipleItem.FIRST_TYPE, data.get(i)));} else if (i % 7 == 0) {multipleItems.add(new MultipleItem(MultipleItem.SECOND_TYPE, data.get(i)));} else {multipleItems.add(new MultipleItem(MultipleItem.NORMAL_TYPE, data.get(i)));}}LinearLayoutManager manager =new LinearLayoutManager(this);manager.setOrientation(LinearLayoutManager.VERTICAL);recyclerView.setLayoutManager(manager);adapter =new MoreQuickAdapter(multipleItems,this);recyclerView.setAdapter(adapter);

十:添加拖拽、滑动删除
拖拽和滑动删除的回调方法:

public class ItemDragAdapter extends BaseItemDraggableAdapter<Person,BaseViewHolder> {public ItemDragAdapter(int layoutResId, List<Person> data) {super(layoutResId, data);}@Overrideprotected void convert(@NonNull BaseViewHolder helper, Person item) {helper.setText(R.id.tv_title,item.getName()+"").setText(R.id.tv_age,item.getAge()+"").setText(R.id.tv_content,item.getDes()+"");}
}

activity:

 LinearLayoutManager manager = new LinearLayoutManager(this);manager.setOrientation(LinearLayoutManager.VERTICAL);recyclerView.setLayoutManager(manager);adapter = new ItemDragAdapter(R.layout.second_type_layout,data);ItemDragAndSwipeCallback itemDragAndSwipeCallback = new ItemDragAndSwipeCallback(adapter);ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemDragAndSwipeCallback);itemTouchHelper.attachToRecyclerView(recyclerView);// 开启拖拽adapter.enableDragItem(itemTouchHelper, R.id.rl_layout, true);adapter.setOnItemDragListener(onItemDragListener);// 开启滑动删除adapter.enableSwipeItem();adapter.setOnItemSwipeListener(onItemSwipeListener);recyclerView.setAdapter(adapter);
 OnItemDragListener onItemDragListener =new OnItemDragListener() {@Overridepublic void onItemDragStart(RecyclerView.ViewHolder viewHolder, int pos) {Log.e("wudi", "onItemDragStart: "+pos );}@Overridepublic void onItemDragMoving(RecyclerView.ViewHolder source, int from, RecyclerView.ViewHolder target, int to) {Log.e("wudi", "onItemDragMoving: from="+from+",to="+to );}@Overridepublic void onItemDragEnd(RecyclerView.ViewHolder viewHolder, int pos) {Log.e("wudi", "onItemDragEnd: "+pos );}};OnItemSwipeListener  onItemSwipeListener =new OnItemSwipeListener () {@Overridepublic void onItemSwipeStart(RecyclerView.ViewHolder viewHolder, int pos) {Log.e("wudi", "onItemSwipeStart: "+pos );}@Overridepublic void clearView(RecyclerView.ViewHolder viewHolder, int pos) {}@Overridepublic void onItemSwiped(RecyclerView.ViewHolder viewHolder, int pos) {}@Overridepublic void onItemSwipeMoving(Canvas canvas, RecyclerView.ViewHolder viewHolder, float dX, float dY, boolean isCurrentlyActive) {}};

新增
适配器设置数据,设置点击固定数据的点击事件

   Log.e(TAG, "convert:helper.getLayoutPosition()= "+helper.getLayoutPosition() );switch (helper.getLayoutPosition() % 3) {case 0:helper.setImageResource(R.id.image, R.mipmap.animation_img1);break;case 1:helper.setImageResource(R.id.image, R.mipmap.animation_img2);break;case 2:helper.setImageResource(R.id.image, R.mipmap.animation_img3);break;default:break;}
 /*** 设置tv_title 样式* */helper.setText(R.id.tv_title,SpannableStringUtils.getBuilder(item.getName()).append("landscapes and nedes").setClickSpan(clickableSpan).setBoldItalic().setProportion(1.5f).setStrikethrough().setUnderline().setSuperscript().setSubscript().setQuoteColor(R.color.color1bd).create()); //给标题增加点击事件;((TextView) helper.getView(R.id.tv_title)).setMovementMethod(ClickableMovementMethod.getInstance());((TextView) helper.getView(R.id.tv_title)).setFocusable(false);((TextView) helper.getView(R.id.tv_title)).setClickable(false);((TextView) helper.getView(R.id.tv_title)).setLongClickable(false);
//点击private ClickableSpan clickableSpan = new ClickableSpan() {@Overridepublic void onClick(View widget) {ToastUtils.showShortToast("事件触发了 landscapes and nedes");}@Overridepublic void updateDrawState(TextPaint ds) {ds.setColor(content.getResources().getColor(R.color.colorAccent));ds.setUnderlineText(true);}};

Android BaseQuickAdapter万能适配器相关推荐

  1. Android之万能适配器Adapter的使用

    万能适配器 万能适配器共有两个部分:SuperViewHolder 和 SuperBaseAdapter 万能的ViewHolder public class SuperViewHolder {pri ...

  2. android listview万能适配器

    参考    Android 快速开发系列 打造万能的ListView GridView 适配器 Hongyang public class CommonViewHolder {private Cont ...

  3. BaseQuickAdapter万能适配器

    BaseQuickAdapter的有机以及作用域: (1)减少重复 Adapter 代码 (2)添加 Item 的点击事件,长按事件以及子控件的点击事件 (3)添加头部.尾部,下拉刷新.上拉加载(上拉 ...

  4. Java泛型应用之打造Android中ListView和GridView万能适配器【CommonAdapter】--超简洁写法

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/52813227 [DylanAndroid的csdn博客] 在android中使 ...

  5. Android 万能适配器BaseQuickAdapter操作及免费源码

    Android 万能适配器BaseQuickAdapter操作及免费源码,本篇巨长无比,非常详细的介绍了BaseQuickAdapter,若有帮助到您,记得点个赞哦~ 简介 导入依赖 简单使用 添加头 ...

  6. Android万能适配器BaseRecyclerViewAdapterHelper的简单使用

    继我们上一章的网络请求的封装中,我们在现有的项目中通过我们的万能适配器来写一个简单的Recyclerview列表 效果图 video1 首先还是同样的道理,我们需要进行一个简单的依赖添加 //recy ...

  7. Android进阶笔记09:Android 万能适配器

    1. Android 万能适配器      项目中Listview GridView几乎是必用的组件,Android也提供一套机制,为这些控件绑定数据,那就是Adapter.用起来虽然还不错,但每次都 ...

  8. Android开发之万能适配器

    ListView.GridView等等非常多的东西都需要适配器.而如果开发一个app每一个listview都有写一个Adapter的话,那还怎么愉快的玩游戏.. 什么是ViewHolider以及的用法 ...

  9. android通用listview和gridview万能适配器实现的两种方式

    Listview和gridview是超级常用组件,于是乎,应该封装一下直接拿来用用而不是每次都写Adapter,这样多么的麻烦是不.虽然国内外大牛都有封装过,但是我总结了两个封装好的Adapter分享 ...

最新文章

  1. VASP计算光学性质
  2. 在ubuntu系统中使用dpkg命令安装后缀名为deb的软件包
  3. python自带的shell是什么-python shell是什么东西
  4. 企业移动应用平台:走进SAP SUP的世界
  5. 文件上传利器SWFUpload入门简易教程
  6. Java程序员必须掌握的7个Java性能指标!
  7. 远程唤醒_Python黑科技:在家远程遥控公司电脑,python+微信一键连接!
  8. linux之vim如何快速找到第二次打开文件的指定行
  9. Django 框架 新建app 、新建表
  10. python基础代码大全-python文件及目录操作代码汇总
  11. shader 反射 水面_大规模水面渲染
  12. 幼儿园计算机课程心得,幼儿主题式课程教学心得体会
  13. 我的大学(写给正在读大学而又感到迷茫的你)
  14. Move语言:我眼中的 Libra 最大亮点
  15. emwin自定义字库
  16. java五子棋AI算法人机对战(春物彩羽版可下载试玩PC端)
  17. 优秀IT顾问的七大能力之七--持续战斗能力
  18. java Lambda表达式详解
  19. 基于51单片机的水塔水箱液水位监测控制系统无线WIFI报警
  20. 计算用户的平均次日留存率 求教!!

热门文章

  1. 【ReID】ABD-Net: Attentive but Diverse Person Re-Identification
  2. Spring_Ioc基本配置使用(基于xml)
  3. torch.mul torch.bmm
  4. 大白话5分钟带你走进人工智能-第33节神经网络和神经元概念(1)
  5. 手机开机启动慢是什么原因_手机开机慢,详细教您手机开机慢怎么办
  6. AMI CORE8 OEM BIOS
  7. AndroidLocalizationer 支持百度翻译
  8. Dynagon代码阅读感想
  9. 浅析Windows通信编程
  10. 曹汛:计算摄像学研究 | VALSE2017之十六