RecyclerView完全解析(三)——結(jié)合AA(Android Annotations)注入框架實例

特別聲明:

一、前言

  • 話說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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容