1. 程式人生 > >使用Activity和Delegate與介面卡互動

使用Activity和Delegate與介面卡互動

在這個Demo裡,我們會分析如何通過委託模式(Delegation Pattern)幫助開發者把所有的業務邏輯從介面卡中移到Activity中。我們建立一個簡單的應用程式,通過該應用程式可以向列表中新增電話號碼,列表中每一行都有一個Remove按鈕,用於刪除電話號碼。

在介面卡中實現“Remove”按鈕的點選處理器,但是,並不在介面卡中實現刪除物件的方法。我們通過一個委託介面呼叫Activity的方法刪除物件。首先建立介面卡的程式碼,如下所示:

package com.example.huangfei.myapplication;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import java.util.List;

/**
 * Created by huangfeihong on 2015/12/19.
 */
public class NumbersAdapter extends ArrayAdapter<Integer> { //定義委託介面 public interface NumbersAdapterDelegate { void removeItem(Integer value); } private Context mContext; private LayoutInflater mInflater; private NumbersAdapterDelegate mDelegate; public NumbersAdapter
(Context context, List<Integer> objects) { super(context, 0, objects); mContext = context; mInflater = LayoutInflater.from(context); } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) convertView = mInflater.inflate(R.layout.number_row, parent, false
); final Integer value = getItem(position); TextView tv = (TextView) convertView.findViewById(R.id.numbers_row_text); tv.setText(value.toString()); View button = convertView.findViewById(R.id.numbers_row_button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (null != mDelegate) {//刪除物件 mDelegate.removeItem(value); } } }); return convertView; } //為介面卡設定委託物件 public void setDelegate(NumbersAdapterDelegate delegate) { mDelegate = delegate; } }

現在介面卡已經準備就緒,接下來分析Activity的程式碼:

package com.example.huangfei.myapplication;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends Activity implements NumbersAdapter.NumbersAdapterDelegate {
    private static final String TAG = MainActivity.class
            .getCanonicalName();

    private ListView mListView;
    private ArrayList<Integer> mNumbers;
    private NumbersAdapter mAdapter;
    private EditText mEditText;

    @Override
    protected 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);
    }

    @Override
    protected void onPause() {
        super.onPause();
        //取消註冊委託物件
        mAdapter.setDelegate(null);
    }

    @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);
        }
    }
}

委託模式在IOS開發中也被大量使用。比如,建立HTTP請求時,開發者可以設定一個委託物件,當請求處理完畢後指定一些操作。當編寫程式時,我們應時刻注意使用委託物件來組織程式碼。

程式碼地址