上篇文章对listView 分组和字母索引导航的实现思路做了分析,并依照思路一步步实现,到最后已经较好的实现了全部功能。但是仔细研究就会发现其实现不够好,主要问题:
1. 对于一个使用范围比较广泛的布局,以上实现不够通用,尤其是Bo中需加上一些多余的字段,这些字字段本身并没有意义。
2. 代码都糅合在activity中。
针对以上两点做一些代码重构。首先我们把其优化为一个通用的activity.这样做成通用的View就很容易;然后对代码进行抽取和重构。
想法和思路
以往代码的一个主要问题就是“污染”原有的Bo,而污染的主要原因是需要用这些附加的字段来进行数据处理和生成列表分组标签的时候使用。
原有代码如下:
public class TestBo {
/**
* 主要字段
*/
private String boStr = null;
/**
* bo拼音缓存
*/
private String boPinYin = null;
/**
* Bo标签标记
*/
private String boTagFlag = null;
public TestBo() {
super();
}
public TestBo(String str) {
super();
this.boStr = str;
}
public String getBoStr() {
return boStr;
}
public void setBoStr(String boStr) {
this.boStr = boStr;
}
public String getSortStrPinyin() {
return boPinYin;
}
public void setSortStrPinYin(String pinyin) {
this.boPinYin = pinyin;
}
public void setTag(String tag) {
this.boTagFlag = tag;
}
public String getTag() {
return boTagFlag;
}
}
其实以上Bo中真正有用的有主要字段,其他均为附加字段,其实生成列表只要要求Bo提供按照哪个字段分组就行了。
自然而然的我们就想到了接口,只要实现了相应的接口,接口方法返回需要“分组排序的值”。
数据处理做相应改变即可。
重构BO-接口
首先抽出以下接口:
public interface BoSort {
/**
* @date 2014-9-3
* @Description: 获取索引的字符串
* @param
* @return String
*/
public String getSortStr();
/**
* @date 2014-9-3
* @Description: 获取索引字符串的拼音,这个最好可以有缓存
* @param
* @return String
*/
public String getSortStrPinyin();
/**
* @date 2014-9-3
* @Description:
* @param
* @return void
*/
public void setSortStrPinYin(String pinyin);
/**
* @date 2014-9-3
* @Description: 设置标签,需要缓存
* @param
* @return void
*/
public void setTag(String tag);
/**
* @date 2014-9-3
* @Description: 获取标签,如果为null,说明不是标签
* @param
* @return String
*/
public String getTag();
}
相应Bo实现以上接口即可。但是我们可以提供一个默认实现,这还是一个抽象类,Bo只要继承这个默认实现,并实现为实现的方法 public String getSortStr();
/**
* @date 2014-9-3
* @Description: 只需实现 getSortStr 其他不要修改
*/
public abstract class DefaultBoSortImp implements BoSort{
/**
* bo拼音缓存
*/
private String boPinYin = null;
/**
* Bo标签标记
*/
private String boTagFlag = null;
/**
* 一定要有这个构造函数
*/
public DefaultBoSortImp() {
s