使用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的類
----繼承自RecyclerView.ViewHolder的viewHolderpublic 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(); } }
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