1. 程式人生 > >使用RecyclerView實現動態新增頭佈局,腳佈局

使用RecyclerView實現動態新增頭佈局,腳佈局

通過重寫RecyclerView.Adapter來實現新增頭腳佈局的功能

-----具體使用

1 建立adapter繼承DBaseRecyclerViewAdapter,實現onCreateViewHolder1()方法,繫結佈局

2 建立viewholder繼承DBaseRecyclerViewHolder,實現setData()方法,設定頁面資料

3 繫結自定義的adapter與DRecyclerViewAdapter

4 新增腳佈局

5 設定adapter到recyclerView

---虛擬碼

        MyAdapter myAdapter = new MyAdapter(this, arrayList);
        DRecyclerViewAdapter recyclerViewAdapter = new DRecyclerViewAdapter(myAdapter);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
        gridLayoutManager.setSpanSizeLookup(new DSpanSizeLookup(recyclerViewAdapter, gridLayoutManager.getSpanCount() - 2));
        recyclerView.setLayoutManager(gridLayoutManager);
        ((DefaultItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
        recyclerViewAdapter.addFootView(view1);
        recyclerView.setAdapter(recyclerViewAdapter);

---繼承自RecyclerView.Adapter的類

public abstract class DBaseRecyclerViewAdapter<T> extends RecyclerView.Adapter<DBaseRecyclerViewHolder> {

    private List<T> mDatas;
    private Context mContext;


    /**
     * 預設點選監聽事件
     */
    public interface OnClickItemListener {
        void onClick(int poisiton);
    }

    OnClickItemListener onClickItemListsner;

    public void setOnClickItemListsner(OnClickItemListener onClickItemListsner) {
        this.onClickItemListsner = onClickItemListsner;
    }

    public OnClickItemListener getOnClickItemListsner() {
        return onClickItemListsner;
    }

    private DRecyclerViewAdapter mDRecyclerViewAdapter;

    public DRecyclerViewAdapter getmDRecyclerViewAdapter() {
        return mDRecyclerViewAdapter;
    }

    public void setDRecyclerViewAdapter(DRecyclerViewAdapter mDRecyclerViewAdapter) {
        this.mDRecyclerViewAdapter = mDRecyclerViewAdapter;
    }


    private DRecyclerViewAdapter dRecyclerViewAdapter;


    public DBaseRecyclerViewAdapter(List<T> mDatas, Context mContext) {
        this.mDatas = mDatas;
        this.mContext = mContext;
    }

    @Override
    public DBaseRecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return onCreateViewHolder1(parent, viewType);
    }

    protected abstract DBaseRecyclerViewHolder onCreateViewHolder1(ViewGroup parent, int viewType);

    @Override
    public void onBindViewHolder(DBaseRecyclerViewHolder holder, int position) {
        holder.setData(mDatas.get(position), position);
    }

    @Override
    public int getItemCount() {
        return mDatas.size();
    }


    public boolean isHeader(int position) {
        return getHeaderViewsCount() > 0 && position < getHeaderViewsCount();
    }


    public boolean isFooter(int position) {
        int lastPosition = getItemCount() - 1;
        return getFooterViewsCount() > 0 && position > lastPosition - getFooterViewsCount() && position <= lastPosition;
    }

    private int getFooterViewsCount() {
        return mDRecyclerViewAdapter.getFootSize();
    }

    public int getHeaderViewsCount() {
        return mDRecyclerViewAdapter.getHeadSize();
    }
}
----繼承自RecyclerView.ViewHolder的viewHolder
public abstract class DBaseRecyclerViewHolder<T> extends RecyclerView.ViewHolder {

    private DBaseRecyclerViewAdapter dBaseRecyclerViewAdapter;
    private DRecyclerViewAdapter mDRecyclerViewAdapter;

    DBaseRecyclerViewAdapter.OnClickItemListener onClickItemListsner;

    public DBaseRecyclerViewAdapter.OnClickItemListener getOnClickItemListsner() {
        return onClickItemListsner;
    }


    public DBaseRecyclerViewHolder(View itemView, DBaseRecyclerViewAdapter dBaseRecyclerViewAdapter) {
        super(itemView);

        this.dBaseRecyclerViewAdapter = dBaseRecyclerViewAdapter;
        mDRecyclerViewAdapter = dBaseRecyclerViewAdapter.getmDRecyclerViewAdapter();
        onClickItemListsner = dBaseRecyclerViewAdapter.getOnClickItemListsner();
    }

    public DBaseRecyclerViewHolder(ViewGroup parent, @LayoutRes int res, DBaseRecyclerViewAdapter dBaseRecyclerViewAdapter) {

        super(LayoutInflater.from(parent.getContext()).inflate(res, parent, false));

        mDRecyclerViewAdapter = dBaseRecyclerViewAdapter.getmDRecyclerViewAdapter();
        this.dBaseRecyclerViewAdapter = dBaseRecyclerViewAdapter;
        onClickItemListsner = dBaseRecyclerViewAdapter.getOnClickItemListsner();

    }

    protected <T extends View> T $(@IdRes int id) {
        return (T) itemView.findViewById(id);
    }

    public abstract void setData(T data, int position);

//
//    /**
//     * 處理有頭部和尾部的情況 返回點選的位置
//     * @return
//     */
//    /**
//     * 獲取點選的item的position
//     *
//     * @return
//     */
//    public int getAdapterItemPosition()
//    {
//        int oldPosition = getAdapterPosition();
//
//        if (dBaseRecyclerViewAdapter == null)
//        {
//            return oldPosition;
//        }
//
//        if (dBaseRecyclerViewAdapter.isHeader(oldPosition) || dBaseRecyclerViewAdapter.isFooter(oldPosition))
//        {
//            return - 1;
//        }
//        else
//        {
//            return oldPosition - dBaseRecyclerViewAdapter.getHeaderViewsCount();
//        }
//    }

}

-----DRecyclerViewAdapter類的方法
public class DRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    public static final String Tag = DRecyclerViewAdapter.class.getName();
    private RecyclerView.Adapter mInnerAdapter;

    public DRecyclerViewAdapter(DBaseRecyclerViewAdapter adapter) {
        setAdapter(adapter);
    }

    public void setAdapter(DBaseRecyclerViewAdapter myAdapter) {
        if (myAdapter != null) {
            if (! (myAdapter instanceof RecyclerView.Adapter))
                throw new RuntimeException("your adapter must be a RecyclerView.Adapter");
        }
        this.mInnerAdapter = myAdapter;
        myAdapter.setDRecyclerViewAdapter(this);
    }

    /**
     * head foot list cache
     */
    private List<View> mHeadViews = new ArrayList<View>();
    private List<View> mFootViews = new ArrayList<View>();
    private List<View> mRandomViews = new ArrayList<View>();
    private SparseArray<Integer> mRandomViews_position = new SparseArray<Integer>();

    /**
     * addHead to recyclerview
     *
     * @param view
     */
    public void addHeadView(View view) {
        mHeadViews.add(view);
    }

    /**
     * addFoot to RecyclerView
     *
     * @param view
     */
    public void addFootView(View view) {
        mFootViews.add(view);
    }

    /**
     * 使用一次 存下來 後續 好查詢
     */
    private int index = 0;

    public void addRandomView(View view, int posistion) {
        mRandomViews_position.append(posistion, index);
        index++;
        mRandomViews.add(view);
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        DRecyclerViewHolder dRecyclerViewHolder;
        if (viewType < mHeadViews.size()) {
            Log.e(Tag, "headView" + viewType);
            return new DRecyclerViewHolder(mHeadViews.get(viewType));

        }
        else if (viewType >= mHeadViews.size() && viewType < mHeadViews.size() + mInnerAdapter.getItemCount()) {
            if (mRandomViews_position.get(viewType - mHeadViews.size()) != null) {
                View view = mRandomViews.get(mRandomViews_position.get(viewType - mHeadViews.size()));
                return new DRecyclerViewHolder(view);
            }
            return mInnerAdapter.onCreateViewHolder(parent, viewType - mHeadViews.size());
        }
        else {
            int position = viewType - mHeadViews.size() - mInnerAdapter.getItemCount();
            if (position >= 0 && position < mFootViews.size()) {
                return new DRecyclerViewHolder(mFootViews.get(position));
            }
            else {
                return null;
            }
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (position >= mHeadViews.size() && position < mHeadViews.size() + mInnerAdapter.getItemCount()) {
            //不包括那些插入的
            if (mRandomViews_position.get(position - mHeadViews.size()) == null)
                mInnerAdapter.onBindViewHolder(holder, position - mHeadViews.size());

        }
        else {
            /**
             * 瀑布流的設定處理
             */
            ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams();
            if (layoutParams instanceof StaggeredGridLayoutManager.LayoutParams) {
                ((StaggeredGridLayoutManager.LayoutParams) layoutParams).setFullSpan(true);
            }
        }
    }

    @Override
    public int getItemCount() {
        return mHeadViews.size() + mInnerAdapter.getItemCount() + mFootViews.size();
    }

    @Override
    public int getItemViewType(int position) {

        return position;
    }

    public int getFootSize() {
        return mFootViews.size();
    }

    public int getHeadSize() {
        return mHeadViews.size();
    }

    public boolean isHeader(int position) {
        return position < mHeadViews.size() ? true : false;
    }

    public boolean isFooter(int position) {
        return position >= mHeadViews.size() + mInnerAdapter.getItemCount() ? true : false;
    }

    public boolean isRandom(int position) {
        return mRandomViews_position.get(position - mHeadViews.size()) != null ? true : false;
    }

    static class DRecyclerViewHolder extends RecyclerView.ViewHolder {

        public DRecyclerViewHolder(View itemView) {
            super(itemView);
        }
    }
}

相關推薦

使用RecyclerView實現動態新增佈局佈局

通過重寫RecyclerView.Adapter來實現新增頭腳佈局的功能 -----具體使用 1 建立adapter繼承DBaseRecyclerViewAdapter,實現onCreateViewHolder1()方法,繫結佈局 2 建立viewholder繼承DBas

RecyclerView下拉重新整理、上拉載入及新增佈局佈局實現

image.png 前言 隨著RecyclerView的越來越流行,我看著專案裡ListView、GridView陷入沉思,是時候開始改變了!(認真臉)我決定將專案中的這些控制元件都改用RecyclerView。然而,像下拉重新整理等功能是必不可少的,雖然有很多現成的可以

jquery結合js實現動態新增內容並給動態新增的內容新增事件

jquery結合js實現向後臺傳送請求,給頁面動態新增內容,並給動態新增的內容新增事件.html內容如下: <button class="btn btn-md customButton" id="add_red_envelope">新增紅包&

擴充套件:spring3整合quartz2實現動態新增、刪除定時任務

    本文的用的是quartz-2.2.1與spring-3.2.2。之所以在這裡特別對版本作一下說明,是因為spring和quartz的整合對版本是有要求的。spring3.1以下的版本必須使用quartz1.x系列,3.1以上的版本才支援quartz 2.x,不然會出錯。原因主要是:spring對於qu

jQuery實現動態新增tr到table的方法

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" <html> <head> <meta http-equiv="Content-Type" content="text/html;

C#ListView如何實現動態新增檔案

public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String[] st = sc.nextLine().split("

Jquery sumoselect 下拉外掛,實現動態新增option

   相信很多人都會使用下拉列表select,原生的太醜,很難去修改樣式和高度,所以找了一個sumoselect,功能很強大,並且樣式也很好看,不過現在遇到一個問題是,下拉option事先寫好了,的確是

java POI動態新增修改Excel表頭是動態的。急啊

java POI 首先讀取模板,修改新增資料,表頭是動態的, 要寫一個公共類,請教下大神。 /** * @param path 模板路徑 * @param esheet 表 * @param dataList 資料 * @return 結果集 * @

MyBatis中實現動態的SQL語句分頁以及mybatis的常用的配置

<select id="getListByPage" resultType="com.gxa.bj.modle.UserInfoPage" parameterType="com.gxa.bj.modle.UserInfoPage">

redis 叢集之動態新增redis節點刪除指定ID的redis節點以及檢視redis叢集中各個節點的資訊

redis cluster配置好,並執行一段時間後,我們想新增節點,或者刪除節點,該怎麼辦呢。首先登陸上去redis叢集內任意一個節點的client端 如:/usr/local/redis303/bin/redis-cli -c -h 192.168.1.108 -p 7713 進行登陸 192.168.1

Spring定時任務開發實現動態修改時間引數手動開啟關停等

@Service @Lazy(false) @EnableScheduling public class MyScheduler extends BaseService implements SchedulingConfigurer{ public static String cron

Jquery實現動態新增table以及JSON陣列的解析

昨天寫一個作業的時候,因為一個錯誤浪費了我兩個多小時,為了以後不再同一個地方摔倒,果斷記錄下來。程式碼片先粘過來 $(".borrow").click(function(){ var text2=""; var text

AngularJS:實現動態新增輸入控制元件功能

1 <div class="form-group" ng-controller="SendSafeMessageController"> 2 <label class="col-md-2 control-label">答覆內容:</label> 3 &

pycharm 如何自動新增註釋比如時間作者資訊等

查詢路徑:File->settings->Editor->File and Code Templates->Python Script #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : ${DATE

微信小程式實現動態新增標籤(1)

說明:最近入住微信小程式,將自己所學經歷分享出來,包括學到的知識,踩到的坑,一起分享給大家,後續會慢慢更新: 首先針對一些幾乎沒有基礎的童鞋,附上一些連結,大致看完後能夠有能力製作簡單的小程式了: 另外特別推薦一波福利(樣式庫,也就是說,各種

用listview實現動態新增

在adapter中新增 public void addListItem(FitEntry arrayList) { fitnessEntity.add(arrayList); } 在mainA

ielement-ui實現動態新增刪除

需求如下,點選新增和刪除按鈕,實現月份,任務數的新增,點選刪除,刪除當前的任務 <div v-for="(item,index) in task_arr" class="agent-vlist"> <div class="agent-label"

Android RecyclerView 實現瀑布流交錯效果並使最後一行子View高度佔滿RecyclerView

而在實現完瀑布流後,覺得滑動到底部時,最後一行的高度,沒有佔滿外部View,感覺不太好。(真正的瀑布流應該是條目數近乎無窮,可以一直載入更多) 既然是瀑布流,那麼就選用StaggeredGridLayoutManager。 mRecyclerView.s

Spring+Quartz實現動態新增定時任務(一)

在最近工作中,由於涉及到定時任務特別多,而這些工作又是由下屬去完成的,在生成環境中經常會出現業務邏輯錯誤,分析下來多數是定時任務執行問題,所以就希望把定時任務優化一下,主要實現2個方面1.定時任務動態配置及持久化2.視覺化的管理介面,可以非常清晰的管理自己的所有定時任務首先,

SpringBoot整合Elastic-Job實現動態建立定時任務任務持久化

SpringBoot使用Elastic-Job-lite,實現動態建立定時任務,任務持久化 Elastic-Job是噹噹開源的一個分散式排程解決方案,由兩個相互獨立的子專案Elastic-Job-Lite和Elastic-Job-Cloud組成。 Elast