最近由于项目加急,手里有好多看了差不多的开源项目,其中好多是大家经常用到的。图片的缓存BitmapFun(Android的文档中),AfinalMap,下拉刷新PullToRefresh等等吧,不过由于项目需要,我要就简要说下今天我要讲的这个组件,这个组件的项目地址.

看着左边的猪脚是不是觉得这个很像IOS中的UITableView,不过我告诉这是Android的ListView。

没看代码前,我看到作者说这个是a customized ListView,这是不敢相信,ListView是每一项都基本上一样,看看我们猪脚,怎么看都不像,不过后来一看代码,这不用ListView还用什么呢。

    在开始前,先扯远点,在Android中感觉组件中最常用且最有个性且最复杂的就是ListView了,你想想PullToRefreshListView,SwipToDismiss 以及后来的点击展开的那个叫ExpandableList,无一不是ListView的杰出代表。貌似GoogleMail客户端的ListView挺有意思,有兴趣看看他是怎么实现的。

      对了,我的3DListView翻译也是ListView开始的,尽管没写完剩下的文章,不过我会补上的。

 

     为什么要用到UITableView

因为要做一个定位选择机构的页面,和美团、糯米的客户端定位很相似,上面是个定位的Item,下面显示的各位城市的Item,这个在IOS那肯定是用UITableView,且我的IOS同时也在做这个页面,的确就是用UITableView。

一个分组下,是几个Item。如热门城市:北京 武汉 信阳    全部城市:A 鞍山市 安庆市……信阳市……资阳市

实现原理

看看这个UITableView样式,其实就两种Item,每个分组(Group)的顶部标题(Header)和每个分组的列表选项(Cell)。

为了使ListVIew的positiom和UITableView中对应的分组(Group)和分组中的位置(Row),我们需要一个对应二者的一个数据结构,我们把它定为IndexPath。

我们需要根据数据分组,每个分组里都要一个Header和多个Cell,而在Listview中无论Cell亦或是Header我们统一认为它是一个Item,只是这个Item的IndexPath的属性不一样,他可能是一个Header,那个对应他的View就是一个HeaderView,同理Cell对应的是CellView,这个是不是可以理解呢。

用法

先去Github上现在UITableViewUI库:下载地址

建立一个自己的项目。

public class MainActivity extends Activity implements OnClickListener {
UITableView tableView;
private Button btnChange = null;
SimpleUITableViewAdapter tableViewAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tableViewAdapter = new SimpleUITableViewAdapter();
tableView = (UITableView) findViewById(R.id.listView);
tableView.setAdapter(tableViewAdapter);
tableView.setOnCellClickListener(tableViewAdapter);
tableView.setOnCellLongClickListener(tableViewAdapter);
tableView.setOnCellAccessoryClickListener(tableViewAdapter);
tableView.setOnHeaderClickListener(tableViewAdapter);
tableView.setOnHeaderLongClickListener(tableViewAdapter); btnChange = (Button) findViewById(R.id.btnChange);
btnChange.setOnClickListener(this); }
@Override
public void onClick(View v) {
int id = v.getId();
if(id == R.id.btnChange){
tableViewAdapter.setChange();
} } class SimpleUITableViewAdapter extends UITableViewAdapter implements OnCellClickListener, OnCellLongClickListener, OnCellAccessoryClickListener, OnHeaderClickListener, OnHeaderLongClickListener { private int[] color_line1_default;
private int[] color_line2_default;
private int[] color_line1_pressed;
private int[] color_line2_pressed; public SimpleUITableViewAdapter() {
// Prepare two sets of colors for odd and even lines
color_line1_default = new int[] { getResources().getColor(R.color.base_start_color_line1_default), getResources().getColor(R.color.base_start_color_line1_default) };
color_line2_default = new int[] { getResources().getColor(R.color.base_start_color_line2_default), getResources().getColor(R.color.base_start_color_line2_default) };
color_line1_pressed = new int[] { getResources().getColor(R.color.base_start_color_line1_pressed), getResources().getColor(R.color.base_start_color_line1_pressed) };
color_line2_pressed = new int[] { getResources().getColor(R.color.base_start_color_line2_pressed), getResources().getColor(R.color.base_start_color_line2_pressed) };
}
int number = 4;
int rad = 1;
public void setChange(){
number = 3;
rad = 2;
} @Override
public int numberOfGroups() {
return number;
} @Override
public int numberOfRows(int group) {
return (group + rad) * 2;
} @Override
public UITableHeaderItem headerItemForGroup(Context context, IndexPath indexPath) {
return new UITableHeaderItem("Group " + indexPath.getGroup());
} @Override
public UITableCellItem cellItemForRow(Context context, IndexPath indexPath) {
String title = "Cell number " + indexPath.getRow() + " in group " + indexPath.getGroup();
String subtitle = (indexPath.getRow() % 2 == 0) ? "Subtitle " + indexPath.getRow() : null;
return new UITableCellItem(title, subtitle);
} @Override
public UITableHeaderView headerViewForGroup(Context context, IndexPath indexPath, UITableHeaderItem headerItem, UITableHeaderView convertView) {
UITableHeaderView headerView;
if (convertView == null) {
// If the recycled view is null, we just creating one
headerView = new UITableHeaderView(context, indexPath);
} else {
headerView = (UITableHeaderView) convertView;
} headerView.setTitle(headerItem.title); return headerView;
}
@Override
public UITableCellView cellViewForRow(Context context, IndexPath indexPath, UITableCellItem cellItem, UITableCellView convertView) {
UITableCellView cellView;
if (convertView == null) {
// If the recycled view is null, we just creating one with cell's commons parameters
cellView = new UITableCellView(context, indexPath);
cellView.setMinimumHeight(80);
cellView.setAccessory(AccessoryType.DISCLOSURE);
} else {
cellView = (UITableCellView) convertView;
} cellView.setTitle(cellItem.title);
cellView.setSubtitle(cellItem.subtitle); // Set alternated background color
if (indexPath.getRow() % 2 == 0) {
cellView.setBackgroundColor(color_line1_default, color_line1_pressed);
} else {
cellView.setBackgroundColor(color_line2_default, color_line2_pressed);
} return cellView;
} @Override
public void onCellClick(IndexPath indexPath) {
Toast.makeText(getApplicationContext(), "Cell clicked : " + indexPath, 1000).show();
} @Override
public boolean onCellLongClick(IndexPath indexPath) {
Toast.makeText(getApplication(), "Cell long clicked : " + indexPath, 1000).show();
return indexPath.getRow() % 2 == 0; // Consume the long click one row out of two
} @Override
public void onCellAccessoryClick(IndexPath indexPath) {
Toast.makeText(getApplication(), "Cell accessory clicked : " + indexPath, 1000).show();
} @Override
public void onHeaderClick(IndexPath indexPath) {
Toast.makeText(getApplicationContext(), "Header clicked : " + indexPath, 1000).show();
} @Override
public boolean onHeaderLongClick(IndexPath indexPath) {
Toast.makeText(getApplicationContext(), "Header long clicked : " + indexPath, 1000).show();
return indexPath.getGroup() % 2 == 0; // Consume the long click one row out of two
}
} }

    看下这个SimpleUITableViewAdapter 的实现,headerItemForGroup ()和cellItemForRow ()这个是需要的item数据,headerViewForGroup()和cellViewForRow是为分组的顶部标题和分组中的列表选项的试图展示。numberOfGroups()numberOfRows(int group)则表示每个分组的个数和对应group分组下的选项个数。

         

这个例子看着你不是觉得这个很有意思啊。

下一篇我们就可以看一下他的项目设计详细设计吧。

[Android 开源项目学习]Android的UITableView(1)的更多相关文章

  1. android开源项目学习

    FBReaderJ FBReaderJ用于Android平台的电子书阅读器,它支持多种电子书籍格式包括:oeb.ePub和fb2.此外还支持直接读取zip.tar和gzip等压缩文档. 项目地址:ht ...

  2. android 开源项目学习

    1.Android团队提供的示例项目 如果不是从学习Android SDK中提供的那些样例代码开始,可能没有更好的方法来掌握在Android这个框架上开发.由Android的核心开发团队提供了15个优 ...

  3. android 开源项目学习<二>

    roottools:   RootTools gives Rooted developers easy access to common rooted tools...  https://code.g ...

  4. Android 开源项目及其学习

    Android 系统研究:http://blog.csdn.net/luoshengyang/article/details/8923485 Android 腾讯技术人员博客 http://hukai ...

  5. Android 开源项目维护者宣布退出

    Android开源项目(Android Open Source Project,AOSP)的长期维护者Jean-Baptiste Quéru在Google+上宣布退出,他退出AOSP项目的原因被认为与 ...

  6. Android开源项目分包方式学习(eoe、oschina、github)

    总感觉Android中关于分包的文章很少,或者几乎可以说没有.但是合理地分包,又可以使整个项目模块化,减少包与包之间的依赖,让整个项目的框架更加清晰,更利于后续功能的拓展. 因为没有相关的文章,所以这 ...

  7. Android开源项目SlidingMenu本学习笔记(两)

    我们已经出台SlidingMenu使用:Android开源项目SlidingMenu本学习笔记(一个),接下来再深入学习下.依据滑出项的Menu切换到相应的页面 文件夹结构: watermark/2/ ...

  8. GitHub 优秀的 Android 开源项目(转)

    今天查找资源时看到的一篇文章,总结了很多实用资源,十分感谢原作者分享. 转自:http://blog.csdn.net/shulianghan/article/details/18046021 主要介 ...

  9. GitHub 优秀的 Android 开源项目

    转自:http://blog.csdn.net/shulianghan/article/details/18046021 主要介绍那些不错个性化的View,包括ListView.ActionBar.M ...

随机推荐

  1. UVaLive 6693 Flow Game (计算几何,线段相交)

    题意:给个棋盘,你可以在棋盘的边缘处放2个蓝色棋子2个黄色棋子,问连接2组同色棋子的最小代价,如果线路交叉,输-1. 析:交叉么,可以把它们看成是两条线段,然后如果相交就是不行的,但是有几种特殊情况, ...

  2. CodeForces 710A King Moves (水题)

    题意:给定一个坐标,问你皇后有几个方向可以走. 析:直接格举那八个方向即可. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000 ...

  3. nginx打开目录游览功能

    #开启索引功能 location / { autoindex on; autoindex_exact_size off; autoindex_localtime on; } #别名目录location ...

  4. iPhone 微信平台链接到微信文章 返回上一页问题

    东钿金融服务平台 有个隐藏按钮,点击此按钮,会弹出一个九宫格的功能栏,其中有个‘工作时间‘,这项,它是链接到微信公众号里面的一篇文章,按照平常写法就是 直接把文章链接地址 赋在a的href上,但是iP ...

  5. C# List 中 Find 方法

    实例化一个集合 List<User> userCollection = new List<User>(); userCollection.Add(new User(1, &qu ...

  6. 配置IIS服务器,.apk文件下载

    iis中支持下载apk文件, 发布的网站上右键->属性->HTTP头->下方有个按钮叫[MIME类型]->添加:两个栏, 扩展名填写: .apk MIME类型填写: 扩展名为 ...

  7. WebService《JavaEE6权威指南 基础篇第4版》

    [Web服务] 为运行在不同平台和框架之上的软件提供了互操作的标准方式.良好的互操作性和可扩展性.消息采用自包含文档的形式. ——解决异构系统之间交互.解决异构系统通信问题:  1.通过XML,JSO ...

  8. Oracle闪回

    在PLSQL开发时,有时候会遇到对表的误删除,其实遇到这种情况不需要紧张,如果问题较大,请DBA帮忙,如果只是小问题,只需自己处理,利用flashback闪回操作即可,可将表进行恢复 在删除表时,系统 ...

  9. 【转】牛逼闪闪的Ruby迭代器

    D瓜哥最近想做一个网站,另外,老早就有学习一门动态语言的想法,满足着两个条件的编程语言中,Ruby.Python是最合适的两种语言.现在Ruby on Rails如日中天,光芒万丈!所以,就选定了Ru ...

  10. hdu 5592 ZYB's Game 树状数组

    ZYB's Game Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=55 ...