各司其职:在Android适配器中使用委托者模式

【这是一个线索】适配器君从不甘当线索,同样是设计模式,适配器模式不是今天的主题,今天的主题是在适配器中如何使用委托者模式以明确设计中的各元素的分工。

一个具有适配器View的界面,Activity作为MVC模式中的控制器,数据控制应当由它完成。那么,为了让Adapter只负责数据界面绑定,Activity负责控制数据的变动,委托者模式这个时候就应该勇敢地站出来,让Adapter中可能涉及到的控制委托给Activity去处理。

我又要举例子了,代码君憋不住了,它在下面↓↓↓↓↓↓

 1 package com.change.delegateforadapterdemo;
 2
 3 import java.util.List;
 4
 5 import android.content.Context;
 6 import android.view.LayoutInflater;
 7 import android.view.View;
 8 import android.view.View.OnClickListener;
 9 import android.view.ViewGroup;
10 import android.widget.BaseAdapter;
11 import android.widget.Button;
12 import android.widget.TextView;
13
14 /**
15  * 委托者模式运用在adapter中
16  * @author Change
17  *
18  */
19 public class DelegateForAdapter extends BaseAdapter {
20     private List<String> names;
21     private LayoutInflater mInflater;
22     private DataControlDelegate mDelegate;
23     public DelegateForAdapter(Context ctx,List<String> _names) {
24         this.names = _names;
25         mInflater = LayoutInflater.from(ctx);
26     }
27     /**
28      * 委托接口,用于对adapter中的数据进行操作,此处只提供了一个删除单条数据的方法。
29      * @author Change
30      *
31      */
32     public static interface DataControlDelegate{
33         /**
34          * 删除数据
35          * @param name
36          */
37         public void removeItem(String name);
38     }
39
40     @Override
41     public int getCount() {
42         return names.size();
43     }
44
45     @Override
46     public Object getItem(int arg0) {
47         return names.get(arg0);
48     }
49
50     @Override
51     public long getItemId(int arg0) {
52         return arg0;
53     }
54
55     @Override
56     public View getView(int arg0, View arg1, ViewGroup arg2) {
57         ViewHolder holder = null;
58         if(null==arg1){
59             arg1 = mInflater.inflate(R.layout.item_name, null);
60             holder = new ViewHolder();
61             holder.name = (TextView)arg1.findViewById(R.id.name);
62             holder.remove = (Button)arg1.findViewById(R.id.remove);
63             arg1.setTag(holder);
64         }else{
65             holder = (ViewHolder)arg1.getTag();
66         }
67         final String name = names.get(arg0);
68         holder.remove.setOnClickListener(new OnClickListener() {
69             @Override
70             public void onClick(View arg0) {
71                 if(null!=mDelegate)
72                     mDelegate.removeItem(name);//删除行为
73             }
74         });
75         holder.name.setText(name);
76         return arg1;
77     }
78     static class ViewHolder{
79         public TextView name;
80         public Button remove;
81     }
82     /**
83      * 设置委托者
84      * @param _delegate
85      */
86     public void setDataControlDelegate(DataControlDelegate _delegate){
87         this.mDelegate = _delegate;
88     }
89
90 }

【委托者接口】大部分设计模式都由接口做主导,所以,不得不提它,上面代码标红的就是我们的委托者接口,实现它的模块都会沦为被委托对象。上面紫色部分便是需要委托的内容,本来点击删除的行为是在列表项里完成的,但为了分工明确,我们把它委托出去了,那是时候看看那可怜的被委托对象了。

【被委托对象】悲惨的Activity又要帮adapter完成工作了,它实现了委托者接口,删除数据项的行为对它来说,轻而易举。

 1 package com.change.delegateforadapterdemo;
 2
 3 import java.util.ArrayList;
 4 import java.util.List;
 5
 6 import android.app.Activity;
 7 import android.os.Bundle;
 8 import android.view.Menu;
 9 import android.widget.ListView;
10 import android.widget.Toast;
11
12 import com.change.delegateforadapterdemo.DelegateForAdapter.DataControlDelegate;
13
14 /**
15  * 实现adapter中的数据委托接口,把所有的行为让activity来控制吧。
16  * @author Change
17  *
18  */
19 public class MainActivity extends Activity implements DataControlDelegate{
20     private List<String> names = new ArrayList<String>();
21     private DelegateForAdapter adapter;
22     @Override
23     protected void onCreate(Bundle savedInstanceState) {
24         super.onCreate(savedInstanceState);
25         setContentView(R.layout.activity_main);
26         initDatas();
27         ListView lv = (ListView)findViewById(R.id.lv);
28         adapter = new DelegateForAdapter(this, names);
29         adapter.setDataControlDelegate(this);
30         lv.setAdapter(adapter);
31     }
32
33     @Override
34     public boolean onCreateOptionsMenu(Menu menu) {
35         // Inflate the menu; this adds items to the action bar if it is present.
36         getMenuInflater().inflate(R.menu.main, menu);
37         return true;
38     }
39
40     private void initDatas(){
41         for(int i=0;i<10;i++){
42             names.add("name"+i);
43         }
44     }
45
46     @Override
47     public void removeItem(String name) {
48         names.remove(name);
49         adapter.notifyDataSetChanged();
50         Toast.makeText(this, "已删除"+name, Toast.LENGTH_SHORT).show();
51     }
52
53 }

【依然如此简单】removeItem(),一个方法代表一个行为,轻松实现删除的需求,notifyDataSetChanged()通知后界面便发生了变化。到现在为止,一切都像我们想象的一样发生了。

【完整代码】github地址:https://github.com/ChangeWu/SomePoject/tree/master/DelegateForAdapterDemo

时间: 2024-08-09 02:01:10

各司其职:在Android适配器中使用委托者模式的相关文章

Android Studio中debug和release模式默认的参数配置

The possible properties and their default values are: debuggable:表示是否可以在手机上调试程序. 在Eclipse中,只有android:debuggable="true"时我们才可以在手机上调试Android程序. 但是当我们没在AndroidManifest.xml中设置其debug属性时: 使用Eclipse运行这种方式打包时其debug属性为true,使用Eclipse导出这种方式打包时其debug属性为法fals

Android适配器中字体颜色设置无效解决

 btn.setTextColor(R.color.main_color); 改为下面方法即可,通过上下文获取颜色值 btn.setTextColor(context.getResources().getColor(R.color.main_color));

Android 适配器(Adapter)、观察者(Observer) 模式

适配器(Adapter)详述:http://blog.csdn.net/jjwwmlp456/article/details/39893723 观察者(Observer)详述:http://blog.csdn.net/jjwwmlp456/article/details/39967021 AdapterView 体系 AdapterView中会使用Adapter Adapter 体系 BaseAdapter 实现了 SpinnerAdapter.ListAdapter 这样的形式,就是 适配器模

Android开发系列(六):Android应用中文件的操作模式

私有操作模式: 1.只能被创建这个文件的应用所访问 2.若这个文件不存在就会创建文件:如果存在就会覆盖原来的文件 3.Context.MODE_PRIVATE public void save(String filename, String content) throws Exception { //私有操作模式:创建出来的文件只能被本应用访问,其他应用无法访问该文件. //另外采用私有操作模式创建的文件,写入文件中的内容会覆盖源文件内容 FileOutputStream outStream =

Builder模式详解及其在Android开发中的应用

一.引言 在Android开发中,采用Builder模式的代码随处可见,比如说Android系统对话框AlertDialog的使用或者是Android中的通知栏(Notification)的使用,又比如说在一些常用的第三方库中也随处可见其踪迹,比如说一些常用的网络请求库如OkHttp或者是retrofit,又或者是图片加载库Glide中也不缺乏它的应用. 为什么Builder模式在Android或是Java开发中这么火呢?因为它相较于构造函数或者是Get/Set方法,它的灵活性和封装性上都比较有

Android开发中的MVP架构(转)

写在前面,本博客来源于公众号文章:http://mp.weixin.qq.com/s?__biz=MzA3MDMyMjkzNg==&mid=402435540&idx=1&sn=1cd10bd9efaac7083575367a8b4af52f&scene=1&srcid=0910ARzPpBvVYPI1NDBZnixa#wechat_redirect 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解MVP和DDD,但是我们的新项目

Android开发中常用的ListView列表的优化方式ViewHolder

在Android开发中难免会遇到大量的数据加载到ListView中进行显示, 然后其中最重要的数据传递桥梁Adapter适配器是常用的,随着市场的需 求变化ListView'条目中的内容是越来越多这就需要程序员来自定义适配器, 而关键的就是适配器的优化问题,适配器没有优化好往往就会造成OOM (内存溢出)或者是滑动卡顿之类的问题,接下来我就给大家介绍一种常 用的Adapter优化方法 1 /** 2 * list View的适配器 3 */ 4 class Adapter extends Bas

Android App中使用Gallery制作幻灯片播放效果

http://www.jb51.net/article/83313.htm 我们有时候在iPhone手机上或者Windows上面看到动态的图片,可以通过鼠标或者手指触摸来移动它,产生动态的图片滚动效果,还可以根据你的点击或者触摸触发其他事件响应.同样的,在Android中也提供这这种实现,这就是通过Gallery在UI上实现缩略图浏览器. 我们来看看Gallery是如何来实现的,先把控件从布局文件中声明,只需知道ID为gallery. ? 1 Gallery gallery = (Gallery

android 适配器的简易笔记

(一).使用ArrayAdapter做适配器: 常用在:Spinner ①设置数据源 ②使用ArrayAdapter做适配器,使用方法同Spinner ③ 给ListView对象设置适配器 String[] arrayData = { "网络设置", "wifi设置", "蓝牙设置", "网络设置2", "wifi设置2","蓝牙设置2", "网络设置3", &quo