1、RecyclerView的基本用法

首先主Activity的布局文件:

[html] view
plain
copy

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <android.support.v7.widget.RecyclerView
  6. android:id="@+id/id_recyclerview_horizontal"
  7. android:layout_width="match_parent"
  8. android:layout_height="120dp"
  9. android:layout_centerVertical="true"
  10. android:background="#FF0000"
  11. android:scrollbars="none" />
  12. </RelativeLayout>

Item的布局文件:

[html] view
plain
copy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="120dp"
  4. android:layout_height="120dp"
  5. android:background="@drawable/item_bg02" >
  6. <ImageView
  7. android:id="@+id/id_index_gallery_item_image"
  8. android:layout_width="80dp"
  9. android:layout_height="80dp"
  10. android:layout_alignParentTop="true"
  11. android:layout_centerHorizontal="true"
  12. android:layout_margin="5dp"
  13. android:scaleType="centerCrop" />
  14. <TextView
  15. android:id="@+id/id_index_gallery_item_text"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"
  18. android:layout_below="@id/id_index_gallery_item_image"
  19. android:layout_centerHorizontal="true"
  20. android:layout_marginBottom="5dp"
  21. android:layout_marginTop="5dp"
  22. android:textColor="#ff0000"
  23. android:text="some info"
  24. android:textSize="12dp" />
  25. </RelativeLayout>

数据适配器:

[java] view
plain
copy

  1. package com.example.zhy_horizontalscrollview03;
  2. import java.util.List;
  3. import android.content.Context;
  4. import android.support.v7.widget.RecyclerView;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.ViewGroup;
  8. import android.widget.ImageView;
  9. import android.widget.TextView;
  10. public class GalleryAdapter extends
  11. RecyclerView.Adapter<GalleryAdapter.ViewHolder>
  12. {
  13. private LayoutInflater mInflater;
  14. private List<Integer> mDatas;
  15. public GalleryAdapter(Context context, List<Integer> datats)
  16. {
  17. mInflater = LayoutInflater.from(context);
  18. mDatas = datats;
  19. }
  20. public static class ViewHolder extends RecyclerView.ViewHolder
  21. {
  22. public ViewHolder(View arg0)
  23. {
  24. super(arg0);
  25. }
  26. ImageView mImg;
  27. TextView mTxt;
  28. }
  29. @Override
  30. public int getItemCount()
  31. {
  32. return mDatas.size();
  33. }
  34. /**
  35. * 创建ViewHolder
  36. */
  37. @Override
  38. public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i)
  39. {
  40. View view = mInflater.inflate(R.layout.activity_index_gallery_item,
  41. viewGroup, false);
  42. ViewHolder viewHolder = new ViewHolder(view);
  43. viewHolder.mImg = (ImageView) view
  44. .findViewById(R.id.id_index_gallery_item_image);
  45. return viewHolder;
  46. }
  47. /**
  48. * 设置值
  49. */
  50. @Override
  51. public void onBindViewHolder(final ViewHolder viewHolder, final int i)
  52. {
  53. viewHolder.mImg.setImageResource(mDatas.get(i));
  54. }
  55. }

可以看到数据适配器与BaseAdapter比较发生了相当大的变化,主要有3个方法:

getItemCount 这个不用说,获取总的条目数

onCreateViewHolder 创建ViewHolder

onBindViewHolder 将数据绑定至ViewHolder

可见,RecyclerView对ViewHolder也进行了一定的封装,但是如果你仔细观察,你会发出一个疑问,ListView里面有个getView返回View为Item的布局,那么这个Item的样子在哪控制?

其实是这样的,我们创建的ViewHolder必须继承RecyclerView.ViewHolder,这个RecyclerView.ViewHolder的构造时必须传入一个View,这个View相当于我们ListView getView中的convertView (即:我们需要inflate的item布局需要传入)。

还有一点,ListView中convertView是复用的,在RecyclerView中,是把ViewHolder作为缓存的单位了,然后convertView作为ViewHolder的成员变量保持在ViewHolder中,也就是说,假设没有屏幕显示10个条目,则会创建10个ViewHolder缓存起来,每次复用的是ViewHolder,所以他把getView这个方法变为了onCreateViewHolder。有兴趣的自己打印下Log,测试下。

最后在Activity中使用:

[java] view
plain
copy

  1. package com.example.zhy_horizontalscrollview03;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.List;
  5. import android.app.Activity;
  6. import android.os.Bundle;
  7. import android.support.v7.widget.LinearLayoutManager;
  8. import android.support.v7.widget.RecyclerView;
  9. import android.view.Window;
  10. public class MainActivity extends Activity
  11. {
  12. private RecyclerView mRecyclerView;
  13. private GalleryAdapter mAdapter;
  14. private List<Integer> mDatas;
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState)
  17. {
  18. super.onCreate(savedInstanceState);
  19. requestWindowFeature(Window.FEATURE_NO_TITLE);
  20. setContentView(R.layout.activity_main);
  21. initDatas();
  22. //得到控件
  23. mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview_horizontal);
  24. //设置布局管理器
  25. LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
  26. linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
  27. mRecyclerView.setLayoutManager(linearLayoutManager);
  28. //设置适配器
  29. mAdapter = new GalleryAdapter(this, mDatas);
  30. mRecyclerView.setAdapter(mAdapter);
  31. }
  32. private void initDatas()
  33. {
  34. mDatas = new ArrayList<Integer>(Arrays.asList(R.drawable.a,
  35. R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e,
  36. R.drawable.f, R.drawable.g, R.drawable.h, R.drawable.l));
  37. }
  38. }

使用起来也很方便,唯一的区别就是要设置LayoutManager,目前只有一个实现类,就是LinearLayoutManager,可以设置为水平或者垂直。

最后效果图:

效果很不错,这就是RecyclerView的基本用法了,但是你会发现一个坑爹的地方,竟然没有提供setOnItemClickListener这个回调,要不要这么坑爹。。。

2、为RecyclerView添加OnItemClickListener回调

虽然它没有提供,但是添加个OnItemClickListener对我们来说还不是小菜一碟~

我决定在Adapter中添加这个回调接口:

[java] view
plain
copy

  1. package com.example.zhy_horizontalscrollview03;
  2. import java.util.List;
  3. import android.content.Context;
  4. import android.support.v7.widget.RecyclerView;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.view.ViewGroup;
  9. import android.widget.ImageView;
  10. import android.widget.TextView;
  11. public class GalleryAdapter extends
  12. RecyclerView.Adapter<GalleryAdapter.ViewHolder>
  13. {
  14. /**
  15. * ItemClick的回调接口
  16. * @author zhy
  17. *
  18. */
  19. public interface OnItemClickLitener
  20. {
  21. void onItemClick(View view, int position);
  22. }
  23. private OnItemClickLitener mOnItemClickLitener;
  24. public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener)
  25. {
  26. this.mOnItemClickLitener = mOnItemClickLitener;
  27. }
  28. private LayoutInflater mInflater;
  29. private List<Integer> mDatas;
  30. public GalleryAdapter(Context context, List<Integer> datats)
  31. {
  32. mInflater = LayoutInflater.from(context);
  33. mDatas = datats;
  34. }
  35. public static class ViewHolder extends RecyclerView.ViewHolder
  36. {
  37. public ViewHolder(View arg0)
  38. {
  39. super(arg0);
  40. }
  41. ImageView mImg;
  42. TextView mTxt;
  43. }
  44. @Override
  45. public int getItemCount()
  46. {
  47. return mDatas.size();
  48. }
  49. @Override
  50. public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i)
  51. {
  52. View view = mInflater.inflate(R.layout.activity_index_gallery_item,
  53. viewGroup, false);
  54. ViewHolder viewHolder = new ViewHolder(view);
  55. viewHolder.mImg = (ImageView) view
  56. .findViewById(R.id.id_index_gallery_item_image);
  57. return viewHolder;
  58. }
  59. @Override
  60. public void onBindViewHolder(final ViewHolder viewHolder, final int i)
  61. {
  62. viewHolder.mImg.setImageResource(mDatas.get(i));
  63. //如果设置了回调,则设置点击事件
  64. if (mOnItemClickLitener != null)
  65. {
  66. viewHolder.itemView.setOnClickListener(new OnClickListener()
  67. {
  68. @Override
  69. public void onClick(View v)
  70. {
  71. mOnItemClickLitener.onItemClick(viewHolder.itemView, i);
  72. }
  73. });
  74. }
  75. }
  76. }

很简单,创建一个接口,提供一个设置入口,然后在onBindViewHolder中判断即可。

最后在主Activity中设置监听:

[java] view
plain
copy

  1. mAdapter = new GalleryAdapter(this, mDatas);
  2. mAdapter.setOnItemClickLitener(new OnItemClickLitener()
  3. {
  4. @Override
  5. public void onItemClick(View view, int position)
  6. {
  7. Toast.makeText(MainActivity.this, position+"", Toast.LENGTH_SHORT)
  8. .show();
  9. }
  10. });
  11. mRecyclerView.setAdapter(mAdapter);

好了,这样就行了,看效果图:

效果还是不错的,接下来我想改成相册效果,即上面显示一张大图,下面的RecyclerView做为图片切换的指示器。

3、自定义RecyclerView实现滚动时内容联动

首先修改下布局:

布局文件:

[java] view
plain
copy

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >
  6. <FrameLayout
  7. android:layout_width="fill_parent"
  8. android:layout_height="0dp"
  9. android:layout_weight="1" >
  10. <ImageView
  11. android:id="@+id/id_content"
  12. android:layout_width="fill_parent"
  13. android:layout_height="fill_parent"
  14. android:layout_gravity="center"
  15. android:layout_margin="10dp"
  16. android:scaleType="centerCrop"
  17. android:src="@drawable/ic_launcher" />
  18. </FrameLayout>
  19. <com.example.zhy_horizontalscrollview03.MyRecyclerView
  20. android:id="@+id/id_recyclerview_horizontal"
  21. android:layout_width="match_parent"
  22. android:layout_height="120dp"
  23. android:layout_gravity="bottom"
  24. android:background="#FF0000"
  25. android:scrollbars="none" />
  26. </LinearLayout>

添加一个显示大图的区域,把RecyclerView改为自己定义的。

然后看我们自定义RecyclerView的代码:

[java] view
plain
copy

  1. package com.example.zhy_horizontalscrollview03;
  2. import android.content.Context;
  3. import android.support.v7.widget.RecyclerView;
  4. import android.util.AttributeSet;
  5. import android.view.MotionEvent;
  6. import android.view.View;
  7. public class CopyOfMyRecyclerView extends RecyclerView
  8. {
  9. public CopyOfMyRecyclerView(Context context, AttributeSet attrs)
  10. {
  11. super(context, attrs);
  12. }
  13. private View mCurrentView;
  14. /**
  15. * 滚动时回调的接口
  16. */
  17. private OnItemScrollChangeListener mItemScrollChangeListener;
  18. public void setOnItemScrollChangeListener(
  19. OnItemScrollChangeListener mItemScrollChangeListener)
  20. {
  21. this.mItemScrollChangeListener = mItemScrollChangeListener;
  22. }
  23. public interface OnItemScrollChangeListener
  24. {
  25. void onChange(View view, int position);
  26. }
  27. @Override
  28. protected void onLayout(boolean changed, int l, int t, int r, int b)
  29. {
  30. super.onLayout(changed, l, t, r, b);
  31. mCurrentView = getChildAt(0);
  32. if (mItemScrollChangeListener != null)
  33. {
  34. mItemScrollChangeListener.onChange(mCurrentView,
  35. getChildPosition(mCurrentView));
  36. }
  37. }
  38. @Override
  39. public boolean onTouchEvent(MotionEvent e)
  40. {
  41. if (e.getAction() == MotionEvent.ACTION_MOVE)
  42. {
  43. mCurrentView = getChildAt(0);
  44. // Log.e("TAG", getChildPosition(getChildAt(0)) + "");
  45. if (mItemScrollChangeListener != null)
  46. {
  47. mItemScrollChangeListener.onChange(mCurrentView,
  48. getChildPosition(mCurrentView));
  49. }
  50. }
  51. return super.onTouchEvent(e);
  52. }
  53. }

定义了一个滚动时回调的接口,然后在onTouchEvent中,监听ACTION_MOVE,用户手指滑动时,不断把当前第一个View回调回去~

关于我咋知道getChildAt(0)和getChildPosition()可用,起初我以为有getFirstVisibleItem这个方法,后来发现么有;但是发现了getRecycledViewPool()看名字我觉得是Viewholder那个缓存队列,我想那么直接取这个队列的第一个不就是我要的View么,后来没有成功。我就观察它内部的View,最后发现,第一个显示的始终是它第一个child,至于getChildPosition这个看方法就看出来了。

现在的效果:

和我之前那个例子的效果是一模一样的,不过,我还想做一些改变,我觉得Gallery或者说相册的指示器,下面可能1000来张图片,我不仅喜欢手指在屏幕上滑动时,图片会自动切换。我还希望,如果我给指示器一个加速度,即使手指离开,下面还在滑动,上面也会联动 。而且我还想做些优化,直接在ACTION_MOVE中回调,触发的频率太高了,理论上一张图片只会触发一次~~

4、优化与打造真正的Gallery效果

既然希望手指离开还能联动,那么不仅需要ACTION_MOVE需要监听,还得监听一个加速度,速度到达一定值,然后继续移动~~再理一理,需要这么麻烦么,不是能滚动么,那么应该有OnScrollListener啊,小看一把,果然有,哈哈哈~天助我也,下面看修改后的代码:

[java] view
plain
copy

  1. package com.example.zhy_horizontalscrollview03;
  2. import android.content.Context;
  3. import android.support.v7.widget.RecyclerView;
  4. import android.support.v7.widget.RecyclerView.OnScrollListener;
  5. import android.util.AttributeSet;
  6. import android.view.View;
  7. public class MyRecyclerView extends RecyclerView implements OnScrollListener
  8. {
  9. /**
  10. * 记录当前第一个View
  11. */
  12. private View mCurrentView;
  13. private OnItemScrollChangeListener mItemScrollChangeListener;
  14. public void setOnItemScrollChangeListener(
  15. OnItemScrollChangeListener mItemScrollChangeListener)
  16. {
  17. this.mItemScrollChangeListener = mItemScrollChangeListener;
  18. }
  19. public interface OnItemScrollChangeListener
  20. {
  21. void onChange(View view, int position);
  22. }
  23. public MyRecyclerView(Context context, AttributeSet attrs)
  24. {
  25. super(context, attrs);
  26. // TODO Auto-generated constructor stub
  27. this.setOnScrollListener(this);
  28. }
  29. @Override
  30. protected void onLayout(boolean changed, int l, int t, int r, int b)
  31. {
  32. super.onLayout(changed, l, t, r, b);
  33. mCurrentView = getChildAt(0);
  34. if (mItemScrollChangeListener != null)
  35. {
  36. mItemScrollChangeListener.onChange(mCurrentView,
  37. getChildPosition(mCurrentView));
  38. }
  39. }
  40. @Override
  41. public void onScrollStateChanged(int arg0)
  42. {
  43. }
  44. /**
  45. *
  46. * 滚动时,判断当前第一个View是否发生变化,发生才回调
  47. */
  48. @Override
  49. public void onScrolled(int arg0, int arg1)
  50. {
  51. View newView = getChildAt(0);
  52. if (mItemScrollChangeListener != null)
  53. {
  54. if (newView != null && newView != mCurrentView)
  55. {
  56. mCurrentView = newView ;
  57. mItemScrollChangeListener.onChange(mCurrentView,
  58. getChildPosition(mCurrentView));
  59. }
  60. }
  61. }
  62. }

我放弃了重写onTouchEvent方法,而是让这个类实现RecyclerView.OnScrollListener接口,然后设置监听,在onScrolled里面进行判断。

至于优化:我使用了一个成员变化存储当前第一个View,只有第一个View发生变化时才回调~~太完美了~

看MainActivity:

[java] view
plain
copy

  1. package com.example.zhy_horizontalscrollview03;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.List;
  5. import android.app.Activity;
  6. import android.os.Bundle;
  7. import android.support.v7.widget.LinearLayoutManager;
  8. import android.support.v7.widget.RecyclerView;
  9. import android.view.View;
  10. import android.view.Window;
  11. import android.widget.ImageView;
  12. import android.widget.Toast;
  13. import com.example.zhy_horizontalscrollview03.GalleryAdapter.OnItemClickLitener;
  14. import com.example.zhy_horizontalscrollview03.MyRecyclerView.OnItemScrollChangeListener;
  15. public class MainActivity extends Activity
  16. {
  17. private MyRecyclerView mRecyclerView;
  18. private GalleryAdapter mAdapter;
  19. private List<Integer> mDatas;
  20. private ImageView mImg ;
  21. @Override
  22. protected void onCreate(Bundle savedInstanceState)
  23. {
  24. super.onCreate(savedInstanceState);
  25. requestWindowFeature(Window.FEATURE_NO_TITLE);
  26. setContentView(R.layout.activity_main);
  27. mImg = (ImageView) findViewById(R.id.id_content);
  28. mDatas = new ArrayList<Integer>(Arrays.asList(R.drawable.a,
  29. R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e,
  30. R.drawable.f, R.drawable.g, R.drawable.h, R.drawable.l));
  31. mRecyclerView = (MyRecyclerView) findViewById(R.id.id_recyclerview_horizontal);
  32. LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
  33. linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
  34. mRecyclerView.setLayoutManager(linearLayoutManager);
  35. mAdapter = new GalleryAdapter(this, mDatas);
  36. mRecyclerView.setAdapter(mAdapter);
  37. mRecyclerView.setOnItemScrollChangeListener(new OnItemScrollChangeListener()
  38. {
  39. @Override
  40. public void onChange(View view, int position)
  41. {
  42. mImg.setImageResource(mDatas.get(position));
  43. };
  44. });
  45. mAdapter.setOnItemClickLitener(new OnItemClickLitener()
  46. {
  47. @Override
  48. public void onItemClick(View view, int position)
  49. {
  50. //              Toast.makeText(getApplicationContext(), position + "", Toast.LENGTH_SHORT)
  51. //                      .show();
  52. mImg.setImageResource(mDatas.get(position));
  53. }
  54. });
  55. }
  56. }

代码没什么变化~多了个设置回调~

效果图:

可以看到不仅支持手机在上面移动时的变化,如果我给了一个加速度,下面持续滚动,上面也会持续变化~~大赞~每张图片回调一次,效率也相当不错。

好了,看完这边博客,相信大家对于RecyclerView有了一定的认识,甚至对于如何改造一个控件也多了一份了解~~

如果觉得不错,就留个言或者点个赞,表示对我的支持

源码点击下载

RecyclerView 实现gallery画廊效果的更多相关文章

  1. RecyclerView实现Gallery画廊效果

    使用RecyclerView实现一个画廊效果,主要是使用support库中最新加入的PagerSnapHelper类,通过计算滑动偏移来计算scale的值. 基本实现 首先需要为RecyclerVie ...

  2. RecyclerView实现终极画廊效果 中间突出并且压住两侧布局

    先给大家上个gif 要不然下面很枯燥 忘记原来在哪里看到了..... 这个效果我找了NNNNNN长时间,,,我认为凭我现在的能力 写出来需要好久 所以 退而求其次找大神写好的... 你们不要小看了这个 ...

  3. Swift - 使用CollectionView实现图片Gallery画廊效果(左右滑动浏览图片)

    1,效果图 (1)图片从左至右横向排列(只有一行),通过手指拖动可以前后浏览图片. (2)视图滚动时,每张图片根据其与屏幕中心距离的不同,显示尺寸也会相应地变化.越靠近屏幕中心尺寸就越大,远离屏幕中心 ...

  4. 第31讲 UI组件之 Gallery画廊控件

    第31讲 UI组件之 Gallery画廊控件 1.Gallery的简介 Gallery(画廊)是一个锁定中心条目并且拥有水平滚动列表的视图,一般用来浏览图片,并且可以响应事件显示信息.Gallery只 ...

  5. 仿百度壁纸客户端(六)——完结篇之Gallery画廊实现壁纸预览已经项目细节优化

    仿百度壁纸客户端(六)--完结篇之Gallery画廊实现壁纸预览已经项目细节优化 百度壁纸系列 仿百度壁纸客户端(一)--主框架搭建,自定义Tab + ViewPager + Fragment 仿百度 ...

  6. 使用RecyclerView打造Gallery

    RecyclerView概述 RecyclerView是谷歌推出的用于向大型数据集提供有限窗口的灵活视图.可以通过导入support-v7对其进行使用. 据官方的介绍,该控件用于在有限的窗口中展示大量 ...

  7. Android画廊效果

    Android画廊效果 前言:Gallery是一个内部元素控件,可以水平滚动,并且可以把当前选择的子元素定位在它中心的布局组件:画廊Gallery一般用来显示可左右移动图片的列表(具体请看实例). 效 ...

  8. 仿百度壁纸client(六)——完结篇之Gallery画廊实现壁纸预览已经项目细节优化

    仿百度壁纸client(六)--完结篇之Gallery画廊实现壁纸预览已经项目细节优化 百度壁纸系列 仿百度壁纸client(一)--主框架搭建,自己定义Tab + ViewPager + Fragm ...

  9. UI组件之AdapterView及其子类(四)Gallery画廊控件使用

    听说 Gallery如今已经不使用了,API使用ViewPaper取代了,以后再学专研ViewPaper吧如今说说Gallery画廊,就是不停显示图片的意思 Gallery是用来水平滚动的显示一系列项 ...

随机推荐

  1. hive数据类型及其数据转换

    由于需要使用hive sql进行数据查询,同时涉及多个不同类型的字段的组合,看Hive sql的文档相关和资料才知道,hive是支持大部分基础数据类型之间的相互转换的. 那么,hive本身支持哪些数据 ...

  2. Pycharm中进行Python远程开发

    http://blog.csdn.net/pipisorry/article/details/52269952 PyCharm提供两种远程调试(Remote Debugging)的方式:    配置远 ...

  3. Microsoft Dynamics CRM 2011 当您在 大型数据集上执行 RetrieveMultiple 查询很慢的解决方法

    症状 当您在 Microsoft Dynamics CRM 2011 年大型数据集上执行 RetrieveMultiple 查询时,您会比较慢. 原因 发生此问题是因为大型数据集缓存 Retrieve ...

  4. Android获得控件在屏幕中的绝对坐标

    int[] location = new int[2] ; view.getLocationInWindow(location); //获取在当前窗口内的绝对坐标 view.getLocationOn ...

  5. 关于查找iOS中App路径时所要注意的一个问题

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交 ...

  6. 【Netty源码学习】BootStrap

    BootStrap是客户端的启动类,其主要功能就是设置必要的参数然后启动客户端. 实现如下: Bootstrap b = new Bootstrap(); b.group(group) .channe ...

  7. 在O(1)时间内删除单链表结点

    给定单链表的一个结点的指针,同时该结点不是尾结点,此外没有指向其它任何结点的指针,请在O(1)时间内删除该结点. int deleteNode(LNode **head, LNode **node) ...

  8. unix下快速混淆源代码

    只能算雕虫小技,但可以快速简单的做混淆,如下: #vapyhqr <fgqvb.u> #vapyhqr <fgqyvo.u> #vapyhqr <fgqobby.u> ...

  9. J2EE进阶(六)SSH框架工作流程项目整合实例讲解

    J2EE进阶(六)SSH框架工作流程项目整合实例讲解 请求流程 经过实际项目的进行,结合三大框架各自的运行机理可分析得出SSH整合框架的大致工作流程. 首先查看一下客户端的请求信息: 对于一个Web项 ...

  10. 新手学python(3):yield与序列化

    1 Yield生成器 Yield是我在其他语言中没有见过的一个属性,算是python的一大特色,用好之后可以使代码更简洁.考虑一个简单的例子,文件的遍历.要遍历一个目录下的所有文件需要递归的操作.如果 ...