Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱
MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina.com

RV BaseRecyclerViewAdapterHelper 总结 MD


目录

介绍

项目地址

文档

网站

添加依赖

  1. allprojects {
  2. repositories {
  3. ...
  4. maven { url "https://jitpack.io" }
  5. }
  6. }
  1. compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:VERSION_CODE'

这里 的真实发行版本号, 替换 VERSION_CODE(2017-6最新版本号:2.9.18)。

功能一览

优化Adapter代码

使用代码

  1. public class QuickAdapter extends BaseQuickAdapter<Status, BaseViewHolder> {
  2. public QuickAdapter(List data) {
  3. super(R.layout.tweet, data);
  4. }
  5. @Override
  6. protected void convert(BaseViewHolder viewHolder, Status item) {
  7. viewHolder.setText(R.id.tweetName, item.getUserName())
  8. .setVisible(R.id.tweetRT, item.isRetweet())
  9. .linkify(R.id.tweetText);
  10. Glide.with(mContext).load(item.getUserAvatar()).crossFade().into((ImageView) helper.getView(R.id.iv));
  11. }
  12. }
  • 继承BaseQuickAdapter基类, 泛型为List的数据类型
  • 重写convert方法,通过viewHolder.点出各种常用方法,如果有自定义控件或者viewHolder没有提供的方法,就可以通过getView方法来实现获取控件,然后进行的操作。
  • 如果需要获取当前position可以通过viewHolder.getLayoutPosition()来获取

Item的点击事件

  1. adapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
  2. @Override
  3. public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
  4. Toast.makeText(ItemClickActivity.this, "onItemClick" + position, Toast.LENGTH_SHORT).show();
  5. }
  6. });
  1. adapter.setOnItemLongClickListener(BaseQuickAdapter.OnItemLongClickListener);
  1. adapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
  2. @Override
  3. public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
  4. Toast.makeText(ItemClickActivity.this, "onItemChildClick" + position, Toast.LENGTH_SHORT).show();
  5. }
  6. });
  1. mRecyclerView.addOnItemTouchListener(new OnItemClickListener() {
  2. @Override
  3. public void onSimpleItemClick(final BaseQuickAdapter adapter, final View view, final int position) {
  4. Toast.makeText(ItemClickActivity.this, "onSimpleItemClick" + position, Toast.LENGTH_LONG).show();
  5. }
  6. });

添加列表加载动画

默认渐显效果:quickAdapter.openLoadAnimation();

渐显、缩放、从下到上,从左到右、从右到左:quickAdapter.openLoadAnimation(BaseQuickAdapter.ALPHAIN);

默认动画每个item只执行一次,如果想重复执行动画可以调用一下方法:mQuickAdapter.isFirstOnly(false);

自定义动画

  1. quickAdapter.openLoadAnimation(new BaseAnimation() {
  2. @Override
  3. public Animator[] getAnimators(View view) {
  4. return new Animator[]{
  5. ObjectAnimator.ofFloat(view, "scaleY", 1, 1.1f, 1),
  6. ObjectAnimator.ofFloat(view, "scaleX", 1, 1.1f, 1)
  7. };
  8. }
  9. });

添加头部、尾部

  • 使用代码 添加头部、尾部 mQuickAdapter.addHeaderView(getView());
  • 删除指定头部、尾部 mQuickAdapter.removeHeaderView(getView);
  • 删除所有头部、尾部 mQuickAdapter.removeAllHeaderView();
  • 扩展方法 setHeaderAndEmpty
  • 设置头部、尾部不占一行(使用场景:gv的头部添加一个"+"号) setHeaderViewAsFlow

加载更多

  • 加载更多:setOnLoadMoreListener() //滑动最后一个Item的时候回调
  • 加载完成:mQuickAdapter.loadMoreComplete();
  • 加载失败:mQuickAdapter.loadMoreFail();
  • 没有更多数据:mQuickAdapter.loadMoreEnd();
  • 打开或关闭加载:mQuickAdapter.setEnableLoadMore(boolean);
  • 预加载:mQuickAdapter.setAutoLoadMoreSize(int);// 当列表滑动到倒数第N个Item的时候(默认是1)回调onLoadMoreRequested方法
  • 检查是否满一屏,如果不满足关闭loadMore:mQuickAdapter.disableLoadMoreIfNotFullPage();
  • 设置自定义加载布局:mQuickAdapter.setLoadMoreView(new LoadMoreView());
  1. mQuickAdapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() {
  2. @Override
  3. public void onLoadMoreRequested() {
  4. mRecyclerView.postDelayed(new Runnable() {
  5. @Override
  6. public void run() {
  7. if (mCurrentCounter >= TOTAL_COUNTER) {
  8. //数据全部加载完毕
  9. mQuickAdapter.loadMoreEnd();
  10. } else {
  11. if (isErr) {
  12. //成功获取更多数据
  13. mQuickAdapter.addData(DataServer.getSampleData(PAGE_SIZE));
  14. mCurrentCounter = mQuickAdapter.getData().size();
  15. mQuickAdapter.loadMoreComplete();
  16. } else {
  17. //获取更多数据失败
  18. isErr = true;
  19. mQuickAdapter.loadMoreFail();
  20. }
  21. }
  22. }
  23. }, delayMillis);
  24. }
  25. }, mReyclerView);

注意:如果上拉结束后,下拉刷新需要再次开启上拉监听,需要使用setNewData方法填充数据。

自定义加载布局

设置自定义加载布局:mQuickAdapter.setLoadMoreView(new LoadMoreView());

  1. public final class CustomLoadMoreView extends LoadMoreView {
  2. @Override
  3. public int getLayoutId() {
  4. return R.layout.view_load_more;
  5. }
  6. /**
  7. * 如果返回true,数据全部加载完毕后会隐藏加载更多
  8. * 如果返回false,数据全部加载完毕后会显示getLoadEndViewId()布局
  9. */
  10. @Override
  11. public boolean isLoadEndGone() {
  12. return true;
  13. }
  14. @Override protected int getLoadingViewId() {
  15. return R.id.load_more_loading_view;
  16. }
  17. @Override
  18. protected int getLoadFailViewId() {
  19. return R.id.load_more_load_fail_view;
  20. }
  21. /**
  22. * isLoadEndGone()为true,可以返回0,为false,不能返回0
  23. */
  24. @Override
  25. protected int getLoadEndViewId() {
  26. return 0;
  27. }
  28. }
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <FrameLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="match_parent"
  5. android:layout_height="@dimen/dp_40">
  6. <LinearLayout
  7. android:id="@+id/load_more_loading_view"
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent"
  10. android:gravity="center"
  11. android:orientation="horizontal">
  12. <ProgressBar
  13. android:id="@+id/loading_progress"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. style="?android:attr/progressBarStyleSmall"
  17. android:layout_marginRight="@dimen/dp_4"
  18. android:indeterminateDrawable="@drawable/sample_footer_loading_progress"/>
  19. <TextView
  20. android:id="@+id/loading_text"
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23. android:layout_marginLeft="@dimen/dp_4"
  24. android:text="@string/loading"
  25. android:textColor="#0dddb8"
  26. android:textSize="@dimen/sp_14"/>
  27. </LinearLayout>
  28. <FrameLayout
  29. android:id="@+id/load_more_load_fail_view"
  30. android:layout_width="match_parent"
  31. android:layout_height="match_parent"
  32. android:visibility="gone">
  33. <TextView
  34. android:id="@+id/tv_prompt"
  35. android:layout_width="wrap_content"
  36. android:layout_height="wrap_content"
  37. android:layout_gravity="center"
  38. android:textColor="#0dddb8"
  39. android:text="@string/load_failed"/>
  40. </FrameLayout>
  41. </FrameLayout>

添加分组

实体类必须继承SectionEntity

  1. public class MySection extends SectionEntity<Video> {
  2. private boolean isMore;
  3. public MySection(boolean isHeader, String header) {
  4. super(isHeader, header);
  5. }
  6. public MySection(Video t) {
  7. super(t);
  8. }
  9. }

adapter构造需要传入两个布局id,第一个是item的,第二个是head的,在convert方法里面加载item数据,在convertHead方法里面加载head数据

  1. public class SectionAdapter extends BaseSectionQuickAdapter<MySection> {
  2. public SectionAdapter(int layoutResId, int sectionHeadResId, List data) {
  3. super(layoutResId, sectionHeadResId, data);
  4. }
  5. @Override
  6. protected void convert(BaseViewHolder helper, MySection item) {
  7. helper.setImageUrl(R.id.iv, (String) item.t);
  8. }
  9. @Override
  10. protected void convertHead(BaseViewHolder helper,final MySection item) {
  11. helper.setText(R.id.header, item.header);
  12. helper.setOnClickListener(R.id.more, new View.OnClickListener() {
  13. @Override
  14. public void onClick(View v) {
  15. Toast.makeText(context,item.header+"more..",Toast.LENGTH_LONG).show();
  16. }
  17. });
  18. }
  19. }

自定义不同的item类型

实体类必须实现MultiItemEntity,在设置数据的时候,需要给每一个数据设置itemType

  1. public class MultipleItem implements MultiItemEntity {
  2. public static final int TEXT = 1;
  3. public static final int IMG = 2;
  4. private int itemType;
  5. public MultipleItem(int itemType) {
  6. this.itemType = itemType;
  7. }
  8. @Override
  9. public int getItemType() {
  10. return itemType;
  11. }
  12. }

在构造里面addItemType绑定type和layout的关系

  1. public class MultipleItemQuickAdapter extends BaseMultiItemQuickAdapter<MultipleItem, BaseViewHolder> {
  2. public MultipleItemQuickAdapter(List data) {
  3. super(data);
  4. addItemType(MultipleItem.TEXT, R.layout.text_view);
  5. addItemType(MultipleItem.IMG, R.layout.image_view);
  6. }
  7. @Override
  8. protected void convert(BaseViewHolder helper, MultipleItem item) {
  9. switch (helper.getItemViewType()) {
  10. case MultipleItem.TEXT:
  11. helper.setImageUrl(R.id.tv, item.getContent());
  12. break;
  13. case MultipleItem.IMG:
  14. helper.setImageUrl(R.id.iv, item.getContent());
  15. break;
  16. }
  17. }
  18. }

如有多布局有两行布局的item都是一样的,这个时候item是可以被复用的,我们可以使用GridLayoutManager

  1. multipleItemAdapter.setSpanSizeLookup(new BaseQuickAdapter.SpanSizeLookup() {
  2. @Override
  3. public int getSpanSize(GridLayoutManager gridLayoutManager, int position) {
  4. return data.get(position).getSpanSize();
  5. }
  6. });

通过重写他的SapnSize来重用ImageView。 假设GridLayoutManager的spanCount是3,那么第一个、第二个、item的spanSize就是3,因为要占据一行(和权重差不多的意思),然后第三个、第四个、第五个、item的spanSize就是1。

设置空布局

  1. mQuickAdapter.setEmptyView(getView());

添加拖拽、滑动删除

拖拽和滑动删除的回调方法

  1. OnItemDragListener onItemDragListener = new OnItemDragListener() {
  2. @Override
  3. public void onItemDragStart(RecyclerView.ViewHolder viewHolder, int pos){}
  4. @Override
  5. public void onItemDragMoving(RecyclerView.ViewHolder source, int from, RecyclerView.ViewHolder target, int to) {}
  6. @Override
  7. public void onItemDragEnd(RecyclerView.ViewHolder viewHolder, int pos) {}
  8. }
  1. OnItemSwipeListener onItemSwipeListener = new OnItemSwipeListener() {
  2. @Override
  3. public void onItemSwipeStart(RecyclerView.ViewHolder viewHolder, int pos) {}
  4. @Override
  5. public void clearView(RecyclerView.ViewHolder viewHolder, int pos) {}
  6. @Override
  7. public void onItemSwiped(RecyclerView.ViewHolder viewHolder, int pos) {}
  8. };

adapter需要继承BaseItemDraggableAdapter

  1. public class ItemDragAdapter extends BaseItemDraggableAdapter<String, BaseViewHolder> {
  2. public ItemDragAdapter(List data) {
  3. super(R.layout.item_draggable_view, data);
  4. }
  5. @Override
  6. protected void convert(BaseViewHolder helper, String item) {
  7. helper.setText(R.id.tv, item);
  8. }
  9. }

Activity使用代码

  1. mAdapter = new ItemDragAdapter(mData);
  2. ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemDragAndSwipeCallback(mAdapter));
  3. itemTouchHelper.attachToRecyclerView(mRecyclerView);
  4. // 开启拖拽
  5. mAdapter.enableDragItem(itemTouchHelper, R.id.textView, true);
  6. mAdapter.setOnItemDragListener(onItemDragListener);
  7. // 开启滑动删除
  8. mAdapter.enableSwipeItem();
  9. mAdapter.setOnItemSwipeListener(onItemSwipeListener);

默认不支持多个不同的 ViewType 之间进行拖拽,如果开发者有所需求,重写ItemDragAndSwipeCallback里的onMove()方法,return true即可

分组的伸缩栏

代码

  1. // if you don't want to extent a class, you can also use the interface IExpandable. AbstractExpandableItem is just a helper class.
  2. public class Level0Item extends AbstractExpandableItem<Level1Item> {...}
  3. public class Level1Item extends AbstractExpandableItem<Person> {...}
  4. public class Person {...}

adapter需要继承BaseMultiItemQuickAdapter

  1. public class ExpandableItemAdapter extends BaseMultiItemQuickAdapter<MultiItemEntity, BaseViewHolder> {
  2. public ExpandableItemAdapter(List<MultiItemEntity> data) {
  3. super(data);
  4. addItemType(TYPE_LEVEL_0, R.layout.item_expandable_lv0);
  5. addItemType(TYPE_LEVEL_1, R.layout.item_expandable_lv1);
  6. addItemType(TYPE_PERSON, R.layout.item_text_view);
  7. }
  8. @Override
  9. protected void convert(final BaseViewHolder holder, final MultiItemEntity item) {
  10. switch (holder.getItemViewType()) {
  11. case TYPE_LEVEL_0:
  12. ....
  13. //set view content
  14. holder.itemView.setOnClickListener(new View.OnClickListener() {
  15. @Override
  16. public void onClick(View v) {
  17. int pos = holder.getAdapterPosition();
  18. if (lv0.isExpanded()) collapse(pos);
  19. else expand(pos);
  20. }});
  21. break;
  22. case TYPE_LEVEL_1: // similar with level 0
  23. break;
  24. case TYPE_PERSON: //just set the content
  25. break;
  26. }
  27. }

Activity使用代码

  1. public class ExpandableUseActivity extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. ...
  5. ArrayList<MultiItemEntity> list = generateData();
  6. ExpandableItemAdapter adapter = new ExpandableItemAdapter(list);
  7. mRecyclerView.setAdapter(adapter);
  8. }
  9. private ArrayList<MultiItemEntity> generateData() {
  10. ArrayList<MultiItemEntity> res = new ArrayList<>();
  11. for (int i = 0; i < lv0Count; i++) {
  12. Level0Item lv0 = new Level0Item(...);
  13. for (int j = 0; j < lv1Count; j++) {
  14. Level1Item lv1 = new Level1Item(...);
  15. for (int k = 0; k < personCount; k++) {
  16. lv1.addSubItem(new Person());
  17. }
  18. lv0.addSubItem(lv1);
  19. }
  20. res.add(lv0);
  21. }
  22. return res;
  23. }
  24. }

自定义BaseViewHolder

之前的写法:public class QuickAdapter extends BaseQuickAdapter

现在的写法:public class QuickAdapter extends BaseQuickAdapter

注意:需要单独建一个外部类继承BaseViewHolder,否则部分机型会出现ClassCastException

案例

  1. public class BRVAHActivity extends Activity implements BaseQuickAdapter.RequestLoadMoreListener, SwipeRefreshLayout.OnRefreshListener {
  2. private List<String> mDatas;
  3. private RecyclerView mRecyclerView;
  4. private PullToRefreshAdapter mAdapter;
  5. private SwipeRefreshLayout mSwipeRefreshLayout;

  6. private static final int TOTAL_COUNTER = 18;
  7. private static final int PAGE_SIZE = 6;
  8. private static final int DELAY_MILLIS = 1000;
  9. private int mCurrentCounter = 0;

  10. private boolean isErr;
  11. private boolean mLoadMoreEndGone = false;

  12. @Override
  13. protected void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);

  15. setContentView(R.layout.activity_main);
  16. mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeLayout);
  17. mSwipeRefreshLayout.setOnRefreshListener(this);
  18. mSwipeRefreshLayout.setColorSchemeColors(Color.rgb(47, 223, 189));

  19. mRecyclerView = (RecyclerView) findViewById(R.id.rv);
  20. mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

  21. initDate();
  22. initAdapter();

  23. ImageView headView = new ImageView(this);
  24. headView.setImageResource(R.mipmap.ic_launcher);
  25. mAdapter.addHeaderView(headView);
  26. }

  27. private void initDate() {
  28. mDatas = new ArrayList<String>();
  29. for (int i = 'A'; i < 'z'; i++) {
  30. mDatas.add("" + (char) i);
  31. }
  32. }

  33. private void initAdapter() {
  34. mAdapter = new PullToRefreshAdapter();
  35. mAdapter.setOnLoadMoreListener(this, mRecyclerView);
  36. mAdapter.openLoadAnimation(BaseQuickAdapter.SLIDEIN_RIGHT);//动画
  37. mAdapter.setPreLoadNumber(3);//预加载
  38. mRecyclerView.setAdapter(mAdapter);
  39. mCurrentCounter = mAdapter.getData().size();

  40. //item点击事件
  41. mAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
  42. @Override
  43. public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
  44. Toast.makeText(BRVAHActivity.this, "onItemClick" + position, Toast.LENGTH_SHORT).show();
  45. }
  46. });
  47. //item中View的点击事件
  48. mAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
  49. @Override
  50. public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
  51. Toast.makeText(BRVAHActivity.this, "onItemChildClick" + position, Toast.LENGTH_SHORT).show();
  52. }
  53. });
  54. }

  55. @Override
  56. public void onLoadMoreRequested() {
  57. mSwipeRefreshLayout.setEnabled(false);
  58. if (mAdapter.getData().size() < PAGE_SIZE) {
  59. mAdapter.loadMoreEnd(true);
  60. } else {
  61. if (mCurrentCounter >= TOTAL_COUNTER) {
  62. //pullToRefreshAdapter.loadMoreEnd();//default visible
  63. mAdapter.loadMoreEnd(mLoadMoreEndGone);//true is gone,false is visible
  64. } else {
  65. if (isErr) {
  66. mAdapter.addData("新数据");
  67. mCurrentCounter = mAdapter.getData().size();
  68. mAdapter.loadMoreComplete();
  69. } else {
  70. isErr = true;
  71. Toast.makeText(BRVAHActivity.this, "错误", Toast.LENGTH_LONG).show();
  72. mAdapter.loadMoreFail();
  73. }
  74. }
  75. mSwipeRefreshLayout.setEnabled(true);
  76. }
  77. }

  78. @Override
  79. public void onRefresh() {
  80. mAdapter.setEnableLoadMore(false);//禁止加载
  81. new Handler().postDelayed(new Runnable() {
  82. @Override
  83. public void run() {
  84. mAdapter.setNewData(mDatas);
  85. isErr = false;
  86. mCurrentCounter = PAGE_SIZE;
  87. mSwipeRefreshLayout.setRefreshing(false);
  88. mAdapter.setEnableLoadMore(true);//启用加载
  89. }
  90. }, DELAY_MILLIS);
  91. }

  92. class PullToRefreshAdapter extends BaseQuickAdapter<String, BaseViewHolder> {
  93. public PullToRefreshAdapter() {
  94. super(R.layout.item2, mDatas);
  95. }

  96. @Override
  97. protected void convert(BaseViewHolder helper, String item) {
  98. helper.setText(R.id.id_num, item)
  99. .setImageResource(R.id.iv, R.drawable.actionbar_add_icon)
  100. .addOnClickListener(R.id.iv);
  101. }
  102. }
  103. }

2017-5-31

RV BaseRecyclerViewAdapterHelper 总结 MD的更多相关文章

  1. RV ItemDecoration 分割线 简介 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. RV 多样式 MultiType 聊天界面 消息类型 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. RV LayoutManager 流式布局 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. 【Android - MD】之CoordinatorLayout的使用

    CoordinatorLayout是Android 5.0新特性--Material Design中的一个布局控件,主要用来协调各个子视图之间的工作,也可以用来作为顶部布局.CoordinatorLa ...

  5. RecyclerView 判断滑到底部 顶部 预加载 更多 分页 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  6. RecyclerView 数据刷新的几种方式 局部刷新 notify MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  7. 【Android - 控件】之MD - CoordinatorLayout的使用

    CoordinatorLayout是Android 5.0新特性——Material Design中的一个布局控件,主要用来协调各个子视图之间的工作,也可以用来作为顶部布局.CoordinatorLa ...

  8. 好用的Markdown编辑器一览 readme.md 编辑查看

    https://github.com/pandao/editor.md https://pandao.github.io/editor.md/examples/index.html Editor.md ...

  9. github上readme.md 格式

    参考:https://github.com/guoyunsky/Markdown-Chinese-Demo/edit/master/README.md

随机推荐

  1. loadrunner测试ajax框架

    loadrunner测试ajax框架的系统时,录制回放都没有报错,但是回放后系统中没有产生数据,解决方法 loadrunnerajax框架测试脚本headerajax [问题描述]用loadrunne ...

  2. bzoj 1452 二维树状数组

    #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk mak ...

  3. Centos7 Openldap主从配置

    转载 https://blog.csdn.net/htvxjl02/article/details/80336788 Centos7 Openldap主从配置 2018年05月16日 15:09:57 ...

  4. thinkphp5.0模块设计

    5.0版本对模块的功能做了灵活设计,默认采用多模块的架构,并且支持单一模块设计,所有模块的命名空间均以app作为根命名空间(可配置更改). 目录结构 标准的应用和模块目录结构如下: ├─applica ...

  5. Jquery 官网下载流程

    选中解压版本,然后把ctrl+s保存另存为他的min版本

  6. Codeforces 722C(并查集 + 思维)

    本文链接:http://www.cnblogs.com/Ash-ly/p/5932712.html 题目链接:http://codeforces.com/problemset/problem/722/ ...

  7. NBUT 1221 Intermediary

    最短路,三进制状态压缩. $dis[i][j]$表示到$i$节点,每个中介用了几次的情况下的最小花费,跑最短路即可. #include<cstdio> #include<cstrin ...

  8. 【BZOJ 2510】 2510: 弱题 (矩阵乘法、循环矩阵的矩阵乘法)

    2510: 弱题 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 374  Solved: 196 Description 有M个球,一开始每个球均有一 ...

  9. ubuntu16.04.2安装完后重启报错[sda] Assuming drive cache: write through

    原因:检测主机的物理连接线,发生问题时"已连接"未勾选,重启的时候找不到iso文件 解决办法:勾选"已连接",重启机器成功

  10. 两个矩阵相加 Exercise08_05

    import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年12月 * 题目:两个矩阵相加 * */ public class Exercise08_0 ...