使用Activity和Delegate与Adapter交互

来源:互联网 发布:unity3d 5.0 编辑:程序博客网 时间:2024/05/17 03:22

通过委托模式(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显示的时候才作为委托对象使用。

0 0
原创粉丝点击