版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[+]

前言:这段时间真是忙啊忙啊忙,元旦三天假加了两天班,已经连续六周只放一天了,天天加班到十点多,真是有一口血吐在屏幕上的感觉了,博客也积了好多,今天继续。无论人生有多艰难,梦想这个东西还是要坚持的。

相关文章:

1、《详解Dialog(一)——基础元素构建》
2、《详解Dialog(二)——有关列表的构建》
3、《详解Dialog(三)——自定义对话框视图及参数传递》

上篇给大家讲了Dialog的基本元素的构建方法,今天给大家说说有关列表对话框的构建。本篇讲的所有列表项都是通过系统自带的函数生成的,对于完全自定义对话框的方法,我们会在最后一篇讲。

列表对话框主要有四种:普通列表、单选列表、双选列表、自定义视图的列表,下面我们一个个来分析。

一、普通列表

普通列表的样式是这样的:

要实现这样的列表样式,是通过下面的方法来实现的:

  1. builder.setItems(CharSequence[] items, DialogInterface.OnClickListener listener)
  2. builder.setItems(int itemsId, DialogInterface.OnClickListener listener)

这两种方法实现的效果都是一样的,

  1. setItems(CharSequence[] items, DialogInterface.OnClickListener listener)

这个items传进去的是一个字符串数组;

  1. setItems(int itemsId, DialogInterface.OnClickListener listener)

这个传进去的一个itemsId,是在XML中定义好的一个字符串数组资源的ID;

下面,我们一个个看看他们的具体用法:

1、字符串数组

下面是上图是实现上图效果的代码:

  1. String[] mItems = {"item0", "item1", "itme2", "item3", "itme4", "item5", "item6"};
  2. AlertDialog.Builder builder = new AlertDialog.Builder(MyActivity.this);
  3. builder.setIcon(R.drawable.ic_launcher);
  4. builder.setTitle("使用列表字符串");
  5. builder.setItems(mItems, new DialogInterface.OnClickListener() {
  6. @Override
  7. public void onClick(DialogInterface dialog, int which) {
  8. Toast.makeText(MyActivity.this, "clicked:" + which, Toast.LENGTH_LONG).show();
  9. }
  10. });
  11. builder.create();
  12. builder.show();

可以看到首先构造一个mItems数组,然后在buidler.setItems直接传进去就好了。至于DialogInterface.OnClickListener(){}函数就是对点击事件的监听,which表示当前点击的是哪个ITEM的索引。

2、字符串资源ID

首先在xml文件夹下建一个字符串资源XML,命名为:array.xml,位置如图:

然后定义一段字符串数组:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <string-array name="dialog_items">
  4. <item>王菲</item>
  5. <item>王力宏</item>
  6. <item>帅哥</item>
  7. <item>美女</item>
  8. </string-array>
  9. </resources>

下面就是利用SetItem来生成列表了:

  1. AlertDialog.Builder builder = new AlertDialog.Builder(MyActivity.this);
  2. builder.setIcon(R.drawable.ic_launcher);
  3. builder.setTitle("使用Resource ID");
  4. builder.setItems(R.array.dialog_items, new DialogInterface.OnClickListener() {
  5. @Override
  6. public void onClick(DialogInterface dialog, int which) {
  7. Toast.makeText(MyActivity.this, "clicked:" + which, Toast.LENGTH_LONG).show();
  8. }
  9. });
  10. builder.create();
  11. builder.show();

在这里的SetItems时直接将我们字符串数组的name直接设置进去,出来的效果就是这样的:

二、单选列表

单选列表的样式是这样的:

要实现单选列表,主要是通过下面四个其中之一来实现的:

方法一:

  1. setSingleChoiceItems(CharSequence[] items, int checkedItem, DialogInterface.OnClickListener listener)

与上面一样,传进去一个字符串数组,和初始化时选中的ITEM,构造一个单选列表
方法二:

  1. setSingleChoiceItems (int itemsId, int checkedItem, DialogInterface.OnClickListener listener)

同样,与上面的例子相同,这里传进去的是一个字符串数组的资源ID,字符串数组的构造方法与上面相同,就不再赘述

方法三:

  1. setSingleChoiceItems (ListAdapter adapter, int checkedItem, DialogInterface.OnClickListener listener)


个方法是最难理解的方法,因为这里的ListAdapter并不能是普通的Adapter,不信你传一个Adapter,保证出来只是你自己的ITEM视
图,旁边的单选按钮却出不来,其实这里的Adapter只是重写单选按钮旁的文字的样式,并不支持所有的Adapter,这个我会在本文最后讲述。
方法四:

  1. setSingleChoiceItems (Cursor cursor, int checkedItem, String labelColumn, DialogInterface.OnClickListener listener)

这里通过传进去一个Cursor来构造对应的字符串数组,可以是数据库Cursor,也可以其它系统自带的数据Cursor,但基本上用不到,就不再讲了
好了,关于方法三,因为下面会接着讲SetAdapter的知识,所以这部分我留在最后再讲,这里先讲下方法一和方法二:

方法一和方法二,与上例没什么区别,下面我就以方法一以例来讲讲上面的效果图是怎么实现的吧:

代码如下:

  1. String[] mItems = {"攻", "受", "全能型", "不告诉你"};
  2. AlertDialog.Builder builder = new AlertDialog.Builder(MyActivity.this);
  3. builder.setIcon(R.drawable.ic_launcher);
  4. builder.setTitle("你懂的");
  5. builder.setSingleChoiceItems(mItems, 0, new DialogInterface.OnClickListener() {
  6. @Override
  7. public void onClick(DialogInterface dialog, int which) {
  8. // TODO Auto-generated method stub
  9. Toast.makeText(MyActivity.this, "clicked:" + which, Toast.LENGTH_LONG).show();
  10. }
  11. });
  12. builder.create();
  13. builder.show();

很简单,构造一个mItems的String字符串,然后直接传进去setSingleChoiceItems中,默认选中第一个,即索引是0的项。

三、多选列表

先看看效果图:

自带的多选构造函数有如下几个:

方法一:

  1. setMultiChoiceItems (CharSequence[] items, boolean[] checkedItems, DialogInterface.OnMultiChoiceClickListener listener)

一样,传进去一个ITEMS数组和对应的项目的选中与否状态的数组;

方法二:

  1. setMultiChoiceItems (int itemsId, boolean[] checkedItems, DialogInterface.OnMultiChoiceClickListener listener)

这里传进去的是一个字符串数组,与第一部分相同

方法三:

  1. setMultiChoiceItems (Cursor cursor, String isCheckedColumn, String labelColumn, DialogInterface.OnMultiChoiceClickListener listener)

同样,这里传进去的是一个CURSOR,可以是数据库的指针,也可以是系统自带数据的指针,基本不怎么用,就不讲了

下面以方法一为例看看多选列表的构造过程:

  1. String[] mItems = {"经常犯二", "傻叉一枚", "逗逼", "小清纯", "沉稳大叔", "有时可爱"};
  2. AlertDialog.Builder builder = new AlertDialog.Builder(MyActivity.this);
  3. builder.setIcon(R.drawable.ic_launcher);
  4. builder.setTitle("性格类型");
  5. builder.setMultiChoiceItems(mItems,
  6. new boolean[]{false, false, false, false, false, false, false},
  7. new DialogInterface.OnMultiChoiceClickListener() {
  8. @Override
  9. public void onClick(DialogInterface dialog, int which, boolean isChecked) {
  10. Toast.makeText(MyActivity.this, "clicked:" + which, Toast.LENGTH_LONG).show();
  11. }
  12. }
  13. );
  14. builder.show();

这里构造了两个数组,一个是字符串数组,另一个每项对应是否选中的boolean数组

  1. String[] mItems = {"经常犯二", "傻叉一枚", "逗逼", "小清纯", "沉稳大叔", "有时可爱"};

对应的选中项的布尔值数组:

  1. new boolean[]{false, false, false, false, false, false, false}

四、自定义列表项

这节我带大家自定义列表项的实现,故名思义,就是每个ITEM都是我们自己来定义,使用我们自己的Adapter,先看看效果:


要实现自定义列表主要是造下面这个函数来实现的:

  1. setAdapter (ListAdapter adapter, DialogInterface.OnClickListener listener)

直接将我们构造好的Adapter设置进去。

下面就带大家实现下图示中的视图:

1、构造Adapter

有关派生自BaseAdapter来构造ListViewAdapter的过程就不再细讲了,大家可以参考我以前的两篇文章:

1、《List控件使用---SimpleAdapter使用详解(一)》

2、《BaseAdapter——convertView回收机制与动态控件响应》


一篇现在看来着实太烂了,一直想重写又没时间来做,大家可以再搜搜网上的其它相关文章来学一下有关BaseAdapter的相关内容吧。第二篇有关
convertView的回收机制写的还是挺不错的,大家可以仔细看看,相信会对ListView的机制有一个更清晰的理解。废话不多说了,下面言转正
转,看看我们这里的ListAdapter的构造过程:

首先是单个Item的布局:(list_item.xml)

很简单,采用水平布局,左边一个图像,右边一个对应的TEXT,这里只是基本实现功能,大家完全可以在理解这篇文章的基础上派生出更复杂的视图

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="horizontal"
  4. android:layout_width="wrap_content"
  5. android:layout_height="match_parent">
  6. <ImageView
  7. android:id="@+id/item_imageview"
  8. android:layout_width="80dip"
  9. android:layout_height="80dip"
  10. android:scaleType="fitCenter"/>
  11. <TextView
  12. android:id="@+id/item_text"
  13. android:layout_width="wrap_content"
  14. android:layout_height="match_parent"
  15. android:gravity="center_vertical|left"
  16. android:textSize="20sp"/>
  17. </LinearLayout>

对应的视图类:

  1. private class ViewHolder{
  2. public TextView mTvTitle;
  3. public ImageView mImageView;
  4. }

其中有两个变量,一个存储对应的TextView,另一个存储对应的ImageView;

现在我们还需要一个类来存储视图类中TextView的标题字符串,和对应ImageView的图片资源的ID值,这就是我们的数据类:

  1. public static class DataHolder{
  2. public String title;
  3. public int ImageID;
  4. public DataHolder(String title,int imageID){
  5. this.title = title;
  6. this.ImageID = imageID;
  7. }
  8. }

我们先阶段性的看看我们的ListViewAdapter:

首先是派生自BaseAdapter,然后是构造函数,我们传进去一个DataHolder的列表,用来存储每个Item应该显示的内容

  1. public class ListItemAdapter extends BaseAdapter {
  2. private List<DataHolder> mDataList = new ArrayList<DataHolder>();
  3. private LayoutInflater mInflater;
  4. public ListItemAdapter(Context context, ArrayList<DataHolder> datalist) {
  5. if (datalist != null && datalist.size() > 0) {
  6. mDataList.addAll(datalist);
  7. }
  8. mInflater = LayoutInflater.from(context);
  9. }
  10. ………………
  11. }

然后是最关键的getView部分:

  1. public View getView(int position, View convertView, ViewGroup viewGroup) {
  2. ViewHolder holder = null;
  3. if (convertView == null) {
  4. holder=new ViewHolder();
  5. convertView = mInflater.inflate(R.layout.list_item, null);
  6. holder.mTvTitle = (TextView)convertView.findViewById(R.id.item_text);
  7. holder.mImageView = (ImageView)convertView.findViewById(R.id.item_imageview);
  8. convertView.setTag(holder);
  9. }else {
  10. holder = (ViewHolder)convertView.getTag();
  11. }
  12. holder.mImageView.setImageResource(mDataList.get(position).ImageID);
  13. holder.mTvTitle.setText(mDataList.get(position).title);
  14. return convertView;
  15. }

首先是通过covertView的tag来获取重复利用的convertView,这什么要这么写,看《BaseAdapter——convertView回收机制与动态控件响应》
然后是利用传进来的数据,初始化列表Item:

  1. holder.mImageView.setImageResource(mDataList.get(position).ImageID);
  2. holder.mTvTitle.setText(mDataList.get(position).title);

最后返回convertView,让系统去做绘图
到这里ListViewAdapter的构造过程就基本完成了,下面是完整的代码:

  1. /**
  2. * Created by harvic
  3. * date 2015-1-11
  4. * */
  5. public class ListItemAdapter extends BaseAdapter {
  6. private List<DataHolder> mDataList = new ArrayList<DataHolder>();
  7. private LayoutInflater mInflater;
  8. public ListItemAdapter(Context context,ArrayList<DataHolder> datalist){
  9. if (datalist != null && datalist.size()>0){
  10. mDataList.addAll(datalist);
  11. }
  12. mInflater = LayoutInflater.from(context);
  13. }
  14. @Override
  15. public int getCount() {
  16. return mDataList.size();
  17. }
  18. @Override
  19. public Object getItem(int position) {
  20. return mDataList.get(position);
  21. }
  22. @Override
  23. public long getItemId(int position) {
  24. return position;
  25. }
  26. @Override
  27. public View getView(int position, View convertView, ViewGroup viewGroup) {
  28. ViewHolder holder = null;
  29. if (convertView == null) {
  30. holder=new ViewHolder();
  31. convertView = mInflater.inflate(R.layout.list_item, null);
  32. holder.mTvTitle = (TextView)convertView.findViewById(R.id.item_text);
  33. holder.mImageView = (ImageView)convertView.findViewById(R.id.item_imageview);
  34. convertView.setTag(holder);
  35. }else {
  36. holder = (ViewHolder)convertView.getTag();
  37. }
  38. holder.mImageView.setImageResource(mDataList.get(position).ImageID);
  39. holder.mTvTitle.setText(mDataList.get(position).title);
  40. return convertView;
  41. }
  42. private class ViewHolder{
  43. public TextView mTvTitle;
  44. public ImageView mImageView;
  45. }
  46. public static class DataHolder{
  47. public String title;
  48. public int ImageID;
  49. public DataHolder(String title,int imageID){
  50. this.title = title;
  51. this.ImageID = imageID;
  52. }
  53. }
  54. }

2、构造列表

在MainActivity中,首先是初始化我们的ListViewAdapter,要初始化Adapter,就要首先传进去一个DataHolder的数组,所有要先构造一个DataHolder的数组

  1. private ArrayList<ListItemAdapter.DataHolder> initDataHolder(){
  2. ArrayList<ListItemAdapter.DataHolder> datalist = new ArrayList<ListItemAdapter.DataHolder>();
  3. ListItemAdapter.DataHolder data_1 = new ListItemAdapter.DataHolder("可爱萌宠1", R.drawable.animal1);
  4. ListItemAdapter.DataHolder data_2 = new ListItemAdapter.DataHolder("可爱萌宠2", R.drawable.animal2);
  5. ListItemAdapter.DataHolder data_3 = new ListItemAdapter.DataHolder("可爱萌宠3", R.drawable.animal3);
  6. ListItemAdapter.DataHolder data_4 = new ListItemAdapter.DataHolder("可爱萌宠4", R.drawable.animal4);
  7. datalist.add(data_1);
  8. datalist.add(data_2);
  9. datalist.add(data_3);
  10. datalist.add(data_4);
  11. return datalist;
  12. }

在构造完成数据列表之后,下面就是构造我们的自定义的列表了,我把整个对话框显示过程整合成了一个函数createCustomList,代码如下:

  1. private void createCustomList() {
  2. ArrayList<ListItemAdapter.DataHolder> dataHolders = initDataHolder();
  3. ListItemAdapter adapter = new ListItemAdapter(MyActivity.this, dataHolders);
  4. AlertDialog.Builder builder = new AlertDialog.Builder(MyActivity.this);
  5. builder.setIcon(R.drawable.ic_launcher);
  6. builder.setTitle("可爱萌宠");
  7. builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
  8. @Override
  9. public void onClick(DialogInterface dialogInterface, int which) {
  10. Toast.makeText(MyActivity.this, "clicked:" + which, Toast.LENGTH_LONG).show();
  11. }
  12. });
  13. builder.create();
  14. builder.show();
  15. }

OK啦,到这,整个自列表项的内容就讲完了,下面再回过来给大家说说上面我们提到的有关单选列表自定义Adapter的问题。

五、有关单选列表自定义Adapter

这里主要讲的函数是第二部分单选列表中的方法三:

  1. setSingleChoiceItems (ListAdapter adapter, int checkedItem, DialogInterface.OnClickListener listener)

在第四部分,我们构造了一个ListAdapter,这里需要的也是同样的一个ListAdapter,那我们直接将第四部分中的Adapter传进去,会是什么效果呢?

也就是利用下面的代码:

我们直接在createCustomList()上面改一下,即把builder.setAdapter()直接换成setSingleChoiceItems() ,传进去Adpter,看看在我们定义的视图后面会不会出现一个单选按钮呢?

  1. private void createCustomList() {
  2. ArrayList<ListItemAdapter.DataHolder> dataHolders = initDataHolder();
  3. ListItemAdapter adapter = new ListItemAdapter(MyActivity.this, dataHolders);
  4. AlertDialog.Builder builder = new AlertDialog.Builder(MyActivity.this);
  5. builder.setIcon(R.drawable.ic_launcher);
  6. builder.setTitle("可爱萌宠");
  7. builder.setSingleChoiceItems(adapter, 0,new DialogInterface.OnClickListener() {
  8. @Override
  9. public void onClick(DialogInterface dialogInterface, int which) {
  10. Toast.makeText(MyActivity.this, "clicked:" + which, Toast.LENGTH_LONG).show();
  11. }
  12. });
  13. builder.create();
  14. builder.show();
  15. }

运行一下,效果是这样的:

看见了没,毛也没有,坑爹玩意,那这个函数到底是用来做什么的呢,在源码中有这样一个文件:

地址在:$android_sdk_home/platforms/Android-x.x/data/res/layout/simple_list_item_single_choice.xml
文件内容是这样的:

  1. <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:id="@+id/single_list_item"
  3. android:layout_width="match_parent"
  4. android:layout_height="?android:attr/listPreferredItemHeightSmall"
  5. android:textAppearance="?android:attr/textAppearanceListItemSmall"
  6. android:gravity="center_vertical"
  7. android:checkMark="?android:attr/listChoiceIndicatorSingle"
  8. android:paddingStart="?android:attr/listPreferredItemPaddingStart"
  9. android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
  10. />

利用这个玩意是可以实现效果的,我们来试一下。

1、新建Adapter

新建一个布局文件,来保存ListVIew的每项的Item,代码如下:

  1. <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:id="@+id/single_list_item"
  3. android:layout_width="match_parent"
  4. android:layout_height="?android:attr/listPreferredItemHeightSmall"
  5. android:textAppearance="?android:attr/textAppearanceListItemSmall"
  6. android:gravity="center_vertical"
  7. android:checkMark="?android:attr/listChoiceIndicatorSingle"
  8. android:paddingStart="?android:attr/listPreferredItemPaddingStart"
  9. android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
  10. />

在Adapter中,同样,用来保存ITEM视图的ViewHolder类,如下:

  1. private class ViewHolder{
  2. public TextView  mName;
  3. }


为在布局中只有一个TextView,所以在ViewHolder中也只需要一个TextView与其对应,至于类似上面的承载对应数据的
DataHolder,因为我们只需要一个String字符串数组就足够了,所以就没必要再新建一个类来承载这些数据了,所以我们要构造Adapter
时,传进来一个字符串数组就好了:

所以简单的构造函数为:

在构造时,传进来我们每项要显示的标题的字符串数组String[] items,并将其直接添加到我们的List<String> mList中。

  1. public class SingleChoiceAdapter extends BaseAdapter {
  2. private LayoutInflater mInflater;
  3. private List<String> mList = new ArrayList<String>();
  4. public SingleChoiceAdapter(Context context, String[] items) {
  5. mInflater = LayoutInflater.from(context);
  6. if (items == null || items.length <= 0) {
  7. return;
  8. }
  9. for (String item : items) {
  10. mList.add(item);
  11. }
  12. }
  13. …………
  14. }

然后是最关键的getView()部分:

  1. public View getView(int position, View convertView, ViewGroup viewGroup) {
  2. ViewHolder holder = null;
  3. if (convertView == null) {
  4. holder=new ViewHolder();
  5. convertView = mInflater.inflate(R.layout.single_choice_item, null);
  6. holder.mName = (TextView)convertView.findViewById(R.id.single_list_item);
  7. convertView.setTag(holder);
  8. }else {
  9. holder = (ViewHolder)convertView.getTag();
  10. }
  11. holder.mName.setText(mList.get(position));
  12. return convertView;
  13. }

这段代码难度不大,就是每次绘图时,将TextView的内容设置为我们指定的字符串:

  1. holder.mName.setText(mList.get(position));

下面是SingleChoiceAdapter完整的代码:

  1. /**
  2. * Created by harvic
  3. * date 2015-1-11
  4. */
  5. public class SingleChoiceAdapter extends BaseAdapter {
  6. private LayoutInflater mInflater;
  7. private List<String> mList = new ArrayList<String>();
  8. public SingleChoiceAdapter(Context context,String[] items){
  9. mInflater = LayoutInflater.from(context);
  10. if (items == null || items.length<=0){
  11. return;
  12. }
  13. for(String item:items){
  14. mList.add(item);
  15. }
  16. }
  17. @Override
  18. public int getCount() {
  19. return mList.size();
  20. }
  21. @Override
  22. public Object getItem(int position) {
  23. return mList.get(position);
  24. }
  25. @Override
  26. public long getItemId(int position) {
  27. return position;
  28. }
  29. @Override
  30. public View getView(int position, View convertView, ViewGroup viewGroup) {
  31. ViewHolder holder = null;
  32. if (convertView == null) {
  33. holder=new ViewHolder();
  34. convertView = mInflater.inflate(R.layout.single_choice_item, null);
  35. holder.mName = (TextView)convertView.findViewById(R.id.single_list_item);
  36. convertView.setTag(holder);
  37. }else {
  38. holder = (ViewHolder)convertView.getTag();
  39. }
  40. holder.mName.setText(mList.get(position));
  41. return convertView;
  42. }
  43. private class ViewHolder{
  44. public TextView  mName;
  45. }
  46. }

然后就是使用的阶段了

2、构造单选列表

这里首先构造SingleChoiceAdapter的实例,然后将其传入setSingleChoiceItems中,代码如下:

  1. String[] mItems = {"攻", "受", "全能型", "不告诉你"};
  2. SingleChoiceAdapter adapter = new SingleChoiceAdapter(MyActivity.this,mItems);
  3. AlertDialog.Builder builder = new AlertDialog.Builder(MyActivity.this);
  4. builder.setIcon(R.drawable.ic_launcher);
  5. builder.setTitle("可爱萌宠");
  6. builder.setSingleChoiceItems(adapter, 0, new DialogInterface.OnClickListener() {
  7. @Override
  8. public void onClick(DialogInterface dialogInterface, int which) {
  9. Toast.makeText(MyActivity.this, "clicked:" + which, Toast.LENGTH_LONG).show();
  10. }
  11. });
  12. builder.create();
  13. builder.show();

运行出来的效果如图:


看到没,这里效果是出来了,可见,在单选按钮中,定义Adapter并不是随便定义的,只能定义CheckedTextView的视图,其它是不支持的!!!!

好了,到这里本篇就结束了,下篇给大家讲讲有关自定义对话框的内容。

如果本文有帮到你,记得关注哦

源码下载地址:http://download.csdn.net/detail/harvic880925/8355683

请大家尊重原创者版权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/42528663 谢谢!

详解Dialog(二)——有关列表的构建的更多相关文章

  1. CMake 手册详解(二十)

    SirDigit CMake 手册详解(二十) CMD#51: list 列表操作命令. list(LENGTH <list> <output variable>) list( ...

  2. HTML标签----图文详解(二)

    HTML标签超详细的图文演示再来一波~~~ 如果还没有看过昨天的福利的,那可要抓紧喽,传送门:HTML标签----图文详解 本文主要内容 列表标签 表格标签 框架标签及内嵌框架<iframe&g ...

  3. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

    原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日 ...

  4. iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)

    转载自:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-two.html 一. 概况 本文接着 iOS 开 ...

  5. JAVA9模块化详解(二)——模块的使用

    JAVA9模块化详解(二)--模块的使用 二.模块的使用 各自的模块可以在模块工件中定义,要么就是在编译期或者运行期嵌入的环境中.为了提供可靠的配置和强健的封装性,在分块的模块系统中利用他们,必须确定 ...

  6. Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能

    Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSD ...

  7. Linux DTS(Device Tree Source)设备树详解之二(dts匹配及发挥作用的流程篇)【转】

    转自:https://blog.csdn.net/radianceblau/article/details/74722395 版权声明:本文为博主原创文章,未经博主允许不得转载.如本文对您有帮助,欢迎 ...

  8. 「翻译」Unity中的AssetBundle详解(二)

    为AssetBundles准备资源 使用AssetBundles时,您可以随意将任何Asset分配给所需的任何Bundle.但是,在设置Bundles时,需要考虑一些策略.这些分组策略可以使用到任何你 ...

  9. MySQL之SQL优化详解(二)

    目录 MySQL之SQL优化详解(二) 1. SQL的执行顺序 1.1 手写顺序 1.2 机读顺序 2. 七种join 3. 索引 3.1 索引初探 3.2 索引分类 3.3 建与不建 4. 性能分析 ...

随机推荐

  1. Java 基本的递归写法

    1.首先我们得有一个树状结构的表,类似这种结构.必须得有 id,pid  其他的根据需要来. 我们叫它treeTbl表吧.这里pid为0的表示是顶级节点. 2.接着select * from tree ...

  2. Vue掉坑记

    本文章汇总学习过程中掉入和不理解的坑,会持续更新,请保持关注 1.过滤器类 搜索过滤 2.修饰符 修饰符汇总 3.webpack webpack+vuecli打包路径 4.Vue后台管理框架 组件后台 ...

  3. dubbo之多版本

    当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用. 可以按照以下的步骤进行版本迁移: 在低压力时间段,先升级一半提供者为新版本 再将所有消费者升级为新版本 然后将剩下的 ...

  4. 使用replace pioneer批量修改文件名

    shell的正则表达式还是很难记忆的,也没有沉静的心情看文档,于是使用了replace pioneer. 1.  启动replace pioneer,Tools->batch runner  , ...

  5. 【sqli-labs】 less8 GET - Blind - Boolian Based - Single Quotes (基于布尔的单引号GET盲注)

    加单引号 没有任何信息输出 加and 页面变化,不正常是没有任何回显 http://localhost/sqli/Less-8/?id=1' and '1'='1 http://localhost/s ...

  6. 进行https通信时服务器端下发的是一个证书链

    进行https通信时服务器端下发的是一个证书链,否则无法验证证书的有效性.

  7. Cache占用过多内存导致Linux系统内存不足问题排查

    问题描述 Linux服务器内存使用量超过阈值,触发报警. 问题排查 首先,通过free命令观察系统的内存使用情况,显示如下: total used free shared buffers cached ...

  8. C#那20道题

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. [bzoj4477 Jsoi2015]字符串树 (可持久化trie)

    传送门 Solution 复习下tire( ̄▽ ̄)/ 裸的可持久化tire,我用树剖求了下LCA Code #include <cstdio> #include <cstring&g ...

  10. java链接linux服务器,命令操作

    1.本地读取linux文件,即在Windows上链接外部linux package com.common.utils; import java.io.BufferedReader; import ja ...