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. ambari单节点集群塔建

    配置2台机器,发别为ambari01.ambari03.ambari01上部署Ambari-server和Mirror server,另一台机器上部署agent. 一.配置静态IP 运行命令,让配置生 ...

  2. 洛谷P3327 [SDOI2015]约数个数和 【莫比乌斯反演】

    题目 设d(x)为x的约数个数,给定N.M,求\(\sum_{i = 1}^{N} \sum_{j = 1}^{M} d(ij)\) 输入格式 输入文件包含多组测试数据.第一行,一个整数T,表示测试数 ...

  3. java面试题之HashMap和TreeMap的区别

    HashMap和TreeMap的区别 相同点: 都是以key和value的形式存储: key不可以重复: 都是线程不安全的: 不同点: HashMap的key可以为空 TreeMap的key值是有序的 ...

  4. python根据文件目录、文件类型和文件与当前时间差删除文件

    直接贴代码: 删除某个目录下的文件,不遍历木路下文件夹下的文件,根据时间差删除,默认7天 #!/usr/bin/python # -*- coding: gbk -*- import os impor ...

  5. ACE的饼图显示保留两位小数

    修改源js文件:jquery.flot.pie.min.js <script src="/static/assets/js/jquery.flot.pie.min.js"&g ...

  6. CentOS 7.4升级Linux内核

    CentOS 7.4升级Linux内核 [日期:2018-01-15] 来源:Linux社区  作者:straycats [字体:大 中 小] 由于最近intel出了Meltdown和Spectre两 ...

  7. poj 3293 Rectilinear polygon

    Rectilinear polygon Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2125   Accepted: 24 ...

  8. SPOJ CIRU The area of the union of circles

    You are given N circles and expected to calculate the area of the union of the circles ! Input The f ...

  9. CSS3 动画卡顿性能优化解决方案--摘抄

    最近在开发小程序,与vue类似,它们都有生命周期这回事. onLoad 监听页面加载 onReady 监听页面初次渲染完成 onShow 监听页面显示 到底是什么意思? 所以这又触碰到了我的知识盲区, ...

  10. 标准C程序设计七---114

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...