1. 程式人生 > >Android使用RecyclerView實現上拉載入更多,下拉重新整理,分組顯示

Android使用RecyclerView實現上拉載入更多,下拉重新整理,分組顯示

專案地址:點選開啟連結(https://github.com/MrGaoGang/luckly_recyclerview)

使用RecyclerView封裝headerview,footerView,並實現上拉載入更多,下拉重新整理,分組功能(新增上拉載入和下拉重新整理設定背景)

介面可能有點醜,但是是為了展示所有效果,請大家見諒。(所有東西都是可自己設定的哦)
效果圖:   
如何獲取: 
第一步:在專案的build.gradle中新增

 allprojects {
	repositories {
	...
	maven { url 'https://jitpack.io' }
	}
}

第二步:新增依賴

 dependencies {
	 compile 'com.github.mrgaogang:luckly_recyclerview:v2.1.1'
}

一、部分方法介紹

1、設定載入更多的監聽事件

	mLRecyclerView.setLoadMoreListener(this);

並重寫onLoadMore()方法。 

2、設定下拉重新整理監聽事件

	mLRecyclerView.setOnRefreshListener(this);

並重寫onRefresh()方法。 

3、新增分割線

已經封裝好了線性佈局的分割線和網格式佈局的分割線、流式佈局的分割線。
	//線性佈局
 	mLRecyclerView.addLinearDivider(LRecyclerView.VERTICAL_LIST);
	//網格式佈局
   	 mLRecyclerView.addGridDivider();
	//可以指定顏色和寬度
	addGridDivider(int color, int dividerHeight)
	addLinearDivider(int oritation, int color, int lineWidth)

4、新增錯誤檢視

當網路連線失敗等情況的時候,需要顯示錯誤檢視。
	//新增錯誤的View
   	 mLRecyclerView.setErrorView(R.layout.error_view);
	//新增錯誤的View
	View error = LayoutInflater.from(this).inflate(R.layout.view_error, null, false);
   	 mLRecyclerView.setErrorView(error);


使用getErrorView()得到錯誤檢視。

5、新增空檢視

當資料為空的時候,需要顯示。
	//新增空的View
  	  mLRecyclerView.setEmptyView(R.layout.empty_view);
	//新增空的View
	View empty = LayoutInflater.from(this).inflate(R.layout.view_empty, null, false);
   	 mLRecyclerView.setEmptyView(error);


使用getErrorView()得到空檢視。

6、新增headerView

	//新增headerView
   	 mLRecyclerView.addHeaderView(R.layout.header_view);
	//新增headerView,需要設定父類為mLRecyclerView
	View headerView = LayoutInflater.from(this).inflate(R.layout.header_view, mLRecyclerView, false);
   	 mLRecyclerView.addHeaderView(headerView);
	//得到所有headerView檢視。
	List<View> getHeaderViews();
	//得到所有headerView的個數。
	int getHeaderViewCount();

7、設定下拉重新整理進度條的顏色和字型的顏色

	//改變下方載入進度的字型顏色
	mLRecyclerView.setLoadingTextColor(Color.BLUE);
	//改變下方載入進度條的顏色
	mLRecyclerView.setLoadingProgressColor(Color.BLUE);
	//修改下拉重新整理顏色
	mLRecyclerView.setRefreshColor(getResources().getColor(R.color.colorAccent));

8、設定監聽事件

 	//設定點選事件,注意此處返回的position是包括了headerView和下拉載入的檢視的
	mLRecyclerView.setOnItemClickListener(new LucklyRecyclerView.OnItemClickListener() {
        @Override
        public void onItemClick(int position) {
            Log.i(TAG,"點選--->"+position);
        }

        @Override
        public void onItemLongClick(int position) {
            Log.i(TAG,"長按--->"+position);
        }
	 });

9、設定上拉載入和下拉重新整理在不同的狀態

 @Override
    public void onLoadMore() {
        //設定處於正在載入狀態
        mLRecyclerView.setLoading();
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                int count = dataAdapter.getItemCount() + 1;
                if (count < 50) {
                    List<String> strings = new ArrayList<>();
                    for (int i = count - 1; i < 5 + count; i++) {
                        strings.add("資料" + i);
                    }
                    dataAdapter.addAll(strings);
                    //設定資料已經載入完成狀態
                    mLRecyclerView.setLoadingComplete();
                } else {
                    //設定沒有更多資料狀態,可以自定義現實的文字,上述的兩個狀態也都可以自定義文字
                    mLRecyclerView.setLoadingNoMore("唉呀媽呀,沒資料咯");
                }


            }
        }, 2000);
    }
   @Override
    public void onRefresh() {
        mLRecyclerView.setRefreshEnable(true);
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                dataAdapter.clearAll();
                List<String> strings = new ArrayList<>();
                for (int i = 0; i < 30; i++) {
                    strings.add("資料" + i);
                }
                dataAdapter.addAll(strings);

            
                mLRecyclerView.setRefreshComplete();
            }
        }, 5000);
    }

10、設定是否空白檢視和錯誤檢視點選重新整理

 mLRecyclerView.setOnClickEmptyOrErrorToRefresh(true);

11、可設定下拉重新整理和上拉載入的背景圖片(可用於廣告的放置哦)

注意:

  1. 如果在初始化的時候 直接設定了背景圖片可不用重新整理adapter。
  2. 如果通過網路獲取到背景圖片之後可以使用如下方法設定背景,但是需要新增一步:notifyItemChanged()
    //設定下拉重新整理的背景圖片(可放廣告圖片哦)
    mLRecyclerView.setRefreshBackground(getResources().getDrawable(R.drawable.headerback));
    //設定上拉載入部分設定背景圖片(也可放廣告哦)
    mLRecyclerView.setFooterBackground(getResources().getDrawable(R.drawable.footerback));
  	
    //如果通過網路獲取的footer圖片,則需要呼叫以下:(如果是設定重新整理部分的背景直接呼叫setRefreshBackground)
     mLRecyclerView.getOriginalRecyclerView().getAdapter()
		.notifyItemChanged(mLRecyclerView.getOriginalRecyclerView().getAdapter().getItemCount() - 1);

二、如何實現分組

1、luckRecyclerView.setRecyclerViewType(LucklyRecyclerView.GROUP);

2、重寫Adapter繼承基類BaseGroupAdapter


需要重寫的幾個方法:

  /**
     * 第一層的數量
     *
     * @return
     */
    public abstract int getParentCount();

    /**
     * 每一個parent下的child的數量
     *
     * @param parentPosition
     * @return
     */
    public abstract int getChildCountForParent(int parentPosition);

    public abstract A onCreateParentViewHolder(ViewGroup parent, int viewType);

    public abstract B onCreateChildViewHolder(ViewGroup parent, int viewType);

    public abstract void onBindParentViewHolder(A holder, int position);

    /**
     * 分別是hoder,parent的位置(全域性的位置)
     * child在parent中的index(不是position)
     *
     * @param holder
     * @param parentPosition
     * @param childIndexForParent
     */
    public abstract void onBindChildViewHolder(B holder, int parentPosition, int childIndexForParent);

在使用點選事件的時候要注意判斷是否為Parent:

   luckRecyclerView.setOnItemClickListener(new LucklyRecyclerView.OnItemClickListener() {
            @Override
            public void onItemClick(View rootView, int position) {
                if (mGroupAdapter.isParentView(position)){
                    mGroupAdapter.showChild(rootView);
                }else {
                    Toast.makeText(getApplicationContext(),"點選了第"+mGroupAdapter.getParentIndexFromChild(position)+"個parent的"+mGroupAdapter.getChildIndexForParent(position),Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onItemLongClick(View rootView, int position) {

            }
        });

3、常用的幾個方法

1、獲取child在parent下的index 

mGroupAdapter.getChildIndexForParent(position);

2、獲取parent的index 

mGroupAdapter.getParentIndexFromChild(position);

3、判斷當前position是否為parentView 

mGroupAdapter.isParentView(position);

三、具體如何使用請看例子

歡迎關注我的微信公眾號: