(一).前言:
前面我们已经对于AndroidAnnotations框架集成OrmLite做了讲解,今天我们开始具体学习一下使用DI框架在Adapters和lists中的使用方法。
FastDev4Android框架项目地址:Https://github.com/jiangqqlmj/FastDev4Android
(二).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<Person> findAll(); }
我们现在需要创建一个PersonListActivity来列出所有的人。为了达到这一目的,我们需要一个PersonListAdater适配器来进行绑定数据到view中。并且同时需要PersonItemView,该用来表示列表中每一项item。我们这边使用的PersonItemView将会有两个Textview,实例如下:
@EViewGroup(R.layout.person_item) public class PersonItemView 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接口,该通过@EBean进行注解。适配器直接操作数据并且创建视图来显示这些数据;
@EBean public class PersonListAdapter extends BaseAdapter { List<Person> 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 class PersonListActivity 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类了,但是你可以使用@EViewGroup来进行注解。
现在创建一个泛型类来把所有类型的View包装成ViewHondler
public class ViewWrapper<V extends View> extends RecyclerView.ViewHolder { private V view; public ViewWrapper(V itemView) { super(itemView); view = itemView; } public V getView() { return view; } }
为所有的RecyclerView适配器创建一个基类
public abstract class RecyclerViewAdapterBase<T, V extends View> extends RecyclerView.Adapter<ViewWrapper<V>> { protected List<T> items = newArrayList<T>(); @Override public int getItemCount() { return items.size(); } @Override public final ViewWrapper<V>onCreateViewHolder(ViewGroup parent, int viewType) { return new ViewWrapper<V>(onCreateItemView(parent, viewType)); } protected abstract VonCreateItemView(ViewGroup parent, int viewType); // additional methods to manipulate theitems }
下面就可以开始使用了
@EBean public class PersonAdapter extends RecyclerViewAdapterBase<Person, PersonItemView> { @RootContext Context context; @Override protected PersonItemViewonCreateItemView(ViewGroup parent, int viewType) { return PersonItemView_.build(context); } @Override public void onBindViewHolder(ViewWrapper<PersonItemView> viewHolder, int position) { PersonItemView view =viewHolder.getView(); Person person = items.get(position); view.bind(person); } }
如果你为绑定方法创建一个接口,那么你可以把onBindViewHondler的实现移到基类中。
到此位置关于AndroidAnnotations最佳实践Apdaters和lists,RecyclerView,ViewHolder已经全部讲解完成了。
同时FastDev4Android项目已经添加配置了AndroidAnnotations框架,后期的框架项目中也会主要使用这个DI框架,.欢迎大家去Github站点进行clone或者下载浏览:https://github.com/jiangqqlmj/FastDev4Android 同时欢迎大家star和fork整个开源快速开发框架项目~