码迷,mamicode.com
首页 > 其他好文 > 详细

9.代码抽取(adapter)

时间:2015-11-16 17:09:40      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

技术分享
技术分享
1  抽取Adapter 共性的方法
2  把getView方法里 和holder相关的逻辑 摘取到Holder代码中
3  把Holder 相关的代码 抽取到BaseHolder中 
4  把adapter 中getVIew 方法 抽取到了DefaultAdpater中, 其中每个子类getView方法中holder不太一样,所以定义了抽象方法getHolder 要求子类去实现holder
  •  BaseHolder 所有holder的基类
  •  DefaultAdapter 所有adapter 的基类
BaseHolder
  1. public abstract class BaseHolder<T> {
  2. protected View contentView;
  3. protected T data;
  4. public BaseHolder(){
  5. contentView=initView();
  6. contentView.setTag(this); // 在这个位置设置的标签
  7. }
  8. public void setData(T data) {
  9. this.data=data;
  10. refreshView(data);
  11. }
  12. /**
  13. * 当Holder中的view对象显示到界面上的时候调用,即getview返回这个
  14. * @return
  15. */
  16. public View getContentView() {
  17. return contentView;
  18. }
  19. /**
  20. * 当setData调用的时候 会调用该方法 根据数据 显示界面
  21. */
  22. protected abstract void refreshView(T data);
  23. /**
  24. * 初始化View对象 及其控件
  25. * @return
  26. */
  27. protected abstract View initView();
  28. }
  29. 子类只需要填充数据和设置控件显示的数据就可以
DefaultAdapter
  1. public abstract class DefaultAdapter<T> extends BaseAdapter {
  2. private List<T> datas;
  3. public DefaultAdapter(List<T> datas){
  4. this.datas=datas;
  5. }
  6. @Override
  7. public int getCount() {
  8. return datas.size();
  9. }
  10. @Override
  11. public Object getItem(int position) {
  12. return datas.get(position);
  13. }
  14. @Override
  15. public long getItemId(int position) {
  16. return position;
  17. }
  18. //convertView 划出屏幕的view对象
  19. @Override
  20. public View getView(int position, View convertView, ViewGroup parent) {
  21. BaseHolder<T> holder;//和adapter的泛型一样
  22. if(convertView==null){
  23. holder=getHolder();
  24. }else{
  25. holder=(BaseHolder<T>)convertView.getTag();
  26. }
  27. T string = datas.get(position);
  28. //holder.refreshView(string);
  29. holder.setData(string);
  30. return holder.getContentView();
  31. }
  32. protected abstract BaseHolder<T> getHolder();
  33. }
MainActivity
  1. public class MainActivity extends Activity {
  2. private ListView lv;
  3. private List<String> datas;
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_main);
  8. datas=new ArrayList<String>();
  9. for(int i=0;i<100;i++){
  10. datas.add("aabbbcc"+i);
  11. }
  12. lv=(ListView) findViewById(R.id.lv);
  13. lv.setAdapter(new MainAdapter(datas));
  14. }
  15. public void click(View v){
  16. Intent intent=new Intent(getApplicationContext(), SecondActivity.class);
  17. startActivity(intent);
  18. }
  19. private class MainAdapter extends DefaultAdapter<String>{
  20. public MainAdapter(List<String> datas) {
  21. super(datas);
  22. // TODO Auto-generated constructor stub
  23. }
  24. @Override
  25. protected BaseHolder<String> getHolder() {
  26. return new MainHolder();
  27. }
  28. }
  29. class MainHolder extends BaseHolder<String>{
  30. private TextView tv;
  31. // 在adapter里list.get(position),然后调用了holer的setdate,而setdata调用了refresh,这样就把data传过来了
  32. @Override
  33. protected void refreshView(String data) {
  34. this.tv.setText(data);
  35. }
  36. @Override
  37. protected View initView() {
  38. View view=View.inflate(getApplicationContext(), R.layout.item_main, null);
  39. this.tv=(TextView) view.findViewById(R.id.tv);
  40. return view;
  41. }
  42. }
  43. }
SecondActivity
  1. public class SecondActivity extends Activity {
  2. private ListView lv_second;
  3. private List<Drawable> datas;
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_second);
  8. lv_second=(ListView) findViewById(R.id.lv_second);
  9. datas=new ArrayList<Drawable>();
  10. for(int i=0;i<100;i++){
  11. Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher);
  12. datas.add(drawable);
  13. }
  14. lv_second.setAdapter(new SecondAdapter(datas));
  15. }
  16. private class SecondAdapter extends DefaultAdapter<Drawable>{
  17. public SecondAdapter(List<Drawable> datas) {
  18. super(datas);
  19. }
  20. @Override
  21. protected BaseHolder<Drawable> getHolder() {
  22. return new SecondHolder();
  23. }
  24. }
  25. class SecondHolder extends BaseHolder<Drawable>{
  26. ImageView iv;
  27. @Override
  28. protected void refreshView(Drawable data) {
  29. iv.setImageDrawable(data);
  30. }
  31. @Override
  32. protected View initView() {
  33. View view=View.inflate(getApplicationContext(), R.layout.item_second, null);
  34. this.iv=(ImageView) view.findViewById(R.id.iv);
  35. return view;
  36. }
  37. }
  38. }





9.代码抽取(adapter)

标签:

原文地址:http://www.cnblogs.com/liuyu0529/p/4969281.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!