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 ...
  • 概述: 有时候我们希望把想查询的数据和微信企业号平台集成,或者我们希望能在微信端,将微信中的账户与对应数据集中的字段关联,并通过访问报表获取要查询的字段信息,就好比各个营业厅查询个人当前.又或者,我们希望能够更加方便的编辑自动.如果将报表与公众号集成这些需求都可以实现.下面我就来介绍一下该如何集成. ...
一周排行
  • 数据库环境:SQL SERVER2008R2 需求如下图: 简单解释一下需求,将同一年月的多行转到一行,分别展示每个用户的信息,在最后分别对前面数量和金额进行合计. 这其实又是行列转换的一个应用,下面直接贴SQL / ...
  • 初到美国,没有4G的概念.为了合理规划通讯费,我和老公仔细比较了美国的几大运营商,决定两部手机分别办一个签约套餐和一个付费电话卡.美国比较出名的有四大通讯公司,AT&T.Verizon.T-MOBIL和SPR ...
  • 最近重装了一下系统,忽然发现在安装vs2010时,一直出现如下错误:miicrosoft 应用程序报告[安装失败])     从网上查找了很多资料,都没有明确的标明如何去修改,经过半天的努力终于找出解决方案,仅供大家 ...
  • 无意中想起SQLite,于是发起了这么一个话题,感谢各位朋友的参与,我把大家的话收集一下,放在这里. @sshg PY算一个吧.当初看了一个下午就决定ditch Perl了.Haskell算另一个吧.看到type c ...
  •  安装GTK的时候报了 2052和2053的错误是因为 MSI文件在win8的执行权限不够造成的 msiexec /i gtk.msi 解决问题!
  • 说明:本文大部分内容来源于MSDN,我主要对内容进行了梳理,并对其中一些细节地方做了描述 本文只在进行功能说明与一些相关产品方面的介绍,并不是所谓的软文,. 水晶报表本来是CrystalDecisions的产品,之后 ...
  • .19  PS1.在用此命令cpLinux与Linux之间的数据时发现有些服务器上默认没有安装scp但用yum -y install scp提示么有这样的包 后来发现原来scp工具的安装包名字是opens ...
  • 易网科技讯  3月2日消息,淘宝网近日宣布加入气候组织(The Climate Group)成为其全球会员,成为气候组织在中国的第八位会员.其它七个会员公司包括:中国移动.尚德电力.远大空调.联想等. 气候组织是世界 ...
  • sqlite的安装1. 首先是下载sqlite,可以该页面下载:当前的最新版本为:sqlite-shell-win32-x070701.zip这个是windows下sqlite的命令行管理工具,用它可以管理s ...
  • 第一届新东方ORZ盛典将在北京于5月17日开启,据悉,活动将持续两天,于18日晚上结束.活动会在北京的一家五星级酒店内,届时新东方ORZ组织内成员,重量级嘉宾和各大主流媒体均会出席.盛典将结合21世纪新青年的独特特质 ...