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 ...
  • 概述: 有时候我们希望把想查询的数据和微信企业号平台集成,或者我们希望能在微信端,将微信中的账户与对应数据集中的字段关联,并通过访问报表获取要查询的字段信息,就好比各个营业厅查询个人当前.又或者,我们希望能够更加方便的编辑自动.如果将报表与公众号集成这些需求都可以实现.下面我就来介绍一下该如何集成. ...
一周排行
  • 昨日上午,出租车司机田师傅停驶后,查看嘀嘀打车软件中的补贴和乘客支付的车款.新京报记者 刘珍妮 摄新京报讯 对于出租车内安装多个"手机叫车终端",可能导致驾驶员抢单产生安全隐患的问题,北京市交通委 ...
  • 重定向   重定向客户端请求是确保用户得到正确页面的一种方法,它适用于站点正在建设之中或已改变标识的情况.您可以将客户端请求重定向到同一 Web 服务器上的某个目录,或者重定向到另一个 URL. 重定向变量 可以使用 ...
  • .9实现层类图
  • 1. 启用会话状态 Enable-SPSessionStateService –DefaultProvision 或 Enable-SPSessionStateService –DatabaseName Sessio ...
  • 1.3 App类控件     MainActivity.java [java] package com.example.apppalettesdemo;    import andro id.app.Activity ...
  • 易网科技讯 3月30日消息,太平洋网络今天发布公告称决定改变全球发售所得款项用途,并建议向股东派发特别股息,计划将全球发售部分所得款项净额用于以下用途: -约1.3亿港元(相当于所得款项净额的22.7%)用作扩充与改 ...
  •        从我刚到华为,到离开华为一直受益于这句话.        我刚到华为,有一次在百草园打篮球的时候,碰到了一位刚从华为离职,跳到了MOTO的家伙,交谈的内容都忘记了,他的名字也记不住了,名片也弄丢了.只是 ...
  • 英文原文链接:http://performancing.com/node/169 中文翻译链接:http://totem.totematncu.net/post/1/1545 Chris Garrett依其经验写下十 ...
  • 天天风之旅韩梅梅是全新的S级角色,集齐WONDERFUL字母大量加分,进阶之后还能进入专属奖励关卡,这里小编就为大家推荐韩梅梅的装备搭配方式 天天风之旅韩梅梅是全新的S级角色,集齐WONDERFUL字母大量加分,进阶 ...