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

来源:互联网 发布:免费crm软件 编辑:程序博客网 时间:2024/06/16 07:00

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

基本结构

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


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


且自定义View中把activity 中initdata()方法改为loaddata(),以供主动调用后开始加载数据。

重构后基本代码如下,省略了一部分和之前重复的代码:

首先是数据加载接口:

public interface ILoadRulerData<T> {     public List<T> getDataList();   }


然后是自定义view的基本代码:

/**   * @Description: 需要先调用 setiLoadData,设置获取数据的接口,然后再调用  loadData方法 */public class RulerView<T> extends LinearLayout{     private View baseView;    private TextView noDataView;       private TextView RulerTag;    private ProgressBarWithText progress;       private ListView listView;       private RulerWidget ruler;     private ILoadRulerData<T> iLoadData;    private List<T> originalList;    public  List<RulerListDataWrapper<T>> dealedList;    private HashMap<String, Integer> tagLocation = new HashMap<String, Integer>();    private RulerAdapter<T> 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<T> 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();    }       。。。。。        }

测试

布局

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    >       <TextView        android:layout_marginTop="10dp"       android:layout_width="wrap_content"       android:layout_height="wrap_content"       android:text="wbxtest view"       android:textColor="@color/g_black"       />   <******.ruler.view.RulerView       android:id="@+id/test_ruler_view_id"       android:layout_width="match_parent"       android:layout_height="wrap_content"       /></LinearLayout>

Activity

public class TestViewActivity extends Activity{           private RulerView<TestAnnotationBo> rulerView;     @Override    protected void onCreate(Bundle savedInstanceState) {       super.onCreate(savedInstanceState);       setContentView(R.layout.test_ruler_view);        rulerView = (RulerView<TestAnnotationBo>) findViewById(R.id.test_ruler_view_id);        rulerView.setiLoadData(new ILoadRulerData<TestAnnotationBo>() {                     @Override           public List<TestAnnotationBo> getDataList() {                           return new TestAnnnoDao().getBoList();           }       });        rulerView.loadData();          }}

此系列完毕。

4 1