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接口,该通过@EBean进行注解。适配器直接操作数据并且创建视图来显示这些数据;

 

 

@EBeanpublic 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类了,但是你可以使用@EViewGroup来进行注解。

现在创建一个泛型类来把所有类型的View包装成ViewHondler

 

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}
下面就可以开始使用了

 

 

@EBeanpublic 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已经全部讲解完成了。

 


分享给朋友:
您可能感兴趣的文章:
随机阅读: