Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> RecyclerView完全解析之結合AA(Android Annotations)注入框架實例(三十)

RecyclerView完全解析之結合AA(Android Annotations)注入框架實例(三十)

編輯:關於Android編程

(一).前言:

話說RecyclerView已經面市很久,也在很多應用中得到廣泛的使用,在整個開發者圈子裡面也擁有很不錯的口碑,那說明RecyclerView擁有比ListView,GridView之類控件有很多的優點,例如:數據綁定,Item View創建,View的回收以及重用等機制。本系列文章會包括到以下三個部分:

  1. RecyclerView控件的基本使用,包括基礎,進階,高級部分,動畫之類(點擊進入)
  2. RecyclerView控件的實戰實例(點擊進入)
  3. RecyclerView控件集合AA(Android Annotations)注入框架實例

    今天使我們本系列文章的第三講主要使用RecyclerView結合AA(Android Annotations)注入框架實例。本次講解所有用的Demo例子已經全部更新到下面的項目中了,歡迎大家star和fork。

    [注]關於AA(Android Annotations)注入框架的使用方法,我在CSDN上面已經更新一個專題(點擊進入),大家有興趣可以去了解學習一下。

     

    (二).基本實現

    這邊演示的也是比較簡單的效果,就是使用RecyclerView實現垂直滑動列表的效果。那麼 對於每一項Item的布局如下:

    1.Item布局文件:item_user_item.xml

     

    
    
        
        
    

     

    該上面布局上面有兩個文本框,然後創建一個實體類,裡邊兩個屬性:

    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.然後創建一個繼承LinearLayout的控件來注入布局,同時加入綁定數據的方法,AAUserItemView.java,該類需要通過@EViewGroup來進行注入:

     

    @EViewGroup(R.layout.item_user_item)
    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創建的是ViewHolder而不是View,所以這邊就不能簡單的注入ViewHolder類了。我們這邊創建一個泛型類把所有的View包裝成ViewHolder。

     

    /**
     * 當前類注釋:創建一個泛型類來把所有類型的View包裝成ViewHonlder
     * 項目名:FastDev4Android
     * 包名:com.chinaztt.fda.test.RecyclerViewAA
     * 作者:江清清 on 15/11/21 09:24
     * 郵箱:[email protected]
     * QQ: 781931404
     * 公司:江蘇中天科技軟件技術有限公司
     */
    public class ViewWrapper extends RecyclerView.ViewHolder {
        public V view;
        public ViewWrapper(V itemView) {
            super(itemView);
            view = itemView;
        }
        public V getView() {
            return view;
        }
    }

     

    5.緊接著我們為所有的RecyclerView適配器創建一個基類(抽象類),繼承RecyclerView.Adapter>。同時裡邊提供一個onCreateItemView(ViewGroup parent,intviewType)的抽象類,讓調用者自己實現來創建View。然後裡邊提供一個數據集合,來存儲綁定的數據。

     

    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  RecyclerViewAdapterBaseextends RecyclerView.Adapter>{
        /**
         * 存儲需要綁定的數據
         */
        protected List items = newArrayList();
        public List getItems() {
            return items;
        }
        public void setItems(List items) {
            this.items = items;
        }
     
        @Override
        public int getItemCount() {
            return items.size();
        }
     
        /**
         * 進行創建視圖承載類
         * @param parent
         * @param viewType
         * @return
         */
        @Override
        public final ViewWrapperonCreateViewHolder(ViewGroup parent, int viewType) {
            return new ViewWrapper(onCreateItemView(parent, viewType));
        }
        /**
         * 創建視圖Item,交給具體實現類完成
         * @param parent
         * @param viewType
         * @return
         */
        protected abstract VonCreateItemView(ViewGroup parent, int viewType);
     
    }

     

    6.下面我們來實現具體的Adapter,創建AAUserAdapter,並且這個類使用@EBean進行注解,繼承剛剛的Adapter基類,RecyclerViewAdapterBase。主要實現以下兩個方法:

    • protected AAUserItemView onCreateItemView(ViewGroup parent,int viewType)
    • Public void onBindViewHolder(ViewWrapper holder,int position)

      分別進行創建View,最後調用onBindViewHolder()方法來進行綁定數據。

       

      package com.chinaztt.fda.test.RecyclerViewAA;
      import android.content.Context;
      import android.view.ViewGroup;
      import org.androidannotations.annotations.EBean;
      import org.androidannotations.annotations.RootContext;
       
      /**
       * 當前類注釋:
       * 項目名:FastDev4Android
       * 包名:com.chinaztt.fda.test.RecyclerViewAA
       * 作者:江清清 on 15/11/21 09:35
       * 郵箱:[email protected]
       * QQ: 781931404
       * 公司:江蘇中天科技軟件技術有限公司
       */
      @EBean
      public class AAUserAdapter extends RecyclerViewAdapterBase {
          @RootContext
          Context context;
          /**
           * 創建Item視圖View
           * @param parent
           * @param viewType
           * @return
           */
          @Override
          protected AAUserItemView onCreateItemView(ViewGroup parent, int viewType) {
              return AAUserItemView_.build(context);
          }
          /**
           * 進行綁定數據View
           * @param holder
           * @param position
           */
          @Override
          public void onBindViewHolder(ViewWrapper holder, int position) {
              AAUserItemView view =holder.getView();
              TestUserBean userBean =items.get(position);
              view.bind(userBean);
          }
      }

       

      7.接下來需要進行使用RecyclerView和Adapter了,不過在使用之前首先需要准備數據,這邊我們准備了一個接口類AAUserFinder.java

       

      public interface AAUserFinder {
          List findAll();
      }

       

      然後就是AAUserFinder的實現類ImMemoryUserFinder.這邊實現接口中的findAll()方法,並且該類使用@EBean標簽注解。

       

      packag ecom.chinaztt.fda.test.RecyclerViewAA;
       
      import org.androidannotations.annotations.EBean;
       
      import java.util.ArrayList;
      import java.util.List;
       
      /**
       * 當前類注釋:
       * 項目名:FastDev4Android
       * 包名:com.chinaztt.fda.test.RecyclerViewAA
       * 作者:江清清 on 15/11/21 09:36
       * 郵箱:[email protected]
       * QQ: 781931404
       * 公司:江蘇中天科技軟件技術有限公司
       */
      @EBean
      public class ImMemoryUserFinder implements AAUserFinder{
          @Override
          public List findAll() {
              List userModels=new ArrayList();
              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實例化(不過根據多態性,這邊實例化的對象為ImMemoryUserFinder)。然後通過@AfterViews注解的方法發生調用,來創建布局管理器以及給Adapter提供數據,綁定數據即可。所有代碼如下:

       

      package com.chinaztt.fda.test;
       
      import android.os.Bundle;
      import android.support.v7.widget.LinearLayoutManager;
      import android.support.v7.widget.OrientationHelper;
      import android.support.v7.widget.RecyclerView;
      import android.view.View;
      import android.widget.LinearLayout;
      import android.widget.TextView;
       
      import com.chinaztt.fda.test.RecyclerViewAA.AAUserAdapter;
      import com.chinaztt.fda.test.RecyclerViewAA.AAUserFinder;
      import com.chinaztt.fda.test.RecyclerViewAA.ImMemoryUserFinder;
      import com.chinaztt.fda.ui.R;
      import com.chinaztt.fda.ui.base.BaseActivity;
       
      import org.androidannotations.annotations.AfterInject;
      import org.androidannotations.annotations.AfterViews;
      import org.androidannotations.annotations.Bean;
      import org.androidannotations.annotations.Click;
      import org.androidannotations.annotations.EActivity;
      import org.androidannotations.annotations.ViewById;
       
      /**
       * 當前類注釋:RecyclerView集合AA(Android Annotations)注入框架實現實例
       * 項目名:FastDev4Android
       * 包名:com.chinaztt.fda.test
       * 作者:江清清 on 15/11/20 14:41
       * 郵箱:[email protected]
       * QQ: 781931404
       * 公司:江蘇中天科技軟件技術有限公司
       */
      @EActivity(R.layout.recycler_aa_layout)
      public class RecyclerViewAAActivity  extends BaseActivity{
          @ViewById
          LinearLayout top_bar_linear_back;
          @ViewById
          TextView top_bar_title;
          @ViewById
          RecyclerView aa_recyclerview;
          @Bean
          AAUserAdapter adapter;
          @Bean(ImMemoryUserFinder.class)
          AAUserFinder userFinder;
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
          }
          @AfterViews
          public void initViews(){
             top_bar_title.setText(RecyclerView集合AA注入框架實例);
              //進行設置RecyerView ,並且綁定數據
              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框架不是太了解的話的,看上面的代碼內容,會有點暈的~不過我已經對於AA注入學習的專題已經更新了[AA(AndroidAnnotations)注入框架詳解專題,點擊進入...]

       

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved