文章目录

  • 前言
  • 一、效果图
  • 二、实现步骤
    • 1.相关layout
    • 2.相关adapter
    • 3.自定义view
    • 4.activity实现
  • 总结

前言

此功能为两个listview相互联动,左边listview点击右边联动,右边listview滑动联动左侧listview,仿饿了吗点餐列表


提示:以下是本篇文章正文内容,下面案例可供参考

一、效果图

二、实现步骤

1.相关layout

1:主界面layout,两个listview,右侧listview自定义的:

   <LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_above="@+id/rela_button"android:layout_below="@+id/linear_top"android:layout_marginTop="10dp"android:layout_marginBottom="2dp"android:orientation="horizontal"><ListViewandroid:id="@+id/left_listview"android:layout_width="84dp"android:layout_height="match_parent"android:background="#ffffff"android:divider="@null"android:scrollbars="none" /><com.example.mobilecashier.view.PinnedHeaderListViewandroid:id="@+id/pinnedListView"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginLeft="10dp"android:background="#ffffff"></com.example.mobilecashier.view.PinnedHeaderListView></LinearLayout>

2.左侧listview的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="match_parent"android:background="#EBEDF0"android:orientation="vertical" ><TextView android:id="@+id/left_list_item"android:layout_width="match_parent"android:layout_height="60dp"android:padding="12dp"android:gravity="center_vertical"android:textColor="#444444"/></LinearLayout>

2.右侧侧listview的item布局

<?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:background="#ffffff"android:padding="6dp"><ImageViewandroid:id="@+id/imageItem"android:layout_width="50dp"android:layout_height="50dp"android:scaleType="fitXY"android:src="@drawable/pic"/><TextViewandroid:id="@+id/textItem"android:layout_width="wrap_content"android:layout_height="50dp"android:gravity="center_vertical"android:paddingLeft="6dp"android:layout_toRightOf="@+id/imageItem"android:textColor="#444444" />
</RelativeLayout>

2.相关adapter

1:左侧adapter

package com.example.mobilecashier.adapter;import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;import com.example.mobilecashier.R;/*** 左侧Adapter*/
public class LeftListAdapter extends BaseAdapter {private String[] leftStr;boolean[] flagArray;private Context context;public LeftListAdapter(Context context, String[] leftStr, boolean[] flagArray) {this.leftStr = leftStr;this.context = context;this.flagArray = flagArray;}@Overridepublic int getCount() {return leftStr.length;}@Overridepublic Object getItem(int arg0) {return leftStr[arg0];}@Overridepublic long getItemId(int arg0) {return arg0;}@Overridepublic View getView(int arg0, View arg1, ViewGroup arg2) {Holder holder = null;if (arg1 == null) {holder = new Holder();arg1 = LayoutInflater.from(context).inflate(R.layout.left_list_item, null);holder.left_list_item = (TextView) arg1.findViewById(R.id.left_list_item);arg1.setTag(holder);} else {holder = (Holder) arg1.getTag();}holder.updataView(arg0);return arg1;}private class Holder {private TextView left_list_item;public void updataView(final int position) {left_list_item.setText(leftStr[position]);if (flagArray[position]) {left_list_item.setBackgroundColor(Color.rgb(255, 255, 255));} else {left_list_item.setBackgroundColor(Color.TRANSPARENT);}}}
}

2:右侧adapter

package com.example.mobilecashier.adapter;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;import com.example.mobilecashier.R;/*** 基本功能:右侧Adapter*/
public class MainSectionedAdapter extends SectionedBaseAdapter {private Context mContext;private String[] leftStr;private String[][] rightStr;public MainSectionedAdapter(Context context, String[] leftStr, String[][] rightStr) {this.mContext = context;this.leftStr = leftStr;this.rightStr = rightStr;}@Overridepublic Object getItem(int section, int position) {return rightStr[section][position];}@Overridepublic long getItemId(int section, int position) {return position;}@Overridepublic int getSectionCount() {return leftStr.length;}@Overridepublic int getCountForSection(int section) {return rightStr[section].length;}@Overridepublic View getItemView(final int section, final int position, View convertView, ViewGroup parent) {RelativeLayout layout = null;if (convertView == null) {LayoutInflater inflator = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);layout = (RelativeLayout) inflator.inflate(R.layout.right_list_item, null);} else {layout = (RelativeLayout) convertView;}((TextView) layout.findViewById(R.id.textItem)).setText(rightStr[section][position]);layout.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {Toast.makeText(mContext, rightStr[section][position], Toast.LENGTH_SHORT).show();}});return layout;}@Overridepublic View getSectionHeaderView(int section, View convertView, ViewGroup parent) {LinearLayout layout = null;if (convertView == null) {LayoutInflater inflator = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);layout = (LinearLayout) inflator.inflate(R.layout.header_item, null);} else {layout = (LinearLayout) convertView;}layout.setClickable(false);((TextView) layout.findViewById(R.id.textItem)).setText(leftStr[section]);return layout;}}

3:继承adapter

package com.example.mobilecashier.adapter;import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;import com.example.mobilecashier.view.PinnedHeaderListView;public abstract class SectionedBaseAdapter extends BaseAdapter implements PinnedHeaderListView.PinnedSectionedHeaderAdapter {private static int HEADER_VIEW_TYPE = 0;private static int ITEM_VIEW_TYPE = 0;/*** Holds the calculated values of @{link getPositionInSectionForPosition}*/private SparseArray<Integer> mSectionPositionCache;/*** Holds the calculated values of @{link getSectionForPosition}*/private SparseArray<Integer> mSectionCache;/*** Holds the calculated values of @{link getCountForSection}*/private SparseArray<Integer> mSectionCountCache;/*** Caches the item count*/private int mCount;/*** Caches the section count*/private int mSectionCount;public SectionedBaseAdapter() {super();mSectionCache = new SparseArray<Integer>();mSectionPositionCache = new SparseArray<Integer>();mSectionCountCache = new SparseArray<Integer>();mCount = -1;mSectionCount = -1;}@Overridepublic void notifyDataSetChanged() {mSectionCache.clear();mSectionPositionCache.clear();mSectionCountCache.clear();mCount = -1;mSectionCount = -1;super.notifyDataSetChanged();}@Overridepublic void notifyDataSetInvalidated() {mSectionCache.clear();mSectionPositionCache.clear();mSectionCountCache.clear();mCount = -1;mSectionCount = -1;super.notifyDataSetInvalidated();}@Overridepublic final int getCount() {if (mCount >= 0) {return mCount;}int count = 0;for (int i = 0; i < internalGetSectionCount(); i++) {count += internalGetCountForSection(i);count++; // for the header view}mCount = count;return count;}@Overridepublic final Object getItem(int position) {return getItem(getSectionForPosition(position), getPositionInSectionForPosition(position));}@Overridepublic final long getItemId(int position) {return getItemId(getSectionForPosition(position), getPositionInSectionForPosition(position));}@Overridepublic final View getView(int position, View convertView, ViewGroup parent) {if (isSectionHeader(position)) {return getSectionHeaderView(getSectionForPosition(position), convertView, parent);}return getItemView(getSectionForPosition(position), getPositionInSectionForPosition(position), convertView, parent);}@Overridepublic final int getItemViewType(int position) {if (isSectionHeader(position)) {return getItemViewTypeCount() + getSectionHeaderViewType(getSectionForPosition(position));}return getItemViewType(getSectionForPosition(position), getPositionInSectionForPosition(position));}@Overridepublic final int getViewTypeCount() {return getItemViewTypeCount() + getSectionHeaderViewTypeCount();}public final int getSectionForPosition(int position) {// first try to retrieve values from cacheInteger cachedSection = mSectionCache.get(position);if (cachedSection != null) {return cachedSection;}int sectionStart = 0;for (int i = 0; i < internalGetSectionCount(); i++) {int sectionCount = internalGetCountForSection(i);int sectionEnd = sectionStart + sectionCount + 1;if (position >= sectionStart && position < sectionEnd) {mSectionCache.put(position, i);return i;}sectionStart = sectionEnd;}return 0;}public int getPositionInSectionForPosition(int position) {// first try to retrieve values from cacheInteger cachedPosition = mSectionPositionCache.get(position);if (cachedPosition != null) {return cachedPosition;}int sectionStart = 0;for (int i = 0; i < internalGetSectionCount(); i++) {int sectionCount = internalGetCountForSection(i);int sectionEnd = sectionStart + sectionCount + 1;if (position >= sectionStart && position < sectionEnd) {int positionInSection = position - sectionStart - 1;mSectionPositionCache.put(position, positionInSection);return positionInSection;}sectionStart = sectionEnd;}return 0;}public final boolean isSectionHeader(int position) {int sectionStart = 0;for (int i = 0; i < internalGetSectionCount(); i++) {if (position == sectionStart) {return true;} else if (position < sectionStart) {return false;}sectionStart += internalGetCountForSection(i) + 1;}return false;}public int getItemViewType(int section, int position) {return ITEM_VIEW_TYPE;}public int getItemViewTypeCount() {return 1;}public int getSectionHeaderViewType(int section) {return HEADER_VIEW_TYPE;}public int getSectionHeaderViewTypeCount() {return 1;}public abstract Object getItem(int section, int position);public abstract long getItemId(int section, int position);public abstract int getSectionCount();public abstract int getCountForSection(int section);public abstract View getItemView(int section, int position, View convertView, ViewGroup parent);public abstract View getSectionHeaderView(int section, View convertView, ViewGroup parent);private int internalGetCountForSection(int section) {Integer cachedSectionCount = mSectionCountCache.get(section);if (cachedSectionCount != null) {return cachedSectionCount;}int sectionCount = getCountForSection(section);mSectionCountCache.put(section, sectionCount);return sectionCount;}private int internalGetSectionCount() {if (mSectionCount >= 0) {return mSectionCount;}mSectionCount = getSectionCount();return mSectionCount;}}

3.自定义view

package com.example.mobilecashier.view;import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.HeaderViewListAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;import com.example.mobilecashier.adapter.SectionedBaseAdapter;public class PinnedHeaderListView extends ListView implements OnScrollListener {private OnScrollListener mOnScrollListener;public static interface PinnedSectionedHeaderAdapter {public boolean isSectionHeader(int position);public int getSectionForPosition(int position);public View getSectionHeaderView(int section, View convertView, ViewGroup parent);public int getSectionHeaderViewType(int section);public int getCount();}private PinnedSectionedHeaderAdapter mAdapter;private View mCurrentHeader;private int mCurrentHeaderViewType = 0;private float mHeaderOffset;private boolean mShouldPin = true;private int mCurrentSection = 0;private int mWidthMode;private int mHeightMode;public PinnedHeaderListView(Context context) {super(context);super.setOnScrollListener(this);}public PinnedHeaderListView(Context context, AttributeSet attrs) {super(context, attrs);super.setOnScrollListener(this);}public PinnedHeaderListView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);super.setOnScrollListener(this);}public void setPinHeaders(boolean shouldPin) {mShouldPin = shouldPin;}@Overridepublic void setAdapter(ListAdapter adapter) {mCurrentHeader = null;mAdapter = (PinnedSectionedHeaderAdapter) adapter;super.setAdapter(adapter);}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {if (mOnScrollListener != null) {mOnScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);}if (mAdapter == null || mAdapter.getCount() == 0 || !mShouldPin || (firstVisibleItem < getHeaderViewsCount())) {mCurrentHeader = null;mHeaderOffset = 0.0f;for (int i = firstVisibleItem; i < firstVisibleItem + visibleItemCount; i++) {View header = getChildAt(i);if (header != null) {header.setVisibility(VISIBLE);}}return;}firstVisibleItem -= getHeaderViewsCount();int section = mAdapter.getSectionForPosition(firstVisibleItem);int viewType = mAdapter.getSectionHeaderViewType(section);mCurrentHeader = getSectionHeaderView(section, mCurrentHeaderViewType != viewType ? null : mCurrentHeader);ensurePinnedHeaderLayout(mCurrentHeader);mCurrentHeaderViewType = viewType;mHeaderOffset = 0.0f;for (int i = firstVisibleItem; i < firstVisibleItem + visibleItemCount; i++) {if (mAdapter.isSectionHeader(i)) {View header = getChildAt(i - firstVisibleItem);float headerTop = header.getTop();float pinnedHeaderHeight = mCurrentHeader.getMeasuredHeight();header.setVisibility(VISIBLE);if (pinnedHeaderHeight >= headerTop && headerTop > 0) {mHeaderOffset = headerTop - header.getHeight();} else if (headerTop <= 0) {header.setVisibility(INVISIBLE);}}}invalidate();}@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {if (mOnScrollListener != null) {mOnScrollListener.onScrollStateChanged(view, scrollState);}}private View getSectionHeaderView(int section, View oldView) {boolean shouldLayout = section != mCurrentSection || oldView == null;View view = mAdapter.getSectionHeaderView(section, oldView, this);if (shouldLayout) {// a new section, thus a new header. We should lay it out againensurePinnedHeaderLayout(view);mCurrentSection = section;}return view;}private void ensurePinnedHeaderLayout(View header) {if (header.isLayoutRequested()) {int widthSpec = MeasureSpec.makeMeasureSpec(getMeasuredWidth(), mWidthMode);int heightSpec;ViewGroup.LayoutParams layoutParams = header.getLayoutParams();if (layoutParams != null && layoutParams.height > 0) {heightSpec = MeasureSpec.makeMeasureSpec(layoutParams.height, MeasureSpec.EXACTLY);} else {heightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);}header.measure(widthSpec, heightSpec);header.layout(0, 0, header.getMeasuredWidth(), header.getMeasuredHeight());}}@Overrideprotected void dispatchDraw(Canvas canvas) {super.dispatchDraw(canvas);if (mAdapter == null || !mShouldPin || mCurrentHeader == null)return;int saveCount = canvas.save();canvas.translate(0, mHeaderOffset);canvas.clipRect(0, 0, getWidth(), mCurrentHeader.getMeasuredHeight()); // needed// for// <// HONEYCOMBmCurrentHeader.draw(canvas);canvas.restoreToCount(saveCount);}@Overridepublic void setOnScrollListener(OnScrollListener l) {mOnScrollListener = l;}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);mWidthMode = MeasureSpec.getMode(widthMeasureSpec);mHeightMode = MeasureSpec.getMode(heightMeasureSpec);}public void setOnItemClickListener(OnItemClickListener listener) {super.setOnItemClickListener(listener);}public static abstract class OnItemClickListener implements AdapterView.OnItemClickListener {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int rawPosition, long id) {SectionedBaseAdapter adapter;if (adapterView.getAdapter().getClass().equals(HeaderViewListAdapter.class)) {HeaderViewListAdapter wrapperAdapter = (HeaderViewListAdapter) adapterView.getAdapter();adapter = (SectionedBaseAdapter) wrapperAdapter.getWrappedAdapter();} else {adapter = (SectionedBaseAdapter) adapterView.getAdapter();}int section = adapter.getSectionForPosition(rawPosition);int position = adapter.getPositionInSectionForPosition(rawPosition);if (position == -1) {onSectionClick(adapterView, view, section, id);} else {onItemClick(adapterView, view, section, position, id);}}public abstract void onItemClick(AdapterView<?> adapterView, View view, int section, int position, long id);public abstract void onSectionClick(AdapterView<?> adapterView, View view, int section, long id);}
}

4.activity实现

//全局变量private boolean isScroll = true;ListView left_listview;//左侧列表PinnedHeaderListView pinnedListView;//右侧列表private LeftListAdapter adapter;private String[] leftStr = new String[]{"面食类", "盖饭", "寿司", "烧烤", "酒水", "凉菜", "小吃", "粥", "休闲"};private boolean[] flagArray = {true, false, false, false, false, false, false, false, false};private String[][] rightStr = new String[][]{{"热干面", "臊子面", "烩面"},{"番茄鸡蛋", "红烧排骨", "农家小炒肉"},{"芝士", "丑小丫", "金枪鱼"}, {"羊肉串", "烤鸡翅", "烤羊排"}, {"长城干红", "燕京鲜啤", "青岛鲜啤"},{"拌粉丝", "大拌菜", "菠菜花生"}, {"小食组", "紫薯"},{"小米粥", "大米粥", "南瓜粥", "玉米粥", "紫米粥"}, {"儿童小汽车", "悠悠球", "熊大", " 熊二", "光头强"}};/*** 实例化*/private void instantiation() {left_listview = findViewById(R.id.left_listview);pinnedListView = findViewById(R.id.pinnedListView);final MainSectionedAdapter sectionedAdapter = new MainSectionedAdapter(this, leftStr, rightStr);pinnedListView.setAdapter(sectionedAdapter);adapter = new LeftListAdapter(this, leftStr, flagArray);left_listview.setAdapter(adapter);left_listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) {isScroll = false;for (int i = 0; i < leftStr.length; i++) {if (i == position) {flagArray[i] = true;} else {flagArray[i] = false;}}adapter.notifyDataSetChanged();int rightSection = 0;for (int i = 0; i < position; i++) {rightSection += sectionedAdapter.getCountForSection(i) + 1;}pinnedListView.setSelection(rightSection);}});pinnedListView.setOnScrollListener(new AbsListView.OnScrollListener() {@Overridepublic void onScrollStateChanged(AbsListView arg0, int scrollState) {switch (scrollState) {// 当不滚动时case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:// 判断滚动到底部if (pinnedListView.getLastVisiblePosition() == (pinnedListView.getCount() - 1)) {left_listview.setSelection(ListView.FOCUS_DOWN);}// 判断滚动到顶部if (pinnedListView.getFirstVisiblePosition() == 0) {left_listview.setSelection(0);}break;}}int y = 0;int x = 0;int z = 0;@Overridepublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {if (isScroll) {for (int i = 0; i < rightStr.length; i++) {if (i == sectionedAdapter.getSectionForPosition(pinnedListView.getFirstVisiblePosition())) {flagArray[i] = true;x = i;} else {flagArray[i] = false;}}if (x != y) {adapter.notifyDataSetChanged();y = x;if (y == left_listview.getLastVisiblePosition()) {//                            z = z + 3;left_listview.setSelection(z);}if (x == left_listview.getFirstVisiblePosition()) {//                            z = z - 1;left_listview.setSelection(z);}if (firstVisibleItem + visibleItemCount == totalItemCount - 1) {left_listview.setSelection(ListView.FOCUS_DOWN);}}} else {isScroll = true;}}});}

补贴一个header_item的布局

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="#EBEDF0"android:orientation="horizontal"><TextViewandroid:id="@+id/textItem"android:layout_width="wrap_content"android:layout_height="30dp"android:layout_gravity="center_vertical"android:layout_marginLeft="10dp"android:gravity="center_vertical"android:paddingLeft="6dp"android:textColor="#444444" />
</LinearLayout>

总结

以上就是listview两级联动全部代码,如有指教私信我。

Android之两级联动点餐列表相关推荐

  1. bootstrap select 插件两级联动

    2019独角兽企业重金招聘Python工程师标准>>> bootstrap select 插件两级联动 插件地址:http://silviomoreto.github.io/boot ...

  2. 完整绘制echarts地图并实现两级联动(区-乡镇)

    本篇文章会记录如何完成地图两级联动,以及过程中遇到的一些问题,希望能帮到大家! 1.环境  <script src="https://s1.pstatp.com/cdn/expire- ...

  3. 安卓ListView选中后保持高亮状态,且两级联动带图标(升级版)

    在项目开发过程中,遇到了使用listView需要让选中项保持高亮状态(即选中状态保持不变),且数据是二级联动.由于item点击过后瞬间颜色就会恢复原状,视觉上感觉没有选中,此demo中通过改变选中后i ...

  4. 怎么给el-select两级联动赋值_医保改革:支付范围、支付标准、支付方式的联动,大有可为...

    文 | 码万祺投稿邮箱:yiyao@yidu.sinanet.com◆  ◆  ◆提到医保支付改革,一般首先想到医保支付方式改革,比如火热进行的住院DRGs.DIP及门诊按人头付费.按绩效付费等.笔者 ...

  5. DropDownList and ListBox 两级联动菜单

    有时候我们需要用到DropDownList 和Listbox作为连接菜单,第一个改变触发第二个数据绑定 然后获取选取值(这步很重要,往往很多能得到数据,但是却不被选中) 首先来看DropDownLis ...

  6. 全国车牌号所属地JSON(省及城市两级联动)

    [{"label": "北京","value": "京" }, {"label": "天津 ...

  7. layui实现动态获取两级联动数据

    效果图 功能描述:页面加载时动态获取一级类别数据,根据一级类别选中的数据项动态获取二级类别的数据,并回显. html模板 <div class="layui-inline"& ...

  8. 使用 RecyclerView 做点餐列表联动页面

    使用 RecyclerView 做点餐列表联动页面 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近刚换了工作,来到一家做了11年餐饮软件管理的公司,开发平板端点餐安卓端原生app.因为之前 ...

  9. 安卓学习UI组件-ExpandablelistView-可拓展的两级列表

    2019独角兽企业重金招聘Python工程师标准>>> 4个文件,1个class,2个布局 activity_main.xml <?xml version="1.0& ...

最新文章

  1. typeorm 更新_再热我们也在更新 - Midway 8 月内容汇总
  2. 源码编译安装nginx1.4.7
  3. 20-ESP8266 SDK开发基础入门篇--C# TCP客户端编写 , 加入数据通信
  4. Windows phone 8 学习笔记(5) 图块与通知
  5. ML之NB:基于NB朴素贝叶斯算法训练20类新闻文本数据集进行多分类预测
  6. 这是我的2018年终总结,你的呢?
  7. Html table 实现Excel多格粘贴
  8. stotybord如何添加子视图_Revit软件技巧合集(建筑构件、视图处理、建筑表现、高级技巧)...
  9. 海龟绘图两小时上手C语言 - 4 任意螺旋线
  10. java中res是什么意思_java中的set是什么意思
  11. ftp文件推送 linux_Linux 终端访问 FTP 及 上传下载 文件
  12. netstat命令详解
  13. MySQL 分区表——《高性能MySQL》
  14. 02进程学习之并发,时钟中断,单道程序设计和多道程序设计的区别
  15. 【启动程序是无法加载 libnsl.so.1】
  16. Java 下载Excel打不开是什么鬼
  17. matlabrobert锐化_matlab梯度法中5种图像锐化方法分别对一幅图像实现锐化。
  18. 能耗在线监测系统在酒店节能管理中的应用
  19. 8款最佳的开源在线学习CMS系统
  20. 牵线搭桥!让用户更高效地完成表单填写

热门文章

  1. cs231 yacs配置文件工具的使用
  2. 两大美女代言《极品飞车11》11月发布
  3. 北邮 2009网研复试题 六选四(回忆版)
  4. 关闭Mac顽固的开机启动程序
  5. 如虎添翼!一款强大的本地文件全文搜索工具
  6. Canvas基础知识1
  7. 达梦数据库DM8之导入导出参数详解
  8. 筑情送温暖 携爱迎新春
  9. 【SSH】SSH自动断开连接的原因和解决办法|SSH保持长连接方法
  10. 加油站防雷防浪涌设计方案