9.代码抽取(adapter)


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. }

来自为知笔记(Wiz)

时间: 2024-08-07 12:38:30

9.代码抽取(adapter)的相关文章

Java Web项目中的经典代码抽取

前言: 众所周知的,项目开发中做得最多的无非就是增删查改(CRUD)操作.自从国内Web项目开发渐渐盛行SSH框架之后,其开发开发流程也变得更加灵活:本文就项目开发中的业务层代码作个简单的抽取,供业内朋友参考. 代码抽取原理图如下: 这个图主要展示开发中的2个业务,账号(Account)管理跟类别(Category)管理,具体代码实现比较简单就不附上了.从上面的UML图中我们只需要抽象出BaseService接口并且实现BaseServiceImpl类,其他业务的实现一概继承BaseServic

非代码抽取的dex加固脱壳

常见的非代码抽取的dex加固,可以通过修改或者hook源码中的dex解析函数拿到目标dex完成脱壳.该dex解析函数为DexFile* dexFileParse(const u1* data, size_t length, int flags),位于src4.4.4_r1/dalvik/libdex/DexFile.cpp文件. 1.修改源码,编译系统,实现脱壳,使用该方法的代表工具--“DexExtractor”.对其的介绍和使用教程见一大牛博客: http://www.wjdiankong.

Dao接口和实现类以及Service接口和实现类代码抽取

紧接着上次无线点餐项目的文档,我们进行Dao层抽取. 6.Dao接口以及实现类代码抽取 对于BoardDao和CuisineDao的处理接口和实现类,除了定义自己的特有方法外,其他基本功能的CRUD方法都一样,只是操作的实体对象不一样.为了代码的复用,简化代码,我们可以将公共的CRUD方法提取到BaseDao中,只需要实现接口即可. 同理, 不同的实现类,实现CRUD相同的业务逻辑的时, 除了操作的实体不同,其他都是相同的, 所以我们可以把相同的业务逻辑实现,抽取出来,放到BaseSericeI

Thymeleaf静态资源引入方式及公共页面代码抽取

静态资源引入 Thymeleaf模板引擎url问题,要用如下的方式写,确保在任何情况下都能访问到 <!-- Bootstrap core CSS --> <link href="bootstrap/dist/css/bootstrap.min.css" rel="stylesheet"> <!-- 引用webjars的方式引入静态资源 --> <link th:href="@{/webjars/bootstrap/

006 代码抽取 - bos

一.基于Hibernate的Dao层代码的抽取 1.定义BaseDao接口,其他Dao接口继承该接口 2.在Dao接口定定义基本的增删改查和分页有关的方法 public interface BaseDao<T> { /** * 保存实体 * @param entity */ void save(T entity); /** * 删除实体 * @param entity */ void delete(T entity); /** * 根据实体Id删除实体 * @param id */ void

mybatis公用代码抽取到单独的mapper.xml文件

同任何的代码库一样,在mapper中,通常也会有一些公共的sql代码段会被很多业务mapper.xml引用到,比如最常用的可能是分页和数据权限过滤了,尤其是在oracle中的分页语法.为了减少骨架性代码,通常将它们抽象到sql中,但是肯定又不能在每个mapper中也包含,这样就没有意义了.此时,可以将这部分移到专门的mapper.xml中,比如common.xml,其中包含如下: <?xml version="1.0" encoding="UTF-8"?>

网络加载数据及单例工具类的代码抽取

今天给大家分享一一下网络加载数据:先看代码吧-------------------------- - (void)diseaseNumWithFinishedBlock:(FinishedBlocks)finishedBlock{ NSString *urlStr = @"http://数据接口"; NSDictionary *prama = @{响应参数}; [[NetWorkTool sharedNetWorkTool] POST:urlStr parameters:prama p

三处代码实现Adapter加载动画,还可自定义动画效果

效果图: 由于不会录制gif,所以只有截图展示效果,希望各位能告知如何截动态图 第一步:添加滑动监听 mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {//判断滑动方向 @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); i

Flask项目架构之代码抽取

# manage.py 文件 from flask_script import Manager from flask_migrate import Migrate,MigrateCommand from .info import app,db manager = Manager(app) # 用于数据库迁移 Migrate(app, db) manager.add_command('db',MigrateCommand) if __name__ == '__main__': # app.run(