AndroidAnnnotations注入框架使用之最佳实践之Adapters和lists(十六)

 

 

(一).前言:

前面我们已经对于AndroidAnnotations框架集成OrmLite做了讲解,今天我们开始具体学习一下使用DI框架在Adapters和lists中的使用方法。

 

(二).Apdaters和lists介绍使用:

这边只是展示一下使用AndroidAnnotations来进行简单处理Adapter和AdapterView。下面是使用实例:

首先先由一个Person实体类:

 

public class Person{
    public final String firstName;
    public final String lastName;
 
    public Person(String firstName, StringlastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}
然后有一个PersoFinder接口:

 

 

public interfacePersonFinder {
    List findAll();
}

 

我们现在需要创建一个PersonListActivity来列出所有的人。为了达到这一目的,我们需要一个PersonListAdater适配器来进行绑定数据到view中。并且同时需要PersonItemView,该用来表示列表中每一项item。我们这边使用的PersonItemView将会有两个Textview,实例如下:

 

@EViewGroup(R.layout.person_item)
public classPersonItemView extends LinearLayout {
 
    @ViewById
    TextView firstNameView;
 
    @ViewById
    TextView lastNameView;
 
    public PersonItemView(Context context) {
        super(context);
    }
 
    public void bind(Person person) {
       firstNameView.setText(person.firstName);
        lastNameView.setText(person.lastName);
    }
}
现在有一个InMemoryPersonFinder实现了PersonFinder接口,[email protected]建视图来显示这些数据;

 

 

@EBean
public classPersonListAdapter extends BaseAdapter {
 
    List persons;
 
    @Bean(InMemoryPersonFinder.class)
    PersonFinder personFinder;
 
    @RootContext
    Context context;
 
    @AfterInject
    void initAdapter() {
        persons = personFinder.findAll();
    }
 
    @Override
    public View getView(int position, ViewconvertView, ViewGroup parent) {
 
        PersonItemView personItemView;
        if (convertView == null) {
            personItemView =PersonItemView_.build(context);
        } else {
            personItemView = (PersonItemView)convertView;
        }
 
        personItemView.bind(getItem(position));
 
        return personItemView;
    }
 
    @Override
    public int getCount() {
        return persons.size();
    }
 
    @Override
    public Person getItem(int position) {
        return persons.get(position);
    }
 
    @Override
    public long getItemId(int position) {
        return position;
    }
}
PersonListActivity绑定PersonListAdapter到ListView中,但PersonItemView被点击的时候,显示一个toast。

 

 

@EActivity(R.layout.person_list)
public classPersonListActivity extends Activity {
    @ViewById
    ListView personList;
 
    @Bean
    PersonListAdapter adapter;
 
    @AfterViews
    void bindAdapter() {
        personList.setAdapter(adapter);
    }
 
    @ItemClick
    void personListItemClicked(Person person) {
        makeText(this, person.firstName +  + person.lastName, LENGTH_SHORT).show();
    }
}
(三).RecyclerView和ViewHolder使用:

 

如果你使用的是RecyclerView而不是简单的ListView,那么就要特殊处理了。RecyclerView.Apdater创建ViewHolder而不是view。所以你这边就不能简单注入ViewHolder类了,[email protected]

[email protected]Hondler

 

public classViewWrapper extends RecyclerView.ViewHolder {
 
    private V view;
 
    public ViewWrapper(V itemView) {
        super(itemView);
        view = itemView;
    }
 
    public V getView() {
        return view;
    }
}
为所有的RecyclerView适配器创建一个基类

 

 

public abstractclass RecyclerViewAdapterBase extendsRecyclerView.Adapter> {
 
    protected List items = newArrayList();
 
    @Override
    public int getItemCount() {
        return items.size();
    }
 
    @Override
    public final ViewWrapperonCreateViewHolder(ViewGroup parent, int viewType) {
        return newViewWrapper(onCreateItemView(parent, viewType));
    }
 
    protected abstract VonCreateItemView(ViewGroup parent, int viewType);
 
    // additional methods to manipulate theitems
}
下面就可以开始使用了

 

 

@EBean
public classPersonAdapter extends RecyclerViewAdapterBase {
 
    @RootContext
    Context context;
 
    @Override
    protected PersonItemViewonCreateItemView(ViewGroup parent, int viewType) {
        return PersonItemView_.build(context);
    }
 
    @Override
    public voidonBindViewHolder(ViewWrapper viewHolder, int position) {
        PersonItemView view =viewHolder.getView();
        Person person = items.get(position);
 
        view.bind(person);
    }
 
}
如果你为绑定方法创建一个接口,那么你可以把onBindViewHondler的实现移到基类中。

 

到此位置关于AndroidAnnotations最佳实践Apdaters和lists,RecyclerView,ViewHolder已经全部讲解完成了。

 

更多相关文章
  • '将随机改变LAbel1控件的前景色  <div>Randomize</div> <div>Label1.ForeColor = RGB(Rnd * 255, ren * 255, Rnd * 255)</div> <div>字体</ ...
  • 在马云高调推动来往后,平安的马明哲,也带头推动在内部的电子钱包---"壹钱包"据曝光的平安集团董事长马明哲在平安集团新年内部讲话中,再次提到1月中旬上市的移动社交金融服务平台"壹钱包".南都记者昨日下载内测版体验,实际体验一般,实用工具中仅有"友钱& ...
  • Mac显示/隐藏文件的终端命令   苹果Mac OS X操作系统下,隐藏文件是否显示有很多种设置方法, 最简单的要算在Mac终端输入命令.显示/隐藏Mac隐藏文件命令如下(注意其中的空格):    显示 Mac 隐藏文件的命令:   defaults write com.apple.finder A ...
  • Problem:     solution:   A workaround is to copy your files to the old directory. Just copy the aapt.exe file from %android_sdk%\build-tools\17.0.0 to ...
  • 概述: 有时候我们希望把想查询的数据和微信企业号平台集成,或者我们希望能在微信端,将微信中的账户与对应数据集中的字段关联,并通过访问报表获取要查询的字段信息,就好比各个营业厅查询个人当前.又或者,我们希望能够更加方便的编辑自动.如果将报表与公众号集成这些需求都可以实现.下面我就来介绍一下该如何集成. ...
一周排行
  • 微博上一哥们发了张MM,作为屌丝只能羡慕嫉妒恨,只好看看在哪里了. 这里推荐一款google插件:(只提供名称 自行google 避免伸手党) 把MM照片放进去看看,得到相机型号.拍摄日期等信息: 最重要的还是GPS ...
  • Problem Description: 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10)和M条通道(M<=100),每个通道都是单向的,就是说若称某通道连通了A房间和B房 ...
  • 放下身段,放下衣食父母的态度,放下你死我活的竞争思维,三大运营商的应用商店,能来一次逆袭,并非不可能.当面对共同的敌人时,三大运营商破天荒地合作了.最近传出的消息是,称移动.联通.电信三大运营商的应用商店将于5月17 ...
  • LG在今年9月份的IFA大展上展示了首款基于纳米级照明技术(NANO lighting technology)的3D电视LEX8,如今韩国电视大厂再度推出了新一代LW9500.LW7700高端3D电视.新一代高端3D ...
  • <pre name="code" class="java"><span style="font-family: Arial, Helvetica, ...
  • 1. PCA整体思想 PCA,Principle Componet Analysis,主成分分析,主要用于数据降维.它通过计算给定数据集的协方差矩阵的特征值和特征向量,来得到数据集最关键的方向(数据集在此方向的投影方 ...
  • eclipse 性能调优之内存分配         如果觉得自己的 eclipse 比较慢,可以通过修改 %eclipse_home%/eclipse.ini 文件进行调整:        将 -Xms 和 -Xmx ...
  • 使用环境Ubuntu Linux系统下: 在学习鸟哥的私房菜时,使用了如下命令 usermod -G users username username为你自己的用户名. 由于没有使用-a参数导致我的用户被分到了user ...
  • 每个浏览器都有自己的默认样式,这是一段预定义的CSS,用以简单地呈现网页.在Firefox中的地址栏中输入resource://gre/res/html.css即可以看到该浏览器的默认样式.在Firebug 1.2 ...
  • 摘自https://github.com/beego/tutorial/blob/master/zh/3/params.slide * beego的默认参数 - AppName 应用名称,默认是 beego.通过be ...