android自定义分组控件,自定义控件之android列表分组及字母导航

有了以上两篇文章的重构,现在把ListView分组列表重构为自定义控件就会非常简单,只需要把初始化操作放在自定义控件的构造函数里面。重构后的自定义控件以上一篇的注解重构为基础。

基本结构

这里首先贴上一张上篇文章重构后的activity的代码结构,相关的方法实现在之前两篇文章中都有贴出。

2db82429753425587bc293204de54ab9.png

再贴一张重构后的View的结构。可见两者的结构都及其相似。不同的是上边的activity中有抽象方法getDataList(),而下边的没有,但是多了一个ILoadRulerData iLoadData 类型的接口。用于加载数据。

7bcec4e69e7b3338bfe59e8fe6b8f600.png

且自定义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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值