今天周一,新的一周,水的开始。
上次发完博客后,自己在项目中使用不是特别的方便,除了要写很多布局之外,还要写诸多的点击事件的监听,不是非常的方便,于是花了一天的时间封装了一下。
首先我们先缕缕思路,首先我想实现一个自定义的控件可以实现全部的父子菜单的功能,所以在原有的adapter基础上,我们需要增加累死expanedlistview类似的adapter的实现。
public abstract class SettingsAdapter<T> {
private Context context;
private List<T> mParentList;
private List<List<T>> mChildList;
public SettingsAdapter(Context context, List<T> mParentList, List<List<T>> mChildList) {
this.context = context;
this.mParentList = mParentList;
this.mChildList = mChildList;
}
public int getParentCount(){
return mParentList==null?0:mParentList.size();
}
public T getItem(int position){
return mParentList.get(position);
}
public int getChildCount(int parentPosition){
return mChildList==null?0: mChildList.get(parentPosition).size();
}
public T getChildItem(int parentPosition,int childPosition){
return mChildList.get(parentPosition).get(childPosition);
}
public abstract View getParentView(View view,int position);
public abstract View getChildView(View view,int parentPosition,int childPosition);
public interface onDataChanged {
void changed();
}
public void setOnDataChanged(onDataChanged onDataChanged) {
this.onDataChanged = onDataChanged;
}
public onDataChanged onDataChanged;
public void notifyDataSetChanged(){
onDataChanged.changed();
}
}
这次的adapter和上次的adapter大致上是一样的,不过是多了父菜单的view,以便于我们对于父布局的定制。
然后我们在原来的SettingView上进行修改,这次我们因为要实现的是一整个的菜单,所以依然是继承linearlayout,在初始化中设置方向为竖向。
public SettingsView(Context context) {
this(context, null);
}
public SettingsView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SettingsView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context=context;
setOrientation(VERTICAL);
}
然后我们在SettingView中实现setAdapter这个接口,和上个博客的写法大致一样。
public void setAdapter(SettingsAdapter adapter){
this.adapter=adapter;
changeAdapter();
}
下面我们重点看一下changAdapter里面的方法。
private void changeAdapter() {
removeAllViews();
SettingsAdapter settingsAdapter=this.adapter;
for(int i=0;i<settingsAdapter.getParentCount();i++){
final View parentView = settingsAdapter.getP