码迷,mamicode.com
首页 > 移动开发 > 详细

ListView优化总结(二)--Android

时间:2017-05-14 12:10:52      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:业务   屏幕   hang   rem   ber   content   main   cat   his   

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

标签:业务   屏幕   hang   rem   ber   content   main   cat   his   

原文地址:http://www.cnblogs.com/slgkaifa/p/6851613.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!