使用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请求时,开发者可以设置一个委托对象,当请求处理完毕后指定一些操作。当编写程序时,我们应时刻注意使用委托对象来组织代码。

代码地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值