有了以上两篇文章的重构,现在把ListView分组列表重构为自定义控件就会非常简单,只需要把初始化操作放在自定义控件的构造函数里面。重构后的自定义控件以上一篇的注解重构为基础。
基本结构
这里首先贴上一张上篇文章重构后的activity的代码结构,相关的方法实现在之前两篇文章中都有贴出。
再贴一张重构后的View的结构。可见两者的结构都及其相似。不同的是上边的activity中有抽象方法getDataList(),而下边的没有,但是多了一个ILoadRulerData iLoadData 类型的接口。用于加载数据。
且自定义View中把activity 中initdata()方法改为loaddata(),以供主动调用后开始加载数据。
重构后基本代码如下,省略了一部分和之前重复的代码:
首先是数据加载接口:
public interface ILoadRulerData {
public List getDataList();
}
然后是自定义view的基本代码:
/**
* @Description: 需要先调用 setiLoadData,设置获取数据的接口,然后再调用 loadData方法
*/
public class RulerView extends LinearLayout{
private View baseView;
private TextView noDataView;
private TextView RulerTag;
private ProgressBarWithText progress;
private ListView listView;
private RulerWidget ruler;
private ILoadRulerData iLoadData;
private List originalList;
public List> dealedList;
private HashMap tagLocation = new HashMap();
private RulerAdapter rulerAdapter;
public RulerView(Context context) {
super(context);
init( context);
}
public RulerView(Context context, AttributeSet attrs) {
super(context, attrs);
init( context);
}
public RulerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs);
init( context);
}
/**
* @Description: 设置数据加载接口
* @param
* @return void
*/
public void setiLoadData(ILoadRulerData iLoadData) {
this.iLoadData = iLoadData;
}
private void init(Context context){
baseView = LayoutInflater.from(context).inflate(R.layout.g_ruler, null);
noDataView = (TextView) baseView.findViewById(R.id.g_base_list_nodata);
RulerTag = (TextView) baseView.findViewById(R.id.g_ruler_tag);
progress = (ProgressBarWithText) baseView.findViewById(R.id.g_base_progressbar_withtext);
listView = (ListView) baseView.findViewById(R.id.g_base_list);
ruler = (RulerWidget) baseView.findViewById(R.id.g_ruler);
progress.setVisibility(View.VISIBLE);
RulerTag.setVisibility(View.GONE);
noDataView.setVisibility(View.GONE);
listView.setVisibility(View.GONE);
ruler.setVisibility(View.GONE);
addView(baseView, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
}
public void loadData(){
new GetDataAsyTask().execute();
}
。。。。。
}
测试
布局
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
android:layout_marginTop="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="wbxtest view"
android:textColor="@color/g_black"
/>
android:id="@+id/test_ruler_view_id"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
Activity
public class TestViewActivity extends Activity{
private RulerView rulerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_ruler_view);
rulerView = (RulerView) findViewById(R.id.test_ruler_view_id);
rulerView.setiLoadData(new ILoadRulerData() {
@Override
public List getDataList() {
return new TestAnnnoDao().getBoList();
}
});
rulerView.loadData();
}
}
此系列完毕。
原文:http://blog.csdn.net/windsunmoon/article/details/39375207