UI组件之AdapterView及其子类(六)ExpandableListView组件和ExpandableListActivity的使用
ExpandableListView是ListView的子类,他在ListView上进行了扩展,它把列表项分成了几组,每组里包含了多个列表项
ExpandableListView的列表项是由ExpandableListAdapter提供的,实现ExpandableListAdapter三种常用方式,常用的ExpandableListAdapter子类如下:
1,扩展BaseExpandableListAdapter实现ExpandableListAdapter
2,使用SimpleExpandableListAdapter将 两个List集合包装成ExpandableListAdapter
3,使用SimpleCursorTreeAdapter将Cursor中的数据包装成SimpleCursorTreeAdapter
ExpandableListAdapter及其子类的继承关系类图看这篇文章讲的比较好,看懂了:http://hubingforever.blog.163.com/blog/static/1710405792010538823477/
ExpandableListView的xml属性:
android:childDivider 指定个组内各子列表项之间的分隔条
android:childIndicator 显示子列表项旁边的Drawble对象
android:groupIndicator 显示组列表项旁边的Drawble对象
ExpandableListView是android中可以实现下拉list的一个控件,是一个垂直滚动的心事两个级别列表项手风琴试图,列表项是来自ExpandableListViewaAdapter,组可以单独展开。
重要方法:
<span style="font-size:24px;">expandGroup (int groupPos) ;//在分组列表视图中 展开一组,
setSelectedGroup (int groupPosition) ;//设置选择指定的组。
setSelectedChild (int groupPosition, int childPosition, boolean shouldExpandGroup);//设置选择指定的子项。
getPackedPositionGroup (long packedPosition);//返回所选择的组
getPackedPositionForChild (int groupPosition, int childPosition) ;//返回所选择的子项
getPackedPositionType (long packedPosition);//返回所选择项的类型(Child,Group)
isGroupExpanded (int groupPosition);//判断此组是否展开</span>
<span style="font-size:24px;">expandableListView.setDivider();这个是设定每个Group之间的分割线。
expandableListView.setGroupIndicator();这个是设定每个Group之前的那个图标。
expandableListView.collapseGroup(int group); 将第group组收起</span>
一,使用扩展BaseExpandableListAdapter来提供数据源
扩展BaseExpandableListAdapter需要重写11个方法:
* getGroupCount(),返回包含组列表的数量
* getChildrenCount(int groupPosition),返回包含组列表的数量
*
* getGroup(int groupPosition),返回组列表的对象
* getChild(int groupPosition, int childPosition),返回组列表下的子列表对象
*
* getGroupId(int groupPosition),返回组列表Id
* getChildId(int groupPosition, int childPosition),返回祖列表的子列表的Id
* 下面两个属性很重要!
* getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent),该方法决定每个组选项的外观、
* getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent),该方法决定每个子选项的外观、
*isChildSelectable(int groupPosition,
int childPosition):如果child添加监听事件,则要返回true
Main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/root"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><!--ExpandableListView组件android:childDivider 指定个组内各子列表项之间的分隔条android:childIndicator 显示子列表项旁边的Drawble对象android:groupIndicator 显示组列表项旁边的Drawble对象--><ExpandableListViewandroid:id="@+id/expandableListView1"android:layout_width="match_parent"android:layout_height="wrap_content"android:childDivider="#f0f"></ExpandableListView></LinearLayout>
MainActivity.java
package com.hust.expandablelistview;import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.LayoutParams;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);BaseExpandableListAdapter bela=new BaseExpandableListAdapter(){ /*自动实现这10个方法* getGroupCount(),返回包含组列表的数量* getChildrenCount(int groupPosition),返回包含组列表的数量* * getGroup(int groupPosition),返回组列表的对象* getChild(int groupPosition, int childPosition),返回组列表下的子列表对象* * getGroupId(int groupPosition),返回组列表Id* getChildId(int groupPosition, int childPosition),返回祖列表的子列表的Id* * getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent),该方法决定每个组选项的外观、* getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent),该方法决定每个子选项的外观、* * * */int[] logos=new int[]{R.drawable.p,R.drawable.z,R.drawable.t};//组列表的数量private String[] armTypes=new String[]{"我的好友","高中同学","大学同学"};//组列表下的子列表项,可扩展的ExpandableListView是个二维数组private String[][] arms=new String[][]{{"狂战士","龙骑士","黑暗圣堂","电兵"},{"张娜","李四","赵龙","钱爽"},{"王燕","刘涛","张坦克","汪明城"}};//返回包含组列表的数量@Overridepublic int getGroupCount() {// TODO Auto-generated method stubreturn armTypes.length;}//返回组位置下的子列表项的数量@Overridepublic int getChildrenCount(int groupPosition) {// TODO Auto-generated method stubreturn arms[groupPosition].length;}//返回组列表的对象@Overridepublic Object getGroup(int groupPosition) {// TODO Auto-generated method stubreturn armTypes[groupPosition];}//返回组列表下的子列表对象@Overridepublic Object getChild(int groupPosition, int childPosition) {// TODO Auto-generated method stubreturn arms[groupPosition][childPosition];}//返回组列表Id@Overridepublic long getGroupId(int groupPosition) {// TODO Auto-generated method stubreturn groupPosition;}//返回祖列表的子列表的Id@Overridepublic long getChildId(int groupPosition, int childPosition) {// TODO Auto-generated method stubreturn childPosition;}@Overridepublic boolean hasStableIds() {// TODO Auto-generated method stubreturn true;}//该方法决定每个组选项的外观、这里这定义组列表布局,也可以用xml文件@Overridepublic View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent) {// TODO Auto-generated method stubLinearLayout ll=new LinearLayout(MainActivity.this);ll.setOrientation(0);ImageView logo=new ImageView(MainActivity.this);logo.setImageResource(logos[groupPosition]);TextView textview=getTextView();textview.setText(getGroup(groupPosition).toString());ll.addView(logo);ll.addView(textview);return ll; }//设置TextView的参数private TextView getTextView() {// TODO Auto-generated method stubAbsListView.LayoutParams lp=new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,64);TextView textview=new TextView(MainActivity.this);textview.setLayoutParams(lp);//设置布局参数,android:layout_Width="match_parent",android:layout_Height="64"textview.setGravity(Gravity.CENTER_VERTICAL|Gravity.LEFT);//android:gravity="CENTER_VERTICAL|LEFT"textview.setPadding(36, 0, 0, 0);textview.setTextSize(16); //android:textsize="20dp" return textview;}//该方法决定每个子选项的外观@Overridepublic View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {// TODO Auto-generated method stubTextView text=getTextView();text.setText(getChild(groupPosition,childPosition).toString()); return text;}@Overridepublic boolean isChildSelectable(int groupPosition,int childPosition) {// TODO Auto-generated method stubreturn true;}};ExpandableListView expandablelistview=(ExpandableListView) findViewById(R.id.expandableListView1);//设置adapterexpandablelistview.setAdapter(bela);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}
}
二,使用SimpleExpandableListAdapter显示ExpandableListView
SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter( this, gruops, R.drawable.expandablelistview_groups, new String[]{"group"}, new int[]{R.id.textGroup}, childs, R.drawable.expandablelistview_child, new String[]{"child"}, new int[]{R.id.textChild} );
* 参数1.上下文对象Context
* 参数2.一级条目目录集合
* 参数3.一级条目对应的布局文件 (expandablelistview_groups.xml文件
* 参数4.fromto,就是map中的key,指定要显示的对象
* 参数5.与参数4对应,指定要显示在groups中的id
* 参数6.二级条目目录集合
* 参数7.二级条目对应的布局文件
* 参数9.与参数8对应,指定要显示在childs中的id
1,定义一个主界面expandablelistview.xml
<?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:orientation="vertical" ><ExpandableListView android:id ="@+id/expandableListView" android:layout_width ="fill_parent" android:layout_height ="wrap_content" ></ExpandableListView>
</LinearLayout>
2.在res/drawable目录下创建样式文件expandablelistview_groups.xml该界面是组界面:
<?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:orientation="vertical" ><TextViewandroid:id="@+id/textGroup" android:layout_width="fill_parent" android:layout_height="fill_parent" android:paddingLeft="40px" android:paddingTop="6px" android:paddingBottom="6px" android:textSize="15sp" android:text="No data" > </TextView>
</LinearLayout>
3.在res/drawable目录下创建样式文件expandablelistview_child.xml;是子控件,直接显示列表内容
<?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:orientation="vertical" ><TextView android:id="@+id/textChild" android:layout_width="fill_parent" android:layout_height="fill_parent" android:paddingLeft="60px" android:paddingTop="10px" android:paddingBottom="10px" android:textSize="20sp" android:text="No Data" />
</LinearLayout>
ExpandableListViewDemo_two.java
public class ExpandableListViewDemo_two extends Activity {/** Called when the activity is first created. */ private ExpandableListView expandableListView_one;@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.expandablelistview); expandableListView_one =(ExpandableListView)findViewById(R.id.expandableListView); //创建二个一级条目标题 Map<String, String> title_1 = new HashMap<String, String>(); Map<String, String> title_2 = new HashMap<String, String>(); title_1.put("group", "移动开发"); title_2.put("group", "Web开发"); //创建一级条目容器 List<Map<String, String>> gruops = new ArrayList<Map<String,String>>(); gruops.add(title_1); gruops.add(title_2); //创建二级条目内容 //内容一 Map<String, String> content_1 = new HashMap<String, String>(); Map<String, String> content_2 = new HashMap<String, String>(); content_1.put("child", "ANDROID"); content_2.put("child", "IOS"); List<Map<String, String>> childs_1 = new ArrayList<Map<String,String>>(); childs_1.add(content_1); childs_1.add(content_2); //内容二 Map<String, String> content_3 = new HashMap<String, String>(); Map<String, String> content_4 = new HashMap<String, String>(); Map<String, String> content_5 = new HashMap<String, String>(); content_3.put("child", "jsp"); content_4.put("child", "servlet"); content_5.put("child", "page"); List<Map<String, String>> childs_2 = new ArrayList<Map<String,String>>(); childs_2.add(content_3); childs_2.add(content_4); childs_2.add(content_5); //存放两个内容, 以便显示在列表中 List<List<Map<String, String>>> childs = new ArrayList<List<Map<String,String>>>(); childs.add(childs_1); childs.add(childs_2); //创建ExpandableList的Adapter容器
/**
* 使用SimpleExpandableListAdapter显示ExpandableListView
* 参数1.上下文对象Context
* 参数2.一级条目目录集合
* 参数3.一级条目对应的布局文件 (expandablelistview_groups.xml文件
* 参数4.fromto,就是map中的key,指定要显示的对象
* 参数5.与参数4对应,指定要显示在groups中的id
* 参数6.二级条目目录集合
* 参数7.二级条目对应的布局文件
* 参数9.与参数8对应,指定要显示在childs中的id
/ SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter( this, gruops, R.drawable.expandablelistview_groups, new String[]{"group"}, new int[]{R.id.textGroup}, childs, R.drawable.expandablelistview_child, new String[]{"child"}, new int[]{R.id.textChild} ); //加入列表 expandableListView_one.setAdapter(adapter); expandableListView_one.setOnChildClickListener(listener);} private OnChildClickListener listener =new OnChildClickListener() {@Overridepublic boolean onChildClick(ExpandableListView parent, View v,int groupPosition, int childPosition, long id) {// TODO Auto-generated method stubtoast("点击了");return false;}};private void toast(String str) {Toast.makeText(this, str, Toast.LENGTH_LONG).show(); }
}
上面的样式也可以使用系统的自带的样式如下:
android.R.layout.simple_expandable_list_item_1,//层显示样式 ,系统自定义
android.R.layout.simple_expandable_list_item_2,
ExpandableListActivity直接继承了Activity。
1,继承ExpandableListActivity
2,定义好内容ExpandableListAdapter,扩展BaseExpandableListAdapter和SimpleExpandableListAdapter都可以
3,setListAdapter的方法添加adapter
package com.example.expandablelistactivity;import android.app.ExpandableListActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;public class MainActivity extends ExpandableListActivity//继承ExpandableListActivity
{public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);//无需布局文件//自定义扩展BaseExpandableListAdapterExpandableListAdapter adapter = new BaseExpandableListAdapter(){int[] logos = new int[]{R.drawable.p,R.drawable.z,R.drawable.t};//组列表的数量private String[] armTypes=new String[]{"我的好友","高中同学","大学同学"};//组列表下的子列表项,可扩展的ExpandableListView是个二维数组private String[][] arms=new String[][]{{"狂战士","龙骑士","黑暗圣堂","电兵"},{"张娜","李四","赵龙","钱爽"},{"王燕","刘涛","张坦克","汪明城"}};//获取指定组位置、指定子列表项处的子列表项数据@Overridepublic Object getChild(int groupPosition, int childPosition){return arms[groupPosition][childPosition];}@Overridepublic long getChildId(int groupPosition, int childPosition){return childPosition;}@Overridepublic int getChildrenCount(int groupPosition){return arms[groupPosition].length;}private TextView getTextView(){AbsListView.LayoutParams lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 64);TextView textView = new TextView(MainActivity.this);textView.setLayoutParams(lp);textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);textView.setPadding(36, 0, 0, 0);textView.setTextSize(16);return textView;}//该方法决定每个子选项的外观@Overridepublic View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent){TextView textView = getTextView();textView.setText(getChild(groupPosition, childPosition).toString());return textView;}//获取指定组位置处的组数据@Overridepublic Object getGroup(int groupPosition){return armTypes[groupPosition];}@Overridepublic int getGroupCount(){return armTypes.length;}@Overridepublic long getGroupId(int groupPosition){return groupPosition;}//该方法决定每个组选项的外观@Overridepublic View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent){LinearLayout ll = new LinearLayout(MainActivity.this);ll.setOrientation(0);ImageView logo = new ImageView(MainActivity.this);logo.setImageResource(logos[groupPosition]);ll.addView(logo);TextView textView = getTextView();textView.setText(getGroup(groupPosition).toString());ll.addView(textView);return ll;}@Overridepublic boolean isChildSelectable(int groupPosition, int childPosition){return true;}@Overridepublic boolean hasStableIds(){return true;}};// 设置该窗口显示列表setListAdapter(adapter);}
}
附上源码更方便学习:
public class ExpandableListActivity extends Activity implementsOnCreateContextMenuListener,ExpandableListView.OnChildClickListener, ExpandableListView.OnGroupCollapseListener,ExpandableListView.OnGroupExpandListener { ExpandableListAdapter mAdapter;ExpandableListView mList;boolean mFinishedStart = false;/*** Override this to populate the context menu when an item is long pressed. menuInfo* will contain an {@link android.widget.ExpandableListView.ExpandableListContextMenuInfo}* whose packedPosition is a packed position* that should be used with {@link ExpandableListView#getPackedPositionType(long)} and* the other similar methods.* <p>* {@inheritDoc}*/@Overridepublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {}/*** Override this for receiving callbacks when a child has been clicked.* <p>* {@inheritDoc}*/public boolean onChildClick(ExpandableListView parent, View v, int groupPosition,int childPosition, long id) {return false;}/*** Override this for receiving callbacks when a group has been collapsed.*/public void onGroupCollapse(int groupPosition) {}/*** Override this for receiving callbacks when a group has been expanded.*/public void onGroupExpand(int groupPosition) {}/*** Ensures the expandable list view has been created before Activity restores all* of the view states.* *@see Activity#onRestoreInstanceState(Bundle)*/@Overrideprotected void onRestoreInstanceState(Bundle state) {ensureList();super.onRestoreInstanceState(state);}/*** Updates the screen state (current list and other views) when the* content changes.* * @see Activity#onContentChanged()*/@Overridepublic void onContentChanged() {super.onContentChanged();View emptyView = findViewById(com.android.internal.R.id.empty);mList = (ExpandableListView)findViewById(com.android.internal.R.id.list);if (mList == null) {throw new RuntimeException("Your content must have a ExpandableListView whose id attribute is " +"'android.R.id.list'");}if (emptyView != null) {mList.setEmptyView(emptyView);}mList.setOnChildClickListener(this);mList.setOnGroupExpandListener(this);mList.setOnGroupCollapseListener(this);if (mFinishedStart) {setListAdapter(mAdapter);}mFinishedStart = true;}/*** Provide the adapter for the expandable list.*/public void setListAdapter(ExpandableListAdapter adapter) {synchronized (this) {ensureList();mAdapter = adapter;mList.setAdapter(adapter);}}/*** Get the activity's expandable list view widget. This can be used to get the selection,* set the selection, and many other useful functions.* * @see ExpandableListView*/public ExpandableListView getExpandableListView() {ensureList();return mList;}/*** Get the ExpandableListAdapter associated with this activity's* ExpandableListView.*/public ExpandableListAdapter getExpandableListAdapter() {return mAdapter;}private void ensureList() {if (mList != null) {return;}setContentView(com.android.internal.R.layout.expandable_list_content);}/*** Gets the ID of the currently selected group or child.* * @return The ID of the currently selected group or child.*/public long getSelectedId() {return mList.getSelectedId();}/*** Gets the position (in packed position representation) of the currently* selected group or child. Use* {@link ExpandableListView#getPackedPositionType},* {@link ExpandableListView#getPackedPositionGroup}, and* {@link ExpandableListView#getPackedPositionChild} to unpack the returned* packed position.* * @return A packed position representation containing the currently* selected group or child's position and type.*/public long getSelectedPosition() {return mList.getSelectedPosition();}/*** Sets the selection to the specified child. If the child is in a collapsed* group, the group will only be expanded and child subsequently selected if* shouldExpandGroup is set to true, otherwise the method will return false.* * @param groupPosition The position of the group that contains the child.* @param childPosition The position of the child within the group.* @param shouldExpandGroup Whether the child's group should be expanded if* it is collapsed.* @return Whether the selection was successfully set on the child.*/public boolean setSelectedChild(int groupPosition, int childPosition, boolean shouldExpandGroup) {return mList.setSelectedChild(groupPosition, childPosition, shouldExpandGroup);}/*** Sets the selection to the specified group.* @param groupPosition The position of the group that should be selected.*/public void setSelectedGroup(int groupPosition) {mList.setSelectedGroup(groupPosition);}}
UI组件之AdapterView及其子类(六)ExpandableListView组件和ExpandableListActivity的使用相关推荐
- UI组件之AdapterView及其子类关系,Adapter接口及其实现类关系
AdapterView本身是一个抽象基类,它派生的的子类在用法上十分相似.AdapterView直接派生的三个子类:AbsListView,AbsSpinner,AdapterViewAnimator ...
- UI组件之AdapterView及其子类(四)Gallery画廊控件使用
听说 Gallery现在已经不使用了,API使用ViewPaper代替了,以后再学专研ViewPaper吧现在说说Gallery画廊,就是不停显示图片的意思 Gallery是用来水平滚动的显示一系列项 ...
- UI组件之AdapterView及其子类(一)三种Adapter适配器填充ListView
AdapterView的内容一般是包含多项相同格式资源的列表,常用的有5种AdapterView的子类: (1)ListView:简单的列表 (2)Spinner:下拉列表,给用户提供选择 (3)Ga ...
- UI组件之AdapterView及其子类(五)ListView组件和ListActivity
ListView组件是一个显示组件,继承AdapterView基类,前面已经介绍了分别使用ArrayAdapter,SimpleAdapter,扩展BaseAdapter来为LisView提供列表项h ...
- UI组件之AdapterView及其子类(三)Spinner控件详解
Spinner提供了从一个数据集合中快速选择一项值的办法.默认情况下Spinner显示的是当前选择的值,点击Spinner会弹出一个包含所有可选值的dropdown菜单或者一个dialog对话框,从该 ...
- UI组件之AdapterView及其子类(二)GridView网格视图的使用
GridView网格视图属性: android:numColumns="auto_fit" --------列数设置为自动,可以为确定的数值 android:columnWidth ...
- 2.5 UI组件-AdapterView及子类(疯狂android学习笔记)
列表视图(ListView)和ListActivity ①直接使用ListView创建 ②让Activity继承ListActivity(相当于该activity显示的组件为ListView) 提示: ...
- android adapter 组件,Android UI - AdapterView 及其子类
AdapterView AdapterView 是一个抽象类,其派生的子类在用法上十分相似: AdapterView 继承了 ViewGroup: AdapterView 及其子类的继承关系如下: A ...
- android-UI组件(四):AdapterView及其子类
http://blog.csdn.net/litianpenghaha/article/details/23270881 AdapterView组件是一组重要的组件,AdapterView本身是一个抽 ...
最新文章
- Focal Loss升级:让Focal Loss动态化,类别极端不平衡也可以轻松解决
- 3d查看器无法加载三维模型_珠峰登顶成功,送套三维模型给你
- CSS position绝对定位absolute relative
- PHP使用for循环打出星号表格,console - JavaScript中,使用for循环输出如下图形(等腰三角形,和平行四边形)?原理是啥?...
- 【剑指offer】面试题35:复杂链表的复制(Java)
- linux c 编程手册,Linux C/C++编程手册查阅方法
- 京东取消快递员底薪引热议 官方回应:试点更有激励性的业务提成
- CDOJ 485 UESTC 485 	Game (八数码变形,映射,逆cantor展开)
- 清空SQL数据库日志
- utf-8 编码 转换 汉字 字符集
- Smobiler错误记录
- 清除SQL Sever 2008数据库日志
- 纹理(讲得比较详细的文章)
- Miracle2.1 列表页面显示附件链接
- vueh5调用摄像头拍照_HTML5调用摄像头实现拍照功能(兼容各大主流浏览器)
- Nginx通过OpenSSL创建自签名证书配置HTTPS及二级目录
- 服务器向阿里云转移之容器化1.0.1容器建立
- Proxmox kvm关机失败
- HDOJ 2112 HDU Today (最短路 Dijkstra SPFA)
- 杭电ACM2188题
热门文章
- STM32初识——中断初始化过程(by woody)
- 功率电感器基础讲座-第1章-2_转载自村田官网
- Python:docx模块
- 波卡链Substrate (6)Babe协议二“分配slot机制”
- go语言中利用匿名函数和闭包实现文件名修改
- optee对std smc的处理的详解
- linux运维防火墙考题,Linux运维工程师:30道面试题整理 | 张戈博客
- matlab中大figure怎样修改,操作Matlab的Figure窗口(一)
- ida demangled names
- (37)0环与3环通信常规方式,PspTerminateProcess 关闭进程工具