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 ...
  • 概述: 有时候我们希望把想查询的数据和微信企业号平台集成,或者我们希望能在微信端,将微信中的账户与对应数据集中的字段关联,并通过访问报表获取要查询的字段信息,就好比各个营业厅查询个人当前.又或者,我们希望能够更加方便的编辑自动.如果将报表与公众号集成这些需求都可以实现.下面我就来介绍一下该如何集成. ...
一周排行
  • 最新的IPv6 Ready Logo tool http://interop.ipv6.org.tw/CERouter/      安装最新的tool,要求FreeBSD在8.0以上 uname  -r查看版本 参照 ...
  • 比起小米电视和小米手机,小米路由器的路子让普通用户看不懂,虽然价格较同档次产品便宜一半,但699元的定价仍然是高端而小众的产品,以至于外界有种种质疑,但为何小米步子如此之大?围绕这款产品的家庭互联网布局是最大目的,却 ...
  • 水题,直接上代码了 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<cmath& ...
  • (1)找到数组中最小或最大的数字 var v = [1,23,4,9]; console.log(Math.min.apply(Math,v));  
  • 标 题 : [ 建立你的.NET 3.0开发环境 ] DotNet开发圣殿: http://blog.csdn.net/dotnetcool/archive/2006/11/17/1389813.aspx 标  题 ...
  • CString类的定义如下: class CMyString{ public: CMyString(const char* pData=NULL); CMyString(const CMyString& st ...
  • OpenCASCADE Application Framework Data Framework Services [email protected] 一.概述Overview OpenCASCADE的数据框架对来自不同程序 ...
  • 堆栈的经典应用,四则表达式的元算.这里只能操作的符号是:+ - * / ().不支持大括号... 下面是代码:package net.itaem.test; import java.util.ArrayList; i ...
  • 熬夜看完苹果发布会的果粉和果黑们,你们的心情肿么样?是觉得还不如睡觉算了,还是非常怀念乔帮主呢? 好消息!召唤乔布斯不再是幻想! 苹果发布iPhone 5c的最大秘密:凑齐8种颜色,就能召唤出乔布斯了!   帽子绿, ...
  • 1.修改 php.ini 加载路径     添加环境变量 ,新建系统变量 PHPRC ,配置如下:          检验: 通过phpinfo(),查看系统配置     Loaded Configuration F ...