使用Activity和Delegate与Adapter交互
2015-10-09 00:40
169 查看
通过委托模式(Delegation Pattern)可以帮助我们把所有业务逻辑从Adapter中移动到Activity。
我们创建一个sample,通过该project可以向列表中添加电话号码,列表中每一行都有一个remove按钮,用于删除电话号码。
思路:在适配器中实现“remove”按钮的点击处理,但是并不在适配器中实现删除对象的方法。我们通过一个委托接口调用Activity的方法删除对象。
定义委托接口,用于删除的操作,公开一个设置委托接口的方法;
最后在Activity中就可以轻易使用:
我们并没有在onCreate方法中注册代理对象,而是在onResume方法中注册代理对象,在onPause方法中取消注册。这样做的目的是为了确保只在Activity显示的时候才作为委托对象使用。
我们创建一个sample,通过该project可以向列表中添加电话号码,列表中每一行都有一个remove按钮,用于删除电话号码。
思路:在适配器中实现“remove”按钮的点击处理,但是并不在适配器中实现删除对象的方法。我们通过一个委托接口调用Activity的方法删除对象。
public class NumberAdapter extends ArrayAdapter<Integer>{ public static final NumberAdapterDelegate{ void removeItem(Integer value); } private LayoutInflater mInflater; private NumberAdapterDelegate mDelegate; public NumberAdapter(Context context,List<Integer> objects){ super(context,0,objects); mInflater = LayoutInflater.from(context); } @override public View getView(intposition,View cv,ViewGroup parent){ if(null == cv){ cv = mInflater.inflater(R.layout.number_row,parent,false); } final Integer value = getItem(position); TextView tv = (TextView)cv.findViewById(R.id.numbers_row_text); tv.setText(value.toString()); View delBtn = cv.findViewById(R.id.numbers_row_del); delBtn.setOnClickListener(new OnClickListener(){ @override public void onClick(View v){ if(null!=mDelegate){ mDelegate.removeItem(value); } } }); return cv; } public void setDelegate(NumberAdapterDelegate delegate){ this.mDelegate = delegate; } }
定义委托接口,用于删除的操作,公开一个设置委托接口的方法;
最后在Activity中就可以轻易使用:
public class MainActivity extends Activity implements NumberAdapterDelegate{ private ListView listView; private ArrayList<Integer> mNumbers; private NumberAdapter mAdapter; @override public void onCreate(Bundle saveInstanceState){ super.onCreate(saveInstanceState); setContentView(R.layout.main); // TODO initView initData.... } @override public void onResume(){ super.onResume(); mAdapter.setDelegate(this); } @override public void onPause(){ super.onPause(); mAdapter.setDelegate(null); } @override public void removeItem(Integer value){ mNumbers.remove(value); mAdapter.notifyDataSetChanged(); } }
我们并没有在onCreate方法中注册代理对象,而是在onResume方法中注册代理对象,在onPause方法中取消注册。这样做的目的是为了确保只在Activity显示的时候才作为委托对象使用。
相关文章推荐
- C#中委托的进一步理解
- C#使用委托(delegate)实现在两个form之间传递数据的方法
- C#中常见的系统内置委托用法详解
- C#基础之委托用法实例教程
- C#中委托和事件的区别实例解析
- C#中的委托介绍
- .Net常见问题之C#中的委托
- C#中委托的基本概念介绍
- C#委托delegate实例解析
- C#委托现实示例分析
- ASP.NET中实现定制自己的委托和事件参数类
- Query中click(),bind(),live(),delegate()的区别
- jQuery中 delegate使用的问题
- 浅谈jquery中delegate()与live()
- 由点击页面其它地方隐藏div所想到的jQuery的delegate
- jQuery事件绑定和委托实例
- JavaScript的事件代理和委托实例分析
- C#用匿名方法定义委托的实现方法
- jQuery中delegate与on的用法与区别示例介绍
- 委托事件模型