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. python多进程(multiprocessing)

    最近有个小课题,需要用到双进程,翻了些资料,还算圆满完成任务.记录一下~ 1.简单地双进程启动 同时的调用print1()和print2()两个打印函数,代码如下: #/usr/bin/python ...

  2. 【bzoj2843】极地旅行社 LCT

    题目描述 不久之前,Mirko建立了一个旅行社,名叫“极地之梦”.这家旅行社在北极附近购买了N座冰岛,并且提供观光服务.当地最受欢迎的当然是帝企鹅了,这些小家伙经常成群结队的游走在各个冰岛之间.Mir ...

  3. HDU——1303Doubles(水题,试手二分查找)

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

  4. Codeforces834D - The Bakery

    Portal Description 给出一个\(n(n\leq35000)\)个数的数列\(\{a_i\}\)和\(m(m\leq50)\).将原数列划分成\(m\)个连续的部分,每个部分的权值等于 ...

  5. 网络流(自行理解的Dinic)

    自行理解的Dinic 注释即讲解 #include<bits/stdc++.h> ; using namespace std; int read() { ,w=; ;ch=getchar( ...

  6. [暑假集训--数位dp]hdu3709 Balanced Number

    A balanced number is a non-negative integer that can be balanced if a pivot is placed at some digit. ...

  7. Red is good(bzoj 1419)

    Description 桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元.可以随时停止翻牌,在最优策略下平均能得到多少钱. Input 一 ...

  8. 【CF1028B】Unnatural Conditions(构造)

    题意:给定n与m,要求构造两个长度不超过2230的数字x,y使得x,y各自的数位和>=n,x+y的数位和<=n 思路: #include<cstdio> #include< ...

  9. python 之 线程池实现并发

    使用线程池实现高IO并发 模块:ThreadPoolExecutor, as_completed 测试代码如下: #!/opt/python3/bin/python3 from concurrent. ...

  10. [原创][FPGA]有限状态机FSM学习笔记(一)

    1. 概述--何为有限状态机FSM? 有限状态机-Finite State Machine,简写为FSM,是表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用.通常 ...