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显示在屏幕上的时候才作为托付对象使用。

最新文章

  1. 安卓中的Model-View-Presenter模式介绍
  2. 1071. Speech Patterns (25)
  3. HTTP Content-Type的作用
  4. 第二个Sprint冲刺第十天
  5. .git文件过大!删除大文件
  6. 使用C#开发纽曼USB来电小秘书客户端小结
  7. JSLink to render the list to show people detail info with picture
  8. u-boot和linux的机器码
  9. 海园帮忙写的JQUERY功能,实现了我们想要的,我觉得有点屌哟~~
  10. ZJOI2013 防守战线
  11. codeforces293E (树上点分治+树状数组)
  12. String类疑虑
  13. Redis安装及使用
  14. 【Arduino】开源开发板说明
  15. cdnbest区域自定义配置里添加防xss攻击配置
  16. flex布局之flex-basis采坑
  17. leecode第七十题(爬楼梯)
  18. Apache提供的dbUtils
  19. MySQL &#183; 最佳实践 &#183; 分区表基本类型
  20. 快速获取APP对应的appPackage和appActivity

热门文章

  1. HDU——1003Max Sum(子序列最大和)
  2. iOS-汉字排序
  3. python基于SQLAlchemy的DBtools
  4. python:print含有中文的list
  5. codeforces 446C DZY Loves Fibonacci Numbers 数论+线段树成段更新
  6. [Codeforces Round #297 Div. 2] E. Anya and Cubes
  7. 浏览器的 16ms 渲染帧--摘抄
  8. 四、 java循环结构
  9. XSD(XML Schema Definition)学习笔记
  10. SPOJ GSS系列(数据结构维护技巧入门)