【FastDev4Android框架开发】AndroidAnnnotations注入框架使用之最佳实践之Adapters和lists(十六)

jerry Android 2015年11月26日 收藏

().前言:   

        前面我们已经对于AndroidAnnotations框架集成OrmLite做了讲解,今天我们开始具体学习一下使用DI框架在Adapters和lists中的使用方法。

      FastDev4Android框架项目地址:https://github.com/jiangqqlmj/FastDev4Android 

().Apdaterslists介绍使用:   

         这边只是展示一下使用AndroidAnnotations来进行简单处理AdapterAdapterView。下面是使用实例:

首先先由一个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绑定PersonListAdapterListView中,但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();
    }
}

 ().RecyclerViewViewHolder使用:


如果你使用的是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最佳实践Apdaterslists,RecyclerView,ViewHolder已经全部讲解完成了。

同时FastDev4Android项目已经添加配置了AndroidAnnotations框架,后期的框架项目中也会主要使用这个DI框架,.欢迎大家去Github站点进行clone或者下载浏览:https://github.com/jiangqqlmj/FastDev4Android 同时欢迎大家starfork整个开源快速开发框架项目~