特別聲明:
一、前言
- 話說RecyclerView已經(jīng)面市很久,也在很多應(yīng)用中得到廣泛的使用,在整個開發(fā)者圈子里面也擁有很不錯的口碑,那說明RecyclerView擁有比ListView,GridView之類控件有很多的優(yōu)點,例如:數(shù)據(jù)綁定,Item View創(chuàng)建,View的回收以及重用等機制。那么今天開始我們來重點學(xué)習(xí)一下RecyclerView控件,本系列文章會包括到以下三個部分:
1. RecyclerView控件的基本使用,包括基礎(chǔ),進階,高級部分,動畫之類
2. RecyclerView控件的實戰(zhàn)實例
3. RecyclerView控件集合AA(Android Annotations)注入框架實例
- 今天使我們本系列文章的第三講主要使用RecyclerView結(jié)合AA(Android Annotations)注入框架實例。本次講解所有用的Demo例子已經(jīng)全部更新到下面的項目中了,歡迎大家star和fork。
[注]關(guān)于AA(android Annotations)注入框架的使用方法,我在CSDN上面已經(jīng)更新一個專題(點擊進入),大家有興趣可以去了解學(xué)習(xí)一下。
FastDev4Android框架項目地址:https://github.com/jiangqqlmj/FastDev4Android
二、基本實現(xiàn)
這邊演示的也是比較簡單的效果,就是使用RecyclerView實現(xiàn)垂直滑動列表的效果。
那么 對于每一項Item的布局如下:
1、Item布局文件:item_user_item.xml
<?xmlversionxmlversion="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:androidRelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="49dp">
<TextView
android:id="@+id/tv_first"
android:text="fist name"
android:textSize="16sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="8dp"/>
<TextView
android:id="@+id/tv_last"
android:text="last name"
android:textSize="16sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
android:layout_marginRight="8dp"/>
</RelativeLayout>
- 該上面布局上面有兩個文本框,然后創(chuàng)建一個實體類,里邊兩個屬性:
2、TestUserBean.java
public class TestUserBean {
private String firstName;
private String LastName;
public TestUserBean() {
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName){
this.firstName = firstName;
}
public String getLastName() {
return LastName;
}
public void setLastName(String lastName) {
LastName = lastName;
}
@Override
public String toString() {
return "UserModel{" +
"firstName='" +firstName + '\'' +
", LastName='" +LastName + '\'' +
'}';
}
}
3、然后創(chuàng)建一個繼承LinearLayout的控件來注入布局,同時加入綁定數(shù)據(jù)的方法,AAUserItemView.java,該類需要通過@EViewGroup來進行注入:
<span style="color:#ff0000;">@EViewGroup(R.layout.item_user_item)</span>
public class AAUserItemView extends LinearLayout {
@ViewById
TextView tv_first;
@ViewById
TextView tv_last;
public AAUserItemView(Context context) {
super(context);
}
public void bind(TestUserBean userBean) {
tv_first.setText(userBean.getFirstName());
tv_last.setText(userBean.getLastName());
}
}
4、因為這邊是使用的RecyclerView而不是簡單的ListView,那么這邊需要特殊進行處理。RecyclerView.Adapter創(chuàng)建的是ViewHolder而不是View,所以這邊就不能簡單的注入ViewHolder類了。我們這邊創(chuàng)建一個泛型類把所有的View包裝成ViewHolder。
/**
* 當前類注釋:創(chuàng)建一個泛型類來把所有類型的View包裝成ViewHonlder
*/
public class ViewWrapper<V extends View> extends RecyclerView.ViewHolder {
public V view;
public ViewWrapper(V itemView) {
super(itemView);
view = itemView;
}
public V getView() {
return view;
}
}
5、緊接著我們?yōu)樗械腞ecyclerView適配器創(chuàng)建一個基類(抽象類),繼承RecyclerView.Adapter<ViewWrapper<V>>。同時里邊提供一個onCreateItemView(ViewGroup parent,intviewType)的抽象類,讓調(diào)用者自己實現(xiàn)來創(chuàng)建View。然后里邊提供一個數(shù)據(jù)集合,來存儲綁定的數(shù)據(jù)。
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
public abstract class RecyclerViewAdapterBase<T,Vextends View>extends RecyclerView.Adapter<ViewWrapper<V>>{
/**
* 存儲需要綁定的數(shù)據(jù)
*/
protected List<T> items = newArrayList<T>();
public List<T> getItems() {
return items;
}
public void setItems(List<T> items) {
this.items = items;
}
@Override
public int getItemCount() {
return items.size();
}
/**
* 進行創(chuàng)建視圖承載類
* @param parent
* @param viewType
* @return
*/
@Override
public final ViewWrapper<V> onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewWrapper<V>(onCreateItemView(parent, viewType));
}
/**
* 創(chuàng)建視圖Item,交給具體實現(xiàn)類完成
* @param parent
* @param viewType
* @return
*/
protected abstract VonCreateItemView(ViewGroup parent, int viewType);
}
6、下面我們來實現(xiàn)具體的Adapter,創(chuàng)建AAUserAdapter,并且這個類使用@EBean進行注解,繼承剛剛的Adapter基類,RecyclerViewAdapterBase<TestUserBean,AAUserItemView>。主要實現(xiàn)以下兩個方法:
protected AAUserItemView onCreateItemView(ViewGroup parent,int viewType)
public void onBindViewHolder(ViewWrapper<AAUserItemView> holder,int position)
- 分別進行創(chuàng)建View,最后調(diào)用onBindViewHolder()方法來進行綁定數(shù)據(jù)。
<span style="color:#ff0000;">@EBean</span>
public class AAUserAdapter extends RecyclerViewAdapterBase<TestUserBean,AAUserItemView> {
@RootContext
Context context;
/**
* 創(chuàng)建Item視圖View
* @param parent
* @param viewType
* @return
*/
@Override
protected AAUserItemView onCreateItemView(ViewGroup parent, int viewType) {
<span style="color:#ff0000;">return AAUserItemView_.build(context);</span>
}
/**
* 進行綁定數(shù)據(jù)View
* @param holder
* @param position
*/
@Override
public void onBindViewHolder(ViewWrapper<AAUserItemView> holder, int position) {
AAUserItemView view =holder.getView();
TestUserBean userBean =items.get(position);
view.bind(userBean);
}
}
7、接下來需要進行使用RecyclerView和Adapter了,不過在使用之前首先需要準備數(shù)據(jù),這邊我們準備了一個接口類AAUserFinder.java
public interface AAUserFinder {
List<TestUserBean> findAll();
}
- 然后就是AAUserFinder的實現(xiàn)類ImMemoryUserFinder.這邊實現(xiàn)接口中的findAll()方法,并且該類使用@EBean標簽注解。
import org.androidannotations.annotations.EBean;
import java.util.ArrayList;
import java.util.List;
/**
* 當前類
*/
@EBean
public class ImMemoryUserFinder implements AAUserFinder{
@Override
public List<TestUserBean> findAll() {
List<TestUserBean> userModels=new ArrayList<TestUserBean>();
for(int i=1;i<=45;i++){
TestUserBean model=new TestUserBean();
model.setFirstName("First 張三:"+i);
model.setLastName("Last 李四:" + i);
userModels.add(model);
}
return userModels;
}
}
8、最后就是實例化RecyclerView以及使用AAUserAdapter了,該Activity采用@EActivity進行注解,通過@ViewById來注入初始化控件,通過@Bean來注入初始化AAUserAdapter以及AAUserFinder實例化(不過根據(jù)多態(tài)性,這邊實例化的對象為ImMemoryUserFinder)。然后通過@AfterViews注解的方法發(fā)生調(diào)用,來創(chuàng)建布局管理器以及給Adapter提供數(shù)據(jù),綁定數(shù)據(jù)即可。所有代碼如下:
/**
* 當前類注釋:RecyclerView集合AA(Android Annotations)注入框架實現(xiàn)實例
*/
<span style="color:#ff0000;">@EActivity(R.layout.recycler_aa_layout)</span>
public class RecyclerViewAAActivity extends BaseActivity{
<span style="color:#ff0000;">@ViewById
LinearLayout top_bar_linear_back;
@ViewById
TextView top_bar_title;
@ViewById
RecyclerView aa_recyclerview;
@Bean
AAUserAdapter adapter;
@Bean(ImMemoryUserFinder.class)
AAUserFinder userFinder;</span>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
<span style="color:#ff0000;">@AfterViews</span>
public void initViews(){
top_bar_title.setText("RecyclerView集合AA注入框架實例");
//進行設(shè)置RecyerView ,并且綁定數(shù)據(jù)
LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this);
linearLayoutManager.setOrientation(OrientationHelper.VERTICAL);
aa_recyclerview.setLayoutManager(linearLayoutManager);
adapter.setItems(userFinder.findAll());
aa_recyclerview.setAdapter(adapter);
}
@Click(R.id.top_bar_linear_back)
public void clickButton(View view){
this.finish();
}
}
9、運行效果大致如下:

10、上面的類有很多AA(Android Annotations)注入框架標簽的使用,如果各位童鞋對于AA框架不是太了解的話的,看上面的代碼內(nèi)容,會有點暈的~不過我已經(jīng)對于AA注入學(xué)習(xí)的專題已經(jīng)更新了[AA(AndroidAnnotations)注入框架詳解專題,點擊進入...]
三、最后總結(jié)
今天我們通過實例來演示了RecyclerView和AA注入框架的結(jié)合使用方法。
本次具體實例注釋過的全部代碼已經(jīng)上傳到FastDev4Android項目中了。同時歡迎大家去Github站點進行clone或者下載瀏覽:https://github.com/jiangqqlmj/FastDev4Android 同時歡迎大家star和fork整個開源快速開發(fā)框架項目~后面應(yīng)大家的要求,會更新RecyclerView下拉刷新和上拉更多效果以及RecyclerView打造的Gallery 3D版本的功能文章,敬請期待~
再次聲明:本文轉(zhuǎn)載自:http://blog.csdn.net/developer_jiangqq/article/details/49967587