使用Activity和Delegate与Adapter交互

本文介绍如何利用委托模式将业务逻辑从Adapter移至Activity。通过创建示例项目,展示了如何处理列表中电话号码的添加和删除操作。在适配器中处理点击事件,但删除操作通过定义委托接口调用Activity的方法来实现。在Activity的onResume和onPause中管理委托注册,确保仅在Activity可见时执行委托操作。
摘要由CSDN通过智能技术生成

通过委托模式(Delegation Pattern)可以帮助我们把所有业务逻辑从Adapter中移动到Activity。
我们创建一个sample,通过该project可以向列表中添加电话号码,列表中每一行都有一个remove按钮,用于删除电话号码。
思路:在适配器中实现“remove”按钮的点击处理,但是并不在适配器中实现删除对象的方法。我们通过一个委托接口调用Activity的方法删除对象。

public class NumberAdapter extends ArrayAdapter<Integer>{

    public static final NumberAdapterDelegate{
        void removeItem(Integer value);
    }

    private LayoutInflater mInflater;
    private NumberAdapterDelegate mDelegate;

    public NumberAdapter(Context context,List<Integer> objects){
        super(context,0,objects);
        mInflater = LayoutInflater.from(context);
    }

    @override
    public View getView(intposition,View cv,ViewGroup parent){
        if(null == cv){
            cv = mInflater.inflater(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 delBtn = cv.findViewById(R.id.numbers_row_del);
        delBtn.setOnClickListener(new OnClickListener(){
            @override
            public void onClick(View v){
                if(null!=mDelegate){
                    mDelegate.removeItem(value);
                }
            }
        });
        return cv;
    }

    public void setDelegate(NumberAdapterDelegate delegate){
        this.mDelegate = delegate;
    }

}

定义委托接口,用于删除的操作,公开一个设置委托接口的方法;

最后在Activity中就可以轻易使用:

 public class MainActivity extends Activity implements NumberAdapterDelegate{
    private ListView listView;
    private ArrayList<Integer> mNumbers;
    private NumberAdapter mAdapter;

    @override
    public void onCreate(Bundle saveInstanceState){
        super.onCreate(saveInstanceState);
        setContentView(R.layout.main);
        // TODO initView initData....
    }

    @override
    public void onResume(){
        super.onResume();
        mAdapter.setDelegate(this);
    }

    @override
    public void onPause(){
        super.onPause();
        mAdapter.setDelegate(null);
    }

    @override
    public void removeItem(Integer value){
        mNumbers.remove(value);
        mAdapter.notifyDataSetChanged();
    }

}

我们并没有在onCreate方法中注册代理对象,而是在onResume方法中注册代理对象,在onPause方法中取消注册。这样做的目的是为了确保只在Activity显示的时候才作为委托对象使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值