Android開發操作案例分享!

來源:互聯網
上載者:User

標籤:

Android開發操作案例分享!

Android LRecyclerView 操作案例分享-實現下拉重新整理、滑動到底部自動載入,一直想抽空寫下這個開源項目www.itxdl.cn,但是各種原因沒有抽時間,今天還是趁著工作間隙寫下了這篇部落格,與大家分享。

 

簡介

LRecyclerView是支援addHeaderView、 addFooterView、下拉重新整理、分頁載入資料的RecyclerView。

它對 RecyclerView 控制項進行了拓展,給RecyclerView增加HeaderView、FooterView,並且不需要對你的Adapter做任何修改。

 

主要功能

下拉重新整理、滑動到底部自動載入下頁資料;

可以方便添加Header和Footer;

頭部下拉樣式可以自訂;

具備item點擊和長按事件。

網路錯誤載入失敗點擊Footer重新請求資料;

可以動態為FooterView賦予不同狀態(載入中、載入失敗、滑到最底等)。

 

感謝

如果我比別人看得遠些,那是因為我站在巨人們的肩上。 (牛頓)

本開原始檔控制是基於 HeaderAndFooterRecyclerView 開源項目而來,在原基礎上進行了擴充。在此感謝兄弟連教育(www.itxdl.cn)的分享

 

Gradle

Step 1. 在你的根build.gradle檔案中增加JitPack倉庫依賴。

 

allprojects {

    repositories {

        jcenter()

        maven { url "https://jitpack.io" }

    }

}

Step 2. 在你的model的build.gradle檔案中增加LRecyclerView依賴。

 

compile ‘com.github.jdsjlzx:LRecyclerView:1.0.0‘

使用

 

添加HeaderView、FooterView

 

mDataAdapter = new DataAdapter(this);

        mDataAdapter.setData(dataList);

        mHeaderAndFooterRecyclerViewAdapter = new HeaderAndFooterRecyclerViewAdapter(this, mDataAdapter);

        mRecyclerView.setAdapter(mHeaderAndFooterRecyclerViewAdapter);

        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

        //add a HeaderView

        RecyclerViewUtils.setHeaderView(mRecyclerView, new SampleHeader(this));

        //add a FooterView

        RecyclerViewUtils.setFooterView(mRecyclerView, new SampleFooter(this));

注意:

mHeaderAndFooterRecyclerViewAdapter = new HeaderAndFooterRecyclerViewAdapter(this, mDataAdapter);

HeaderAndFooterRecyclerViewAdapter提供了一些實用的功能,使用者不用關心它的實現,只需構造的時候把自己的mDataAdapter以參數形式傳進去即可。

 

下拉重新整理和載入更多

為了大家使用方便,將需要用的方法統一封裝到介面LScrollListener中。

 

mRecyclerView.setLScrollListener(new LRecyclerView.LScrollListener() {

            @Override

            public void onRefresh() {

            }

            @Override

            public void onScrollUp() {

            }

            @Override

            public void onScrollDown() {

            }

            @Override

            public void onBottom() {

            }

            @Override

            public void onScrolled(int distanceX, int distanceY) {

            }

        });

LScrollListener實現了nRefresh()、onScrollUp()、onScrollDown()、onBottom()、onScrolled五個事件,如下所示:

 

void onRefresh();//pull down to refresh

void onScrollUp();//scroll down to up

void onScrollDown();//scroll from up to down

void onBottom();//load next page

void onScrolled(int distanceX, int distanceY);// moving state,you can get the move distance

onRefresh()——RecyclerView下拉重新整理事件;

onScrollUp()——RecyclerView向上滑動的監聽事件;

onScrollDown()——RecyclerView向下滑動的監聽事件;

onBottom()——RecyclerView滑動到底部的監聽事件;

onScrollDown()——RecyclerView正在滾動的監聽事件;

載入更多(載入下頁資料)

 

從上面的LScrollListener介紹中就可以看出,實現載入更多隻要在onBottom()介面中處理即可。

 

 

下拉重新整理

為了達到和Listview的下拉重新整理效果,本項目沒有藉助SwipeRefreshLayout控制項,而是在自訂RecyclerView頭部實現的重新整理效果。

 

這裡的下拉重新整理效果借鑒了開源庫:AVLoadingIndicatorView

 

mRecyclerView.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader);

mRecyclerView.setArrowImageView(R.drawable.iconfont_downgrey);

AVLoadingIndicatorView庫有多少效果,LRecyclerView就支援多少下拉重新整理效果,當然你也可以自訂下拉效果。

 

下拉重新整理邏輯處理:

 

從上面的LScrollListener介紹中就可以看出,實現下拉重新整理只要在onRefresh()介面中處理即可。

 

載入網路異常處理

 

載入資料時如果網路異常或者斷網,LRecyclerView為你提供了重新載入的機制。

 

網路異常出錯代碼處理如下:

RecyclerViewStateUtils.setFooterViewState(getActivity(), mRecyclerView, getPageSize(), LoadingFooter.State.NetWorkError, mFooterClick);

private View.OnClickListener mFooterClick = new View.OnClickListener() {

        @Override

        public void onClick(View v) {

            RecyclerViewStateUtils.setFooterViewState(getActivity(), mRecyclerView, getPageSize(), LoadingFooter.State.Loading, null);

            requestData();

        }

    };

上面的mFooterClick就是我們點擊底部的Footer時的邏輯處理事件,很顯然我們還是在這裡做重新請求資料操作。

 

點擊事件和長按事件處理

 

在Hongyang前輩的部落格中有下描述:

 

Click and LongClick

 

不過一個挺鬱悶的地方就是,系統沒有提供ClickListener和LongClickListener。

不過我們也可以自己去添加,只是會多了些代碼而已。

實現的方式比較多,你可以通過mRecyclerView.addOnItemTouchListener去監聽然後去判斷手勢, 當然你也可以通過adapter中自己去提供回調,這裡我們選擇後者,前者的方式,大家有興趣自己去實現。

 

Hongyang大神選擇了後者,LRecyclerView早期選擇了前者,經過實踐總結,在adapter中實現點擊事件會好點。

 

先看下怎麼使用:

mHeaderAndFooterRecyclerViewAdapter.setOnItemClickLitener(new OnItemClickLitener() {

            @Override

            public void onItemClick(View view, int position) {

 

            }

 

            @Override

            public void onItemLongClick(View view, int position) {

 

            }

        });

原理就是實現viewHolder.itemView的點擊和長按事件。由於代碼過多就不貼出來了。

 

viewHolder.itemView是RecyclerView.Adapter中本身就具有的,不用額外定義。

 

源碼如下:

public static abstract class ViewHolder {

        public final View itemView;

        int mPosition = NO_POSITION;

        int mOldPosition = NO_POSITION;

        long mItemId = NO_ID;

        int mItemViewType = INVALID_TYPE;

        int mPreLayoutPosition = NO_POSITION;

設定空白View(setEmptyView)

 

mRecyclerView.setEmptyView(view);

注意布局檔案:

 

<RelativeLayout

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    >

 

    <com.cundong.recyclerview.LRecyclerView

        android:id="@+id/list"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"/>

 

    <include

        android:id="@+id/empty_view"

        layout="@layout/layout_empty"

        android:visibility="gone"/>

</RelativeLayout>

分享

 

介紹完了LRecyclerView,似乎還少些什麼,對了,那就是adapter了。

 

為了方便大家使用,分享個封裝過的adapter。

 

public class ListBaseAdapter<T extends Entity> extends RecyclerView.Adapter {

    protected Context mContext;

    protected int mScreenWidth;

 

    public void setScreenWidth(int width) {

        mScreenWidth = width;

    }

 

    protected ArrayList<T> mDataList = new ArrayList<>();

 

    @Override

    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        return null;

    }

 

    @Override

    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

 

    }

 

    @Override

    public int getItemCount() {

        return mDataList.size();

    }

 

    public List<T> getDataList() {

        return mDataList;

    }

 

    public void setDataList(Collection<T> list) {

        this.mDataList.clear();

        this.mDataList.addAll(list);

        notifyDataSetChanged();

    }

 

    public void addAll(Collection<T> list) {

        int lastIndex = this.mDataList.size();

        if (this.mDataList.addAll(list)) {

            notifyItemRangeInserted(lastIndex, list.size());

        }

    }

    public void clear() {

        mDataList.clear();

        notifyDataSetChanged();

    }

}

 

ListBaseAdapter使用了泛型,簡單方便,消除了強制類型轉換。

 

使用如下:

 

private class DataAdapter extends ListBaseAdapter<ItemModel>{

 

        private LayoutInflater mLayoutInflater;

 

        public DataAdapter(Context context) {

            mLayoutInflater = LayoutInflater.from(context);

            mContext = context;

        }

 

        @Override

        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

            return new ViewHolder(mLayoutInflater.inflate(R.layout.sample_item_text, parent, false));

        }

 

        @Override

        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

            ItemModel item = mDataList.get(position);

 

            ViewHolder viewHolder = (ViewHolder) holder;

            viewHolder.textView.setText(item.title);

        }

 

 

        private class ViewHolder extends RecyclerView.ViewHolder {

 

            private TextView textView;

 

            public ViewHolder(View itemView) {

                super(itemView);

                textView = (TextView) itemView.findViewById(R.id.info_text);

            }

        }

    }

ListBaseAdapter雖然功能不強大,但是使用很方便。

 

結語

LRecyclerView使用方便簡單,無論你添加多少Header和Footer,你都不用擔心position的問題,除了方便還是方便。大家用起來吧!

Android開發操作案例分享!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.