AdapterView:

容器控件,其整体效果由每一个子元素内容决定,子元素的形式由Adapter决定。

AdapterView的子视图对象:

ListView:以垂直滑动列表形式显示一组数据。

GridView:以网格形式显示一组数据。

Spinner:以下拉列表形式显示一组数据。

Gallery:以水平滑动列表形式显示一组数据。(此类已弃用,由HorizontalScrollView和ViewPager代替

Adapter:

数据和视图之间交互的中介

Android中的常用Adapter

ArrayAdapter:最简单的适配器,数据源为文本字符串数组。

SimpleAdapter:简单适配器,数据源结构比较复杂,一般为List<Map>类型对象。 SimpleCursorAdapter:游标适配器,数据源一般为数据库中的数据。

自定义适配器:更灵活的适配器,数据源不定(由用户自行指定),需要继承BaseAdapter抽象类。

代码示例:

ArrayAdapter:

只能展示一行文字的最简单的adapter

使用:

activity_array_adapter:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".arrayAadapter.ArrayAdapterActivity"><ListViewandroid:layout_width="wrap_content"android:layout_height="match_parent"android:id="@+id/list_array"/></LinearLayout>

ArrayAdapterActivity:

package com.example.ch0203adapter.arrayAadapter;
/*
* 只能展现一行文字
* */
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;import com.example.ch0203adapter.R;import java.util.ArrayList;
import java.util.List;public class ArrayAdapterActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_array_adapter);//提供数据
//        String[] strs = {"A","B","C","D","E"};//创建ArrayAdapter
//        ArrayAdapter<String> adapter = new ArrayAdapter<String>
//                (this,android.R.layout.simple_expandable_list_item_1,strs);
//      支持泛型 数据源List<String> data = new ArrayList<String>();data.add("A");data.add("B");ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,data);
//        simple_expandable_list_item_1系统提供的listview模板//获取ListView对象,通过调用setAdapter方法为ListView设置Adapter设置适配器ListView list_test = (ListView) findViewById(R.id.list_array);list_test.setAdapter(adapter);//        绑定事件监听器list_test.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {Log.e("ArrayAdapter","点击了" + position + "条");}});}
}

效果:

simpleAdapter:

1、自定义子项布局文件

simple_list_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:orientation="horizontal"><!-- 定义一个用于显示头像的ImageView --><ImageViewandroid:id="@+id/imgtou"android:layout_width="64dp"android:layout_height="64dp"android:baselineAlignBottom="true"android:paddingLeft="8dp" /><!-- 定义一个竖直方向的LinearLayout,显示姓名和身份--><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid:id="@+id/name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingLeft="8dp"android:textColor="#1D1D1C"android:textSize="20sp" /><TextViewandroid:id="@+id/says"android:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingLeft="8px"android:textColor="#B4B4B9"android:textSize="14sp" /></LinearLayout></LinearLayout>
activity_simple_adapter:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="match_parent"android:layout_height="match_parent"xmlns:android="http://schemas.android.com/apk/res/android" ><ListView android:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/list_simple"/></RelativeLayout>
SimpleAdapterActivity:
package com.example.ch0203adapter.simpleAdapter;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;import com.example.ch0203adapter.R;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class SimpleAdapterActivity extends AppCompatActivity {//    数据源
private String[] names = new String[]{"A", "B", "C"};private String[] says = new String[]{"同学", "老师", "教导主任"};private int[] imgIds = new int[]{R.drawable.head_icon1, R.drawable.head_icon1, R.drawable.head_icon1};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_simple_adapter);List<Map<String, Object>> listitem = new ArrayList<Map<String, Object>>();for (int i = 0; i < names.length; i++) {Map<String, Object> showitem = new HashMap<String, Object>();showitem.put("touxiang", imgIds[i]);showitem.put("name", names[i]);showitem.put("says", says[i]);listitem.add(showitem);}//创建一个simpleAdapterSimpleAdapter myAdapter = new SimpleAdapter(getApplicationContext(), listitem, R.layout.simple_list_item, new String[]{"touxiang", "name", "says"}, new int[]{R.id.imgtou, R.id.name, R.id.says});ListView listView = (ListView) findViewById(R.id.list_simple);listView.setAdapter(myAdapter);}
}

效果:

2、使用内置子项布局文件

activity_simple_adapter:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="match_parent"android:layout_height="match_parent"xmlns:android="http://schemas.android.com/apk/res/android" ><ListView android:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/list_simple"/></RelativeLayout>
SimpleAdapterActivity:
package com.example.ch0203adapter.simpleAdapter;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;import com.example.ch0203adapter.R;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class SimpleAdapterActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_simple_adapter);/*使用内置子项布局文件*/
//准备数据源
List<Map<String,String>> students = new ArrayList<>();Map<String,String> stu1 = new HashMap<>();stu1.put("name", "张三");stu1.put("no","2019010200");students.add(stu1);Map<String,String> stu2 = new HashMap<>();stu2.put("name", "李四");stu2.put("no","2019010201");students.add(stu2);//item布局文件(内置的)//创建Adapter对象SimpleAdapter simpleAdapter = new SimpleAdapter(this,students,//显示的数据源android.R.layout.simple_list_item_2,//item的布局文件new String[]{"name","no"},//Map中的需要显示的数据的key值new int[]{android.R.id.text1,android.R.id.text2});//显示数据的控件的id值//获取ListView并绑定AdapterListView listView = findViewById(R.id.list_simple);listView.setAdapter(simpleAdapter);//绑定事件监听器listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {//点击ListView每一个item都会执行//parent当前的AdapterView对象(ListView对象)//view当前点击的item的视图对象//position用户当前点击的位置下标,从0开始//id值通常同position值一致Log.e("ListView","点击的位置"+position+" 姓名:" + students.get(position).get("name"));//点击某一条时,修改当前item视图的背景颜色view.setBackgroundColor(getResources().getColor(R.color.purple_200));}});
}
}

效果:

自定义Adapter

ListView:

以垂直可滑动列表形式显示子项目的视图容器,是一种AdapterView。

ListView使用的基本流程:

准备ListView每一个子项的视图布局。 可以使用内置的布局,也可以用户自定义布局。

创建Adapter(连接数据源和视图布局)。

为ListView绑定Adapter。

为ListView绑定事件监听器。

代码示例:

student_list_item:  自定义每一个listitem布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:id="@+id/iv_photo"android:layout_width="150dp"android:layout_height="150dp"/><LinearLayoutandroid:layout_centerVertical="true"android:layout_marginLeft="10dp"android:layout_toRightOf="@id/iv_photo"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid:id="@+id/tv_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="30sp"/><TextViewandroid:id="@+id/tv_no"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="25sp"/></LinearLayout><ImageViewandroid:id="@+id/iv_delete"android:layout_width="30dp"android:layout_height="30dp"android:layout_centerVertical="true"android:layout_marginRight="20dp"android:layout_alignParentRight="true"android:src="@drawable/delete"/>
</RelativeLayout>

CustomerAdapter: 自定义Adapter需要继承BaseAdapter

package com.example.ch0203adapter.customerListAdapter;import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;import com.example.ch0203adapter.R;import java.util.ArrayList;
import java.util.List;/*
功能:将数据源同item布局绑定*/
public class CustomAdapter extends BaseAdapter {private List<Student> students = new ArrayList<>();private int layoutResId;private Context context;//环境上下文public CustomAdapter(Context context, List<Student> students,int layoutResId){this.context = context;this.students = students;this.layoutResId = layoutResId;}@Override//获取数据源数据条数public int getCount() {if (null != students){return students.size();}return 0;}@Override//返回每一个item显示的数据对象public Object getItem(int position) {if (null != students){return students.get(position);}return null;}@Override//返回每一个item的id的值public long getItemId(int position) {return position;}@Override//生成每个item的视图对象(最重要)public View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {//加载item的布局文件LayoutInflater layoutInflater = LayoutInflater.from(context);convertView = layoutInflater.inflate(layoutResId, null, false);}//在布局文件的控件中显示数据//获取控件对象的引用ImageView imageView = convertView.findViewById(R.id.iv_photo);TextView tvName = convertView.findViewById(R.id.tv_name);TextView tvNo = convertView.findViewById(R.id.tv_no);ImageView ivDelete = convertView.findViewById(R.id.iv_delete);//设置控件显示的内容tvName.setText(students.get(position).getStuName());tvNo.setText(students.get(position).getStuNo());//设置ImageView显示的图片imageView.setBackgroundResource(students.get(position).getPhotoId());//处理控件的点击事件ivDelete.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//删除数据源中的一条数据students.remove(position);//刷新界面(更新Adapter)notifyDataSetChanged();}});return convertView;}
}

ListActivity: 实现绑定

package com.example.ch0203adapter.customerListAdapter;
/*
* 自定义ListView  学生列表
* */
/*
* 准备ListView每一个子项的视图布局。可以使用内置的布局,也可以用户自定义布局。
*创建Adapter(连接数据源和视图布局)。
*为ListView绑定Adapter。
*为ListView绑定事件监听器。
*/
import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;import com.example.ch0203adapter.R;import java.util.ArrayList;
import java.util.List;public class ListActivity extends AppCompatActivity {private List<Student> students = new ArrayList<>();private CustomAdapter customAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_list);//准备数据源initData();//自定义item的布局文件 student_list_item//初始化ListView,绑定AdapterinitListView();initButton();}public void initData(){Student stu1 = new Student("张三","2019001200",R.drawable.boy);Student stu2 = new Student("李四","2019001202",R.drawable.girl);Student stu3 = new Student("张三","2019001200",R.drawable.boy);Student stu4 = new Student("李四","2019001202",R.drawable.girl);Student stu5 = new Student("李四","2019001202",R.drawable.girl);students.add(stu1);students.add(stu2);students.add(stu3);students.add(stu4);students.add(stu5);}public void initListView(){ListView listView = findViewById(R.id.lv_student);customAdapter = new CustomAdapter(this,students,R.layout.student_list_item);
//        绑定AdapterlistView.setAdapter(customAdapter);
//        绑定事件监听器listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {Log.e("自定义Adapter","点击了" + position + "条");}});}
//    添加按钮点击事件public void initButton(){Button btnAdd = findViewById(R.id.btn_add);btnAdd.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//在数据源中添加一条数据Student stu1 = new Student("王五","2019001202",R.drawable.boy);students.add(stu1);//更新界面customAdapter.notifyDataSetChanged();}});}
}

activity_list:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="match_parent"android:layout_height="match_parent"xmlns:android="http://schemas.android.com/apk/res/android" ><ListView android:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/lv_student"/><Buttonandroid:id="@+id/btn_add"android:layout_alignParentBottom="true"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="添加"/>
</RelativeLayout>

Student:学生实体类

package com.example.ch0203adapter.customerListAdapter;public class Student {private String stuName;private String stuNo;private int photoId;public Student() {}public Student(String stuName, String stuNo, int photoId) {this.stuName = stuName;this.stuNo = stuNo;this.photoId = photoId;}public String getStuName() {return stuName;}public void setStuName(String stuName) {this.stuName = stuName;}public String getStuNo() {return stuNo;}public void setStuNo(String stuNo) {this.stuNo = stuNo;}public int getPhotoId() {return photoId;}public void setPhotoId(int photoId) {this.photoId = photoId;}
}

效果:

GridView网格列表

activity_grid:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".customerGridView.GridActivity"><GridViewandroid:id="@+id/lv_students"android:layout_width="match_parent"android:layout_height="wrap_content"android:numColumns="2" />
<!--每行两个子项--></RelativeLayout>

GridActivity:

package com.example.ch0203adapter.customerGridView;/*
* 与ListView相同
* 网格列表展示学生
* */
import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;import com.example.ch0203adapter.R;
import com.example.ch0203adapter.customerListView.CustomAdapter;
import com.example.ch0203adapter.Student;import java.util.ArrayList;
import java.util.List;public class GridActivity extends AppCompatActivity {private List<Student> students = new ArrayList<>();private CustomAdapter customAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_grid);//准备数据源initData();//自定义item的布局文件 student_list_item//初始化ListView,绑定AdapterinitListView();}public void initData(){Student stu1 = new Student("张三","2019",R.drawable.boy);Student stu2 = new Student("李四","2012",R.drawable.girl);Student stu3 = new Student("张三","2010",R.drawable.boy);Student stu4 = new Student("李四","2020",R.drawable.girl);Student stu5 = new Student("李四","2012",R.drawable.girl);students.add(stu1);students.add(stu2);students.add(stu3);students.add(stu4);students.add(stu5);}public void initListView(){ListView listView = findViewById(R.id.lv_student);customAdapter = new CustomAdapter(this,students,R.layout.student_list_item);
//        绑定AdapterlistView.setAdapter(customAdapter);
//        绑定事件监听器listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {Log.e("自定义Adapter","点击了" + position + "条");}});}}

MyAdapter

package com.example.ch0203adapter.customerGridView;import android.content.Context;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;import java.util.ArrayList;public abstract class MyAdapter<T> extends BaseAdapter {private ArrayList<T> mData;private int mLayoutRes;           //布局idpublic MyAdapter() {}public MyAdapter(ArrayList<T> mData, int mLayoutRes) {this.mData = mData;this.mLayoutRes = mLayoutRes;}@Overridepublic int getCount() {return mData != null ? mData.size() : 0;}@Overridepublic T getItem(int position) {return mData.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = ViewHolder.bind(parent.getContext(), convertView, parent, mLayoutRes, position);bindView(holder, getItem(position));return holder.getItemView();}public abstract void bindView(ViewHolder holder, T obj);//添加一个元素public void add(T data) {if (mData == null) {mData = new ArrayList<>();}mData.add(data);notifyDataSetChanged();}//往特定位置,添加一个元素public void add(int position, T data) {if (mData == null) {mData = new ArrayList<>();}mData.add(position, data);notifyDataSetChanged();}public void remove(T data) {if (mData != null) {mData.remove(data);}notifyDataSetChanged();}public void remove(int position) {if (mData != null) {mData.remove(position);}notifyDataSetChanged();}public void clear() {if (mData != null) {mData.clear();}notifyDataSetChanged();}public static class ViewHolder {private SparseArray<View> mViews;   //存储ListView 的 item中的Viewprivate View item;                  //存放convertViewprivate int position;               //游标private Context context;            //Context上下文//构造方法,完成相关初始化private ViewHolder(Context context, ViewGroup parent, int layoutRes) {mViews = new SparseArray<>();this.context = context;View convertView = LayoutInflater.from(context).inflate(layoutRes, parent, false);convertView.setTag(this);item = convertView;}//绑定ViewHolder与itempublic static ViewHolder bind(Context context, View convertView, ViewGroup parent,int layoutRes, int position) {ViewHolder holder;if (convertView == null) {holder = new ViewHolder(context, parent, layoutRes);} else {holder = (ViewHolder) convertView.getTag();holder.item = convertView;}holder.position = position;return holder;}@SuppressWarnings("unchecked")public <T extends View> T getView(int id) {T t = (T) mViews.get(id);if (t == null) {t = (T) item.findViewById(id);mViews.put(id, t);}return t;}/*** 获取当前条目*/public View getItemView() {return item;}/*** 获取条目位置*/public int getItemPosition() {return position;}/*** 设置文字*/public ViewHolder setText(int id, CharSequence text) {View view = getView(id);if (view instanceof TextView) {((TextView) view).setText(text);}return this;}/*** 设置图片*/public ViewHolder setImageResource(int id, int drawableRes) {View view = getView(id);if (view instanceof ImageView) {((ImageView) view).setImageResource(drawableRes);} else {view.setBackgroundResource(drawableRes);}return this;}/*** 设置点击监听*/public ViewHolder setOnClickListener(int id, View.OnClickListener listener) {getView(id).setOnClickListener(listener);return this;}/*** 设置可见*/public ViewHolder setVisibility(int id, int visible) {getView(id).setVisibility(visible);return this;}/*** 设置标签*/public ViewHolder setTag(int id, Object obj) {getView(id).setTag(obj);return this;}//其他方法可自行扩展}}

Student类同ListView

效果:

Android学习——Adapter适配器相关推荐

  1. android中Adapter适配器的讲解

    android中Adapter适配器的讲解 Adapter(适配器的讲解) 适配器就我自己来看,我觉得这是一个非常重要的知识点,Adapter是用来帮助填出数据的中间桥梁,简单点说吧:将各种数据以合适 ...

  2. Android学习 —— 多种适配器方式实现ListView

    笔记摘要: 本文主要对ListView列表显示的实现进行了分析,对于列表显示,分为两个部分,第一个部分是整体布局,也就是ListView所在的布局,但ListView中的一个个横条Item布局也需要我 ...

  3. Android中Adapter适配器的介绍以及用法的总结

    Adapter(适配器的讲解) 适配器就我自己来看,我觉得这是一个非常重要的知识点,Adapter是用来帮助填出数据的中间桥梁,简单点说吧:将各种数据以合适的形式显示在View中给用户看.Adapte ...

  4. Android学习之适配器SimpleCursorAdapter

    三.   SimpleCursorAdapter与SimpleAdapter用法相近.只是将List对象换成了Cursor对象.而且SimpleCursorAdapter类构造方法的第四个参数from ...

  5. android 之UI 高级控件Adapter(适配器详解)

    了解适配器组件: 适配器是一个连接数据源和AdapterView的桥梁,通过它能有效的实现数据源与AdapterView的分离设置,使AdaptereView与数据的绑定更加简便,修改更加方便. Ad ...

  6. Android中使用Adapter(适配器)给RecycleView设置数据源

    场景 RecyclerView RecyclerView是Android一个更强大的控件,其不仅可以实现和ListView同样的效果,还有优化了ListView中的各种不足.其可以实现数据纵向滚动,也 ...

  7. 设计模式学习笔记——适配器(Adapter)模式

    设计模式学习笔记--适配器(Adapter)模式 @(设计模式)[设计模式, 适配器模式, adapter, 适配器] 设计模式学习笔记适配器Adapter模式 基本介绍 适配器案例 类适配器模式 类 ...

  8. Android适配器以及作用,Android Studio:自定义Adapter(适配器)的一些通俗易懂的理解(以一个简单的聊天界面为例)...

    本文是博主对Adapter(适配器)的一些理解,为了加深对Adapter的理解以及记录自己的阶段学习而写,同时也适合初学者阅读,参考本条博客的逻辑进行学习. 第一  先来看看实现这个程序需要需要创建哪 ...

  9. Android - Adapter 适配器

    Android 适配器 本文介绍两个Adapter: ArrayAdapter:最简单的Adapter,只能展现一行文字. XML文件: <ListViewandroid:id="@+ ...

最新文章

  1. suse 安装mysql5.6_SuSE11安装MySQL5.6.40:RPM安装方式
  2. linux网站目录大小写,Linux服务器url区分大小写如何解决
  3. Python3 模块 -- Fabric自动化模版
  4. python中查看显卡状态
  5. Algorithms_基础数据结构(04)_线性表之链表_单向循环链表约瑟夫环问题
  6. 【数字图像处理】七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解
  7. JavaScript --- 渲染数据量大的数组
  8. luoguP3690 【模板】Link Cut Tree (动态树)[LCT]
  9. php输出echo、print、print_r、printf、sprintf、var_dump比较
  10. Nginx常用命令介绍
  11. CocoaAsyncSocket
  12. 测试用例编号_如何编写一个规范的测试用例?你应该知道的!
  13. 【方法分享】准大学生如何自学C语言?
  14. 树莓派linux声卡设置
  15. SPIR-V 研究:编译器基本原理(二)
  16. 动态网站加速,cdn义不容辞
  17. 计蒜客2018 ICPC SouthEastern European E. Fishermen
  18. 基于JSP的共享单车管理系统的设计与实现
  19. 企业软著申请流程 图文! 纯干货!
  20. 04-SNAP处理Sentinel-2 L2A级数据(二)

热门文章

  1. Android 四大天王-- 三个
  2. python四大器_Python程序库中的四大天王
  3. 2019辞职--找工作--杭州咯
  4. 华为2020校招笔试编程题 看这篇就够了(上)
  5. 改进的节点分析法(Modified Nodal Analysis)
  6. dp——洛谷P1240 诸侯安置
  7. 小明种苹果(100分)
  8. python之Numpy随机抽样
  9. Qt FFmpeg视频播放器开发(二):FFmepg基本使用与视频播放
  10. DialogBox函数参数