3.使用Activity和Delegate与适配器交互

这个内容是从书里看到的,通过托付模式帮助开发人员把全部的业务逻辑从适配器中移到Activity中。

以下是加入电话号码的样例,列表中每一行都有一个removebutton,用于删除电话号码,在适配器中实现“Remove”button的点击处理器,可是。并不在适配器中实现删除对象的方法,我们通过一个托付接口调用Activity的方法删除对象。

适配器的代码:

public class NumbersAdapter extends ArrayAdapter<Integer> {   





  public static interface NumbersAdapterDelegate {   //定义托付接口

    void removeItem(Integer value);

  }





  private LayoutInflater mInflator;

  private NumbersAdapterDelegate mDelegate;





  public NumbersAdapter(Context context, List<Integer> objects) {

    super(context, 0, objects);

    mInflator = LayoutInflater.from(context);

  }





  @Override

  public View getView(int position, View cv, ViewGroup parent) {





    if (null == cv) {

      cv = mInflator.inflate(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 button = cv.findViewById(R.id.numbers_row_button);

    button.setOnClickListener(new OnClickListener() {





      @Override

      public void onClick(View v) {

        if (null != mDelegate) {

          mDelegate.removeItem(value);   //删除对象

        }

      }

    });





    return cv;

  }





  public void setDelegate(NumbersAdapterDelegate delegate) {  //为适配器设置托付对象

    mDelegate = delegate;

  }





}

Activity的代码:

public class MainActivity extends Activity implements

        NumbersAdapter.NumbersAdapterDelegate {        //实现NumbersAdapterDelegate接口

  private static final String TAG = MainActivity.class

      .getCanonicalName();





  private ListView mListView;

  private ArrayList<Integer> mNumbers;

  private NumbersAdapter mAdapter;

  private EditText mEditText;





  @Override

  public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);





    mEditText = (EditText) findViewById(R.id.main_edittext);

    mListView = (ListView) findViewById(R.id.main_listview);

    mNumbers = new ArrayList<Integer>();

    mAdapter = new NumbersAdapter(this, mNumbers);

    mListView.setAdapter(mAdapter);

  }





  @Override

  protected void onResume() {

    super.onResume();

    mAdapter.setDelegate(this);   //在onResume方法中注冊托付对象

  }





  @Override

  protected void onPause() {

    super.onPause();

    mAdapter.setDelegate(null);  //在onPause方法中取消注冊托付对象

  }





  @Override

  public void removeItem(Integer value) {   //从列表中移除指定项,然后通知适配器绑定的数据发生变化

    mNumbers.remove(value);

    Toast

        .makeText(this, "Removed object: " + value, Toast.LENGTH_SHORT)

        .show();

    mAdapter.notifyDataSetChanged();

  }





  public void addNumber(View v) {

    String value = mEditText.getText().toString().trim();

    try {

      mNumbers.add(Integer.valueOf(value));

      mEditText.setText("");

      mAdapter.notifyDataSetChanged();

    } catch (NumberFormatException e) {

      Log.e(TAG, "Couldn't convert to integer the string: " + value);

    }

  }

}

没有在onCreate方法中设置托付对象,而在onResume方法中设置托付对象。目的是为了确保仅仅在Activity显示在屏幕上的时候才作为托付对象使用。

ListView优化总结(二)--Android的更多相关文章

  1. Android零基础入门第43节:ListView优化和列表首尾使用

    原文:Android零基础入门第43节:ListView优化和列表首尾使用 前面连续几期都在学习ListView的各种使用方法,如果细心的同学可能会发现其运行效率是有待提高的,那么本期就来一起学习有哪 ...

  2. Android开发之ListView详解 以及简单的listView优化

    ListView列表视图 最常用的控件之一,使用场景例如:微信,手机QQ等等. android:divider:每个item之间的分割线,可以使用图片或者色值. android:dividerHeig ...

  3. Android 常驻与很驻型广播的差别,及ListView优化,Android新手基本知识巩固

    1.常驻型广播  常驻型广播,当你的应用程序关闭了,假设有广播信息来,你写的广播接收器相同的能接受到.  他的注冊方式就是在你的应用程序中的AndroidManifast.xml进行注冊. 通常说这样 ...

  4. Android——ListView优化

    1.ListView基本概念 列表显示需要三个元素: ListView:用来展示列表的View. 适配器:用来把数据映射到ListView上 数据:具体的将被映射的字符串,图片或基本组件 适配器类型分 ...

  5. listview优化 汇总

    1,listview加载性能优化ViewHolder 转自: http://blog.csdn.net/jacman/article/details/7087995 在android开发中Listvi ...

  6. 性能优化之Java(Android)代码优化

    最新最准确内容建议直接访问原文:性能优化之Java(Android)代码优化 本文为Android性能优化的第三篇——Java(Android)代码优化.主要介绍Java代码中性能优化方式及网络优化, ...

  7. 转 cocos2dx内存优化 (之二)

    一.cocos2dx之如何优化内存使用(高级篇) 本文由qinning199原创,转载请注明:http://www.cocos2dx.net/?p=93 一.内存优化原则 为了优化应用内存,你应该知道 ...

  8. 【转】带checkbox的ListView实现(二)——自定义Checkable控件的实现方法

    原文网址:http://blog.csdn.net/harvic880925/article/details/40475367 前言:前一篇文章给大家展示了传统的Listview的写法,但有的时候我们 ...

  9. 内存泄露--contentView缓存使用与ListView优化

    引起Android内存泄露有很多种原因,下面罗列了一些问题,以后会一一解决 1.构造Adapter时没有使用缓存convertView(衍生出ListView优化问题) 2.查询数据库游标没有关闭 3 ...

  10. Adaptert Listview 优化

    这次是关于Listview的优化的,之前一直采用愚蠢的方式来使用listview,出现的情况就是数据多的话下拉的时候会出现卡顿的情况,内存占用多.所以学习了关于listview的优化,并且这也是普遍使 ...

随机推荐

  1. kb-07专题线段树-04--离散化;

    /* poj2528 线段树 好题,用到了离散化,二分定位,特殊的区间查寻方式:在下面的代码注释中有详细的解释: */ #include<iostream> #include<cst ...

  2. HDU——1003Max Sum(子序列最大和)

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  3. 深入理解Java中的volatile关键字

    在再有人问你Java内存模型是什么,就把这篇文章发给他中我们曾经介绍过,Java语言为了解决并发编程中存在的原子性.可见性和有序性问题,提供了一系列和并发处理相关的关键字,比如synchronized ...

  4. BZOJ2527 [Poi2011]Meteors 【整体二分 + 树状数组】

    题目 Byteotian Interstellar Union有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站. 这个星球经常会下 ...

  5. python 缺少包

    https://pypi.python.org/pypi/pdfminer/20140328 到这里下载相应的包,再进行安装. tar  –xivf  pybloomfilter-1.0 cd  py ...

  6. python tab 自动补全

    学习python,经常要使用python命令行查找一些不熟悉的使用方法等等,但是python命令行下没有自带tab补全的功能,看见别人写了tab,可以解决特此记下,以备后用 1.创建tab.py文件, ...

  7. 一个老忘且非常有用的jquery动画方法 网页上卷

    $('html,body').animate({scrollTop:800+'px'},500) //网页上卷800像素 在半秒之内

  8. Word Ladder系列

    1.Word Ladder 问题描述: 给两个word(beginWord和endWord)和一个字典word list,找出从beginWord到endWord之间的长度最长的一个序列,条件: 1. ...

  9. tomcat 项目迁移到jboss5.1

    1.拷贝tomcat\bin目录下两个jar到项目lib 目的:解决jboss java.lang.NoClassDefFoundError: org/apache/juli/logging/LogF ...

  10. es6 --数组--Array.from() 、Array.isArray()、Array.of()、find()、findIndex()、fill()、entries() 、keys() ,values()

    将两类对象转为真正的数组 Array.from()方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES6新增的数据结构Se ...