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 ...
  • 概述: 有时候我们希望把想查询的数据和微信企业号平台集成,或者我们希望能在微信端,将微信中的账户与对应数据集中的字段关联,并通过访问报表获取要查询的字段信息,就好比各个营业厅查询个人当前.又或者,我们希望能够更加方便的编辑自动.如果将报表与公众号集成这些需求都可以实现.下面我就来介绍一下该如何集成. ...
一周排行
  • with语句为一个或一组语句指定默认对象,通常用来缩短特定情形下必须写的代码量. 其语法: with(object)  statements object是新的默认对象,statements是一个或多个语句 例如: ...
  • 公司线上的openstack环境运行了5个多月的时间,keystone库的token表已经增长到了31GB,这个数据量还是很大的,对于以后的数据库备份很不方便.每次管理openstack的时候,都会产生一个新的tok ...
  •    继上一篇文章后,现在要做的就是从车牌图像上使用optical character recognition算法将字符提取出来.对于每一块被检测的车牌,使用带监督的神经网络机器学习算法来识别字符. 本文内容: 1. ...
  • 原文地址:there are several new configuration settings available in FastCGI Extension 1.5 Beta 以下是FastCGI 1.5beta ...
  • 公司名称:上海麦格特尔网络科技有限公司(Magic Grids., Ltd.) 公司业务:网络游戏开发运营办公地址:宜山路829号(近桂菁路桂林路)总机号码:64959196 Job Requirements:- u ...
  • 问题是这样的: 接手新的项目,顿时吓尿了:整个程序有无数个断点,那么如何一次性删除呢?如下图:点击Belete Breakpoints 就可以了
  • 示例代码: 1 static void Main(string[] args) 2 { 3 ThreadPool.SetMaxThreads(4, 1); 4 object locker = new object() ...
  • 1.你要清楚的目标文件是32位还是64位的,如果生成的是32位,你就要使用32位的jre,如果生成的是64位,就要使用64位的jre.                                         ...
  • 项目需求:将html文件以及所用到的图片都放在 assets/html/ 目录下.然后在页面上通过WebView来显示   直接付上代码:     private void readHtmlFormAssets(){ ...
  • 通常我们所说的HTML文档即指HTML文件(也称为超文本标记语言文件文档) html文档(扩展名后缀名为html的文件) HTML文件是可以被多种网页浏览器读取,传递各类资讯的文件.从本质上来说,Internet( ...