使用UICollectionView实现

思路
  • 很明显整体它是一个列表,它的分组是一个列表,它里面的好友列表也是一个列表,所以就可以使用组头来设置分组列表,使用cell设置好友列表;
  • 当点击组头的时候会展开好友列表,其实原理上就是单独刷新某一组的数据。
流程
  • 控制器的代码(HomeViewController):本类主要配置UICollectionView显示,以及处理组展开/关闭状态。
#import "HomeViewController.h"
#import "YDWFriendListShowCollectionViewCell.h"
#import "YDWFriendHeaderReusableView.h"static NSString * const kYDWFriendListShowCollectionViewCellIndentifier = @"YDWFriendListShowCollectionViewCell";
static NSString * const kYDWFriendHeaderReusableViewIndentifier = @"YDWFriendHeaderReusableView";@interface HomeViewController ()<UICollectionViewDelegate,UICollectionViewDataSource,FriendHeaderReusableViewDelegate>/**添加collectionView*/
@property(nonatomic,strong) UICollectionView *collectionView;
/**好友组头列表数组*/
@property(nonatomic,strong) NSArray *headerArray;
/**好友列表数据*/
@property (nonatomic, strong) NSMutableArray * dataArray;
/**存储是否展开的BOOL值*/
@property (nonatomic, strong) NSMutableArray * boolArray;@end@implementation HomeViewController- (void)viewDidLoad {[super viewDidLoad];[self setupNavigation];[self addSubviews];[self getListData];
}#pragma mark - UICollectionViewDelegate,UICollectionViewDataSource
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {return self.headerArray.count;
}- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {// 判断是否展开,如果未展开则返回0if ([self.boolArray[section] boolValue] == NO) {return 0;} else {return [self.dataArray[section] count];}
}- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {YDWFriendListShowCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:kYDWFriendListShowCollectionViewCellIndentifier forIndexPath:indexPath];cell.contentView.backgroundColor = [UIColor whiteColor];cell.nameLabel.text = [NSString stringWithFormat:@"好友%ld", (long)indexPath.item];cell.detailsLabel.text = [NSString stringWithFormat:@"签名%ld", (long)indexPath.item];return cell;
}- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {YDWFriendHeaderReusableView *reusView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:kYDWFriendHeaderReusableViewIndentifier forIndexPath:indexPath];reusView.delegte = self;reusView.backgroundColor = [UIColor whiteColor];reusView.tag = indexPath.section;// 三目运算选择展开或者闭合时候的图标reusView.imageView.image = [self.boolArray[indexPath.section] boolValue] ? [UIImage imageNamed:[NSString stringWithFormat:@"zhankai"]] : [UIImage imageNamed:[NSString stringWithFormat:@"shouqi"]];reusView.titleLabel.text = self.headerArray[indexPath.section];reusView.numLabel.text = [NSString stringWithFormat:@"%ld/%lu",(long)indexPath.section, (unsigned long)[self.dataArray[indexPath.section] count]];return reusView;
}#pragma mark - FriendHeaderReusableViewDelegate
- (void)friendHeaderReusableView:(YDWFriendHeaderReusableView *)friendHeaderReusableView didSelectItemAtSection:(NSInteger)section {if ([self.boolArray[section] boolValue] == YES) {[self.boolArray replaceObjectAtIndex:section withObject:@NO];} else {[self.boolArray replaceObjectAtIndex:section withObject:@YES];}[self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:section]];
}#pragma mark - Private Methods
- (void)setupNavigation {self.navigationItem.title = @"联系人";
}- (void)addSubviews {self.collectionView.frame = CGRectMake(0, 100, SCREEN_WIDTH, SCREEN_HEIGHT - 15);[self.view addSubview:self.collectionView];
}- (void)getListData {// 准备组头的数据NSArray *headerArr = [NSArray arrayWithObjects:@"特别关心", @"我的好友", @"朋友", @"家人",nil];self.headerArray = headerArr;// 准备单元格的数据NSArray *itemArr = [NSArray arrayWithObjects:@5, @10, @7,@3,  nil];for (int i = 0; i < self.headerArray.count; i++) {// 所有的分组默认关闭[self.boolArray addObject:@NO];// 给每个分组添加数据NSMutableArray * friendArr = [[NSMutableArray alloc] init];for (int j = 0; j < [itemArr[i] intValue]; j++) {[friendArr addObject:@(j)];}[self.dataArray addObject:friendArr];}[self.collectionView reloadData];
}#pragma mark - Lazy Loading
- (NSMutableArray *)dataArray {if (!_dataArray) {_dataArray = [[NSMutableArray alloc] init];}return _dataArray;
}- (NSMutableArray *)boolArray {if (!_boolArray) {_boolArray = [[NSMutableArray alloc] init];}return _boolArray;
}- (UICollectionView *)collectionView {if (!_collectionView) {UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];layout.itemSize = CGSizeMake(SCREEN_WIDTH, 70);layout.minimumLineSpacing = 0;layout.minimumInteritemSpacing = 0;layout.scrollDirection = UICollectionViewScrollDirectionVertical;layout.headerReferenceSize = CGSizeMake(SCREEN_WIDTH, 40);_collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];_collectionView.backgroundColor = [UIColor whiteColor];_collectionView.delegate = self;_collectionView.dataSource = self;_collectionView.alwaysBounceVertical = YES;_collectionView.showsVerticalScrollIndicator = YES;[_collectionView registerClass:[YDWFriendHeaderReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:kYDWFriendHeaderReusableViewIndentifier];[_collectionView registerClass:[YDWFriendListShowCollectionViewCell class] forCellWithReuseIdentifier:kYDWFriendListShowCollectionViewCellIndentifier];}return _collectionView;
}
@end
  • YDWFriendHeaderReusableView:本类主要布局组标题以及指示(展开/关闭)控件,其次,通过添加点击手势结合委托模式,传递tag值。
    YDWFriendHeaderReusableView .h和YDWFriendHeaderReusableView.m:
#import <UIKit/UIKit.h>NS_ASSUME_NONNULL_BEGIN
@class YDWFriendHeaderReusableView;
@protocol FriendHeaderReusableViewDelegate <NSObject>- (void)friendHeaderReusableView:(YDWFriendHeaderReusableView *)friendHeaderReusableView didSelectItemAtSection:(NSInteger)section;@end@interface YDWFriendHeaderReusableView : UICollectionReusableView@property(nonatomic,weak) id <FriendHeaderReusableViewDelegate>delegte;/**图标*/
@property(nonatomic,weak) UIImageView *imageView;
/**标题*/
@property(nonatomic,weak) UILabel *titleLabel;
/**人数*/
@property(nonatomic,weak) UILabel *numLabel;
@endNS_ASSUME_NONNULL_END
#import "YDWFriendHeaderReusableView.h"@interface YDWFriendHeaderReusableView ()@end@implementation YDWFriendHeaderReusableView#pragma mark - 初始化
- (instancetype)initWithFrame:(CGRect)frame {self = [super initWithFrame:frame];if (self) {self.userInteractionEnabled = YES;UITapGestureRecognizer *tapGes = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(clickView:)];[self addGestureRecognizer:tapGes];[self addSubviews];}return self;
}#pragma mark - 设置UI界面
- (void)addSubviews {// 添加图标UIImageView *imageView = [[UIImageView alloc] init];[self addSubview:imageView];self.imageView = imageView;// 添加标题UILabel *titleLabel = [[UILabel alloc] init];titleLabel.font = [UIFont systemFontOfSize:18];titleLabel.textColor = [UIColor darkGrayColor];[self addSubview:titleLabel];self.titleLabel = titleLabel;// 添加人数UILabel *numLabel = [[UILabel alloc] init];numLabel.font = [UIFont systemFontOfSize:14];numLabel.textAlignment = NSTextAlignmentRight;numLabel.textColor = [UIColor lightGrayColor];[self addSubview:numLabel];self.numLabel = numLabel;}/**调用父类布局子视图*/
- (void)layoutSubviews {[super layoutSubviews];// 图标self.imageView.frame = CGRectMake(10, 10, 20, 20);// 标题CGFloat numW = 60;CGFloat titleX = CGRectGetMaxX(self.imageView.frame) + 10;CGFloat titleW = SCREEN_WIDTH - titleX - numW -15;self.titleLabel.frame = CGRectMake(titleX, 10, titleW, 20);// 人数CGFloat numX = SCREEN_WIDTH - numW - 10;self.numLabel.frame = CGRectMake(numX, 10, numW, 20);
}#pragma mark - 监听事件
- (void)clickView:(UITapGestureRecognizer *)tapGes {if ([self.delegte respondsToSelector:@selector(friendHeaderReusableView:didSelectItemAtSection:)]) {[self.delegte friendHeaderReusableView:self didSelectItemAtSection:self.tag];}
}
@end
  • YDWFriendListShowCollectionViewCell:主要布局好友信息包括头像、昵称以及签名,具体实现如下:
#import <UIKit/UIKit.h>NS_ASSUME_NONNULL_BEGIN@interface YDWFriendListShowCollectionViewCell : UICollectionViewCell@property(nonatomic,weak) UIImageView *imageView;
@property(nonatomic,weak) UILabel *nameLabel;
@property(nonatomic,weak) UILabel *detailsLabel;@endNS_ASSUME_NONNULL_END
#import "YDWFriendListShowCollectionViewCell.h"@interface YDWFriendListShowCollectionViewCell ()@end@implementation YDWFriendListShowCollectionViewCell#pragma mark - 初始化
- (instancetype)initWithFrame:(CGRect)frame {self = [super initWithFrame:frame];if (self) {[self addSubviews];}return self;
}#pragma mark - 设置UI界面
- (void)addSubviews {// 添加图标UIImageView *imageView = [[UIImageView alloc] init];imageView.layer.cornerRadius = 50/2;imageView.layer.masksToBounds = YES;imageView.backgroundColor = [UIColor colorWithRed:arc4random_uniform(256)/255.0 green:arc4random_uniform(256)/255.0 blue:arc4random_uniform(256)/255.0 alpha:1.0];[self addSubview:imageView];self.imageView = imageView;// 添加标题UILabel *nameLabel = [[UILabel alloc] init];nameLabel.font = [UIFont systemFontOfSize:18];nameLabel.textColor = [UIColor darkGrayColor];[self addSubview:nameLabel];self.nameLabel = nameLabel;// 添加签名UILabel *detailsLabel = [[UILabel alloc] init];detailsLabel.font = [UIFont systemFontOfSize:14];detailsLabel.textAlignment = NSTextAlignmentLeft;detailsLabel.textColor = [UIColor lightGrayColor];[self addSubview:detailsLabel];self.detailsLabel = detailsLabel;}/**调用父类布局子视图*/
- (void)layoutSubviews {[super layoutSubviews];//1、图标self.imageView.frame = CGRectMake(10, 10, 50, 50);//2、标题CGFloat nameX = CGRectGetMaxX(self.imageView.frame) + 10;CGFloat nameW = SCREEN_WIDTH - nameX -10;self.nameLabel.frame = CGRectMake(nameX, 10, nameW, 20);//3、人数CGFloat detailsX = CGRectGetMaxX(self.imageView.frame) + 10;CGFloat detailsY = CGRectGetMaxY(self.nameLabel.frame) + 5;CGFloat detailsW = SCREEN_WIDTH - detailsX - 10;self.detailsLabel.frame = CGRectMake(detailsX, detailsY, detailsW, 20);
}
@end
效果展示

使用UITableView实现

思路
  • 这个可以展开收缩的UITableView,点击的是TableView的section,每个section下面都对应一个数组,点击section,就展开sction然后展示数组数据。
  • 每次点击section都要刷新当前点击的这个section,不用reloadData,提高效率。
  • 那么点击的这个sction怎么知道自己是展开呢还是折叠起来呢?那么关键就是对这里的处理,需要加一个条件判断是展开还是折叠。
实现方法
  • 用一个boolArray去记录每个section的状态,当然光记录还是不行的,还是不断的改变这个boolArray对应section的值,展开了就把值替换为1,闭合了替换了0.那么这个0和1就是我们的依据,依据这个就可以返回这个scetion对应的row了。
  • 用一个类去记录和不断的替换状态,该model类增加一个状态判断的字段;
流程
  • 控制器的代码:本类主要配置UITableView显示,以及处理组展开/关闭状态。
#import "YDWSecondViewController.h"
#import "YDWFriendListShowTableViewCell.h"
#import "YDWFriendHeadView.h"static NSString * const kYDWFriendListShowTableViewCellIndentifier = @"YDWFriendListShowTableViewCell";
static NSString * const kYDWFriendHeadViewIndentifer = @"YDWFriendHeadView";@interface YDWSecondViewController ()<UITableViewDelegate,UITableViewDataSource,FriendHeadViewDelegate>@property (nonatomic, strong) UITableView *tableView;@property(nonatomic,strong)   NSArray *headerArray;
@property (nonatomic, strong) NSMutableArray * dataArray;
@property (nonatomic, strong) NSMutableArray * boolArray;@end@implementation YDWSecondViewController- (void)viewDidLoad {[super viewDidLoad];[self setupNavigation];[self setupAddTableView];[self getListData];
}#pragma mark - UITableViewDelegate,UITableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {return self.dataArray.count;
}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {if ([self.boolArray[section] boolValue] == NO) {return 0;} else {return [self.dataArray[section] count];}
}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {YDWFriendListShowTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kYDWFriendListShowTableViewCellIndentifier];if (!cell) {cell = [[NSBundle mainBundle] loadNibNamed:@"YDWFriendListShowTableViewCell" owner:self options:nil].firstObject;}cell.selectionStyle = UITableViewCellSelectionStyleNone;return cell;
}- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {return 40;
}- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {YDWFriendHeadView *headeView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:kYDWFriendHeadViewIndentifer];if (headeView == nil) {headeView = [[YDWFriendHeadView alloc] initWithReuseIdentifier:kYDWFriendHeadViewIndentifer];}headeView.delegte = self;headeView.tag = section;headeView.imageView.image = [self.boolArray[section] boolValue] ? [UIImage imageNamed:[NSString stringWithFormat:@"zhankai"]] : [UIImage imageNamed:[NSString stringWithFormat:@"shouqi"]];headeView.titleLabel.text = self.headerArray[section];headeView.numLabel.text = [NSString stringWithFormat:@"%ld/%lu",(long)section, (unsigned long)[self.dataArray[section] count]];return headeView;
}#pragma mark - FriendHeadViewDelegate
- (void)friendHeaderReusableView:(YDWFriendHeadView *)friendHeaderReusableView didSelectItemAtSection:(NSInteger)section {if ([self.boolArray[section] boolValue] == YES) {[self.boolArray replaceObjectAtIndex:section withObject:@NO];} else {[self.boolArray replaceObjectAtIndex:section withObject:@YES];}[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationFade];
}#pragma mark - Private Methods
- (void)setupNavigation {self.navigationItem.title = @"联系人";
}- (void)setupAddTableView {self.tableView.frame = self.view.bounds;[self.view addSubview:self.tableView];
}- (void)getListData {// 准备组头的数据NSArray *headerArr = [NSArray arrayWithObjects:@"特别关心", @"我的好友", @"朋友", @"家人",nil];self.headerArray = headerArr;// 准备单元格的数据NSArray *itemArr = [NSArray arrayWithObjects:@5, @10, @7,@3,  nil];for (int i = 0; i < self.headerArray.count; i++) {// 所有的分组默认关闭[self.boolArray addObject:@NO];// 给每个分组添加数据NSMutableArray * friendArr = [[NSMutableArray alloc] init];for (int j = 0; j < [itemArr[i] intValue]; j++) {[friendArr addObject:@(j)];}[self.dataArray addObject:friendArr];}[self.tableView reloadData];
}#pragma mark - Lazying Load
- (NSMutableArray *)boolArray {if (!_boolArray) {_boolArray = [[NSMutableArray alloc] init];}return _boolArray;
}- (NSMutableArray *)dataArray {if (!_dataArray) {_dataArray = [[NSMutableArray alloc] init];}return _dataArray;
}- (UITableView *)tableView {if (!_tableView) {_tableView = [[UITableView alloc] init];_tableView.backgroundColor = [UIColor whiteColor];_tableView.showsHorizontalScrollIndicator = NO;_tableView.delegate = self;_tableView.dataSource = self;_tableView.separatorStyle = UITableViewCellSeparatorStyleNone;_tableView.tableFooterView = [UIView new];[_tableView registerClass:[YDWFriendHeadView class] forHeaderFooterViewReuseIdentifier:kYDWFriendHeadViewIndentifer];}return _tableView;
}@end
  • YDWFriendHeadView:本类主要布局组标题以及指示(展开/关闭)控件,其次,通过添加点击手势结合委托模式,传递tag值。
NS_ASSUME_NONNULL_BEGIN
@class YDWFriendHeadView;
@protocol FriendHeadViewDelegate <NSObject>- (void)friendHeaderReusableView:(YDWFriendHeadView *)friendHeaderReusableView didSelectItemAtSection:(NSInteger)section;@end@interface YDWFriendHeadView : UITableViewHeaderFooterView@property(nonatomic,weak) id <FriendHeadViewDelegate>delegte;/**图标*/
@property(nonatomic,weak) UIImageView *imageView;
/**标题*/
@property(nonatomic,weak) UILabel *titleLabel;
/**人数*/
@property(nonatomic,weak) UILabel *numLabel;
@endNS_ASSUME_NONNULL_END
#import "YDWFriendHeadView.h"@implementation YDWFriendHeadView#pragma mark - 初始化
- (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier {if (self = [super initWithReuseIdentifier:reuseIdentifier]) {self.userInteractionEnabled = YES;self.contentView.backgroundColor = [UIColor whiteColor];UITapGestureRecognizer *tapGes = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(clickView:)];[self addGestureRecognizer:tapGes];[self addSubviews];}return self;
}- (void)awakeFromNib {[super awakeFromNib];[self addSubviews];
}#pragma mark - 设置UI界面
- (void)addSubviews {// 添加图标UIImageView *imageView = [[UIImageView alloc] init];[self addSubview:imageView];self.imageView = imageView;// 添加标题UILabel *titleLabel = [[UILabel alloc] init];titleLabel.font = [UIFont systemFontOfSize:18];titleLabel.textColor = [UIColor darkGrayColor];[self addSubview:titleLabel];self.titleLabel = titleLabel;// 添加人数UILabel *numLabel = [[UILabel alloc] init];numLabel.font = [UIFont systemFontOfSize:14];numLabel.textAlignment = NSTextAlignmentRight;numLabel.textColor = [UIColor lightGrayColor];[self addSubview:numLabel];self.numLabel = numLabel;}/**调用父类布局子视图*/
- (void)layoutSubviews {[super layoutSubviews];// 图标self.imageView.frame = CGRectMake(10, 10, 20, 20);// 标题CGFloat numW = 60;CGFloat titleX = CGRectGetMaxX(self.imageView.frame) + 10;CGFloat titleW = SCREEN_WIDTH - titleX - numW -15;self.titleLabel.frame = CGRectMake(titleX, 10, titleW, 20);// 人数CGFloat numX = SCREEN_WIDTH - numW - 10;self.numLabel.frame = CGRectMake(numX, 10, numW, 20);
}#pragma mark - 监听事件
- (void)clickView:(UITapGestureRecognizer *)tapGes {if ([self.delegte respondsToSelector:@selector(friendHeaderReusableView:didSelectItemAtSection:)]) {[self.delegte friendHeaderReusableView:self didSelectItemAtSection:self.tag];}
}
@end
  • YDWFriendListShowTableViewCell:主要布局好友信息包括头像、昵称以及签名,具体实现如下:
#import <UIKit/UIKit.h>NS_ASSUME_NONNULL_BEGIN@interface YDWFriendListShowTableViewCell : UITableViewCell@property (weak, nonatomic) IBOutlet UIImageView *headImageView;
@property (weak, nonatomic) IBOutlet UILabel *nameLabel;
@property (weak, nonatomic) IBOutlet UILabel *signLabel;@endNS_ASSUME_NONNULL_END
#import "YDWFriendListShowTableViewCell.h"@implementation YDWFriendListShowTableViewCell- (void)awakeFromNib {[super awakeFromNib];self.headImageView.backgroundColor = [UIColor colorWithRed:arc4random_uniform(256)/255.0 green:arc4random_uniform(256)/255.0 blue:arc4random_uniform(256)/255.0 alpha:1.0];[self.headImageView.layer setMasksToBounds:YES];[self.headImageView.layer setCornerRadius:25];}- (void)setSelected:(BOOL)selected animated:(BOOL)animated {[super setSelected:selected animated:animated];}
@end
效果展示:与UICollectionView实现得的效果一致。
  • 详细代码与具体逻辑见demo:iOS之仿QQ好友列表展开收缩效果的实现。

iOS之仿QQ好友列表展开收缩效果的实现相关推荐

  1. html仿qq最小化怎么实现,JS仿QQ好友列表展开、收缩功能(第一篇)

    JS仿QQ好友列表展开.收缩功能(第一篇) 发布时间:2020-10-17 14:20:03 来源:脚本之家 阅读:96 作者:erdouzhang 效果图如下所示: html: 我的好友 张三 李四 ...

  2. qq列表展开多个html代码,JS仿QQ好友列表展开、收缩功能(第二篇)

    在上篇的基础上继续完善,点击一个li元素,其他li元素上的类名清除掉. 效果图如下所示: js: window.onload = function(){ var list = document.get ...

  3. android 仿qq好友动态,Android UI仿QQ好友列表分组悬浮效果

    本文实例为大家分享了Android UI仿QQ好友列表分组悬浮效果的具体代码,供大家参考,具体内容如下 楼主是在平板上測试的.图片略微有点大,大家看看效果就好 接下来贴源代码: PinnedHeade ...

  4. 仿QQ好友列表分组折叠效果

    最近要一个类似QQ好友列表分组折叠效果,经过网友提醒应该使用ExpandableListView,因为其就集成了这个功能,我到网上随便找了文章一看,果然如此,因为工作需要和兴趣的推动,下班做完事后决定 ...

  5. iOS TableView实现QQ好友列表(三)

    上节我们讲到如何展示好友信息 iOS TableView实现QQ好友列表(二) http://blog.csdn.net/lwjok2007/article/details/46549111 接下来我 ...

  6. 仿QQ好友列表,QListWidget!

    仿QQ好友列表, 设计逻辑: 设计qqItem类,再添加到widget中: 设计时布局等可以直接在ui中设计:内容设计通过代码实现: qqItem.cpp #include "qqitem. ...

  7. android 仿qq好友列表分组效果及联系人分组效果

     历史记录仿QQ好友列表的动态效果 以及联系人的分组效果 QQ朋友分组的功能做的不错,大家都很认可,那么到底他的分组并且滑动的时候,标题能停留在顶部是如何实现的呢?今天从网上搜索了一下资料,自己运行了 ...

  8. iOS TableView实现QQ好友列表(二)

    上节:iOS TableView实现QQ好友列表(一) http://blog.csdn.net/lwjok2007/article/details/46534123 上一节实现了简单的好友列表,但是 ...

  9. Android中实现类似qq好友列表展开收起的效果

    最近两天学习实现了一个功能,感觉很好,一定要记录下来. 在网上找了一些资料,林林总总,总是不那么齐全,有的代码做成小Demo还会报错,需要自己调试半天.也幸好如此,我将此功能涉及到的一些知识点理解的更 ...

最新文章

  1. vue打包后图片找不到情况
  2. 夏天和空调_您可以在今年夏天开始学习650项免费的在线编程和计算机科学课程...
  3. 麦肯锡顾问的整体设计:从大局需要安排工作
  4. ECLIPSE启动不了,报错org.eclipse.swt.SWTException: Invalid thread access
  5. Android7.1去掉USB权限弹窗
  6. 全球及中国儿童滑步车市场销量需求调查与竞争格局展望报告2022年
  7. centos7离线安装bazel
  8. how SAP CRM settype structure names are determined
  9. linux c 数据库访问框架,linux c 开发通用结构,框架
  10. 如何在字符串中添加双引号?
  11. matlab中LMI工具箱函数feasp的用法
  12. c++ release和debug语句分离
  13. 网易发“暴力裁员”内部说明;京东负责不幸员工的孩子费用到22岁;Linux kernel 5.4发布 | 极客头条...
  14. Linux 命令(69)—— objcopy 命令
  15. java8.0安装教程_图解JDK8下载安装以及环境配置全过程,超级详细
  16. c语言编程三次方程,c语言求三次方程的根程序设计
  17. 计算机网络概述上海电力,上海电力大学2021考研复试计算机网络考试大纲
  18. 【Jsoup】 基本使用
  19. Android项目开发:简易计步器
  20. emacs 基本配置

热门文章

  1. Hadoop数据倾斜及解决办法
  2. 疯狂秀才权限管理系统,开源了
  3. UVa 10642 - Can You Solve It?
  4. Windows7查看本地Java安装是否成功和路径的方法
  5. 文件目录遍历的并发算法
  6. 自定义UISearchBar的背景图
  7. 庖丁解牛看委托和事件(续)
  8. GridPanel的一些小技巧
  9. python矩阵旋转函数_Python3算法之十:矩阵旋转
  10. mysql暂停触发器_mysql如何临时禁用触发器