您的位置:首页 > 其它

使用Activity和Delegate与Adapter交互

2015-10-09 00:40 169 查看
通过委托模式(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显示的时候才作为委托对象使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息