1. 程式人生 > >詳解RecyclerView+BGARefreshLayout實現自定義下拉重新整理、上拉載入和側滑刪除效果

詳解RecyclerView+BGARefreshLayout實現自定義下拉重新整理、上拉載入和側滑刪除效果

前言

還有2個月就過年了,對於我們這樣在外漂泊的異鄉人來說,一家人團聚在一起,吃一頓團圓飯,那是再幸福不過的事了。我們之所以遠離家鄉來到異鄉就像異鄉人這首歌寫的一樣,只為一扇窗!

正文

上篇文章給大家講解了一下關於RecyclerView的使用,今天給大家講解一下Recycler+BGARefreshLayout實現自定義下拉重新整理、上拉載入和側滑刪除效果,先上效果圖:

這裡寫圖片描述

這篇文章主要講解關於BGARefreshLayout使用,RecyclerView在上一篇文章已經進行了講解,如果大家不瞭解RecyclerView的使用,先去看一下這篇文章再來看這篇。

關於BGARefreshLayout

BGARefreshLayout可以對各種控制元件實現多種下拉重新整理效果、上拉載入更多以及配置自定義頭部廣告位:

1.目前已經實現了三種下拉重新整理效果:
1).新浪微博下拉重新整理風格(可設定背景、各種狀態是的文字),
2).慕課網下拉重新整理風格(使用時可設定其中的logo和顏色成自己公司的風格) ,
3).類似qq好友列表黏性下拉重新整理風格(三階貝塞爾曲線沒怎麼調好,剛開始下拉時效果不太好)

2.一種上拉載入更多效果:
1).新浪微博上拉載入更多(可設定背景、狀態文字)

新增的內容

1.添加了控制是否使用下拉重新整理的功能;
2.添加了自定義下拉重新整理和上拉載入功能;
3.

添加了資料載入完成之後顯示“沒有更多資料”提示;
4.添加了側滑刪除功能;

對於以上四種功能的實現,十分的簡單,卻十分的適用

開始寫程式碼

新增依賴

compile 'cn.bingoogolapple:bga-refreshlayout:[email protected]'

根據這張圖來理解程式碼

這裡寫圖片描述

我們來看看抽象類BGARefreshLayout:

/**
 * 獲取上拉載入更多控制元件,如果不喜歡這種上拉重新整理風格可重寫該方法實現自定義LoadMoreFooterView
 *
 * @return
 */
public View getLoadMoreFooterView
() { if (!mIsLoadingMoreEnabled) { return null; } if (mLoadMoreFooterView == null) { mLoadMoreFooterView = View.inflate(mContext, R.layout.view_normal_refresh_footer, null); mLoadMoreFooterView.setBackgroundColor(Color.TRANSPARENT); if (mLoadMoreBackgroundColorRes != -1) { mLoadMoreFooterView.setBackgroundResource(mLoadMoreBackgroundColorRes); } if (mLoadMoreBackgroundDrawableRes != -1) { mLoadMoreFooterView.setBackgroundResource(mLoadMoreBackgroundDrawableRes); } mFooterStatusTv = (TextView) mLoadMoreFooterView.findViewById(R.id.tv_normal_refresh_footer_status); mFooterChrysanthemumIv = (ImageView) mLoadMoreFooterView.findViewById(R.id.iv_normal_refresh_footer_chrysanthemum); mFooterChrysanthemumAd = (AnimationDrawable) mFooterChrysanthemumIv.getDrawable(); mFooterStatusTv.setText(mLodingMoreText); } return mLoadMoreFooterView; } /** * 獲取頭部下拉重新整理控制元件 * * @return */ public abstract View getRefreshHeaderView(); /** * 下拉重新整理控制元件可見時,處理上下拉進度 * * @param scale 下拉過程0 到 1,回彈過程1 到 0,沒有加上彈簧距離移動時的比例 * @param moveYDistance 整個下拉重新整理控制元件paddingTop變化的值,如果有彈簧距離,會大於整個下拉重新整理控制元件的高度 */ public abstract void handleScale(float scale, int moveYDistance); /** * 進入到未處理下拉重新整理狀態 */ public abstract void changeToIdle(); /** * 進入下拉狀態 */ public abstract void changeToPullDown(); /** * 進入釋放重新整理狀態 */ public abstract void changeToReleaseRefresh(); /** * 進入正在重新整理狀態 */ public abstract void changeToRefreshing(); /** * 設定正在載入更多時的文字 * * @param loadingMoreText */ public void setLoadingMoreText(String loadingMoreText) { mLodingMoreText = loadingMoreText; } /** * 結束下拉重新整理 */ public abstract void onEndRefreshing(); /** * 手指移動距離與下拉重新整理控制元件paddingTop移動距離的比值 * * @return */ public float getPaddingTopScale() { return mPullDistanceScale; }

在該抽象類裡面有許多抽象方法,我們只需要繼承該抽象類重寫裡面的getLoadMoreFooterView()getRefreshHeaderView()就可以來實現我們自己想要的重新整理和載入效果,例如上圖裡面的DefineBAGRefreshWithLoadView自定義類:

public DefineBAGRefreshWithLoadView(Context context, boolean isLoadingMoreEnabled, boolean isRefreshEnabled) {
        super(context, isLoadingMoreEnabled);
        this.mIsLoadingMoreEnabled = isLoadingMoreEnabled;
        this.isRefreshEnabled = isRefreshEnabled;
    }
    /** 設定下拉顯示文字 */
    public void setPullDownRefreshText(String pullDownRefreshText) {
        this.mPullDownRefreshText = pullDownRefreshText;
    }
    /** 設定釋放顯示文字 */
    public void setReleaseRefreshText(String releaseRefreshText) {
        this.mReleaseRefreshText = releaseRefreshText;
    }
    /** 設定正在重新整理顯示文字 */
    public void setRefreshingText(String refreshingText) {
        this.mRefreshingText = refreshingText;
    }
    /**
     * 定義重新整理
     * */
    public View getRefreshHeaderView() {
        if(this.mRefreshHeaderView == null) {
            this.mRefreshHeaderView = View.inflate(this.mContext, R.layout.header_bga_dodo, (ViewGroup)null);
            this.mRefreshHeaderView.setBackgroundColor(0);
            if(this.mRefreshViewBackgroundColorRes != -1) {
                this.mRefreshHeaderView.setBackgroundResource(this.mRefreshViewBackgroundColorRes);
            }
            if(this.mRefreshViewBackgroundDrawableRes != -1) {
                this.mRefreshHeaderView.setBackgroundResource(this.mRefreshViewBackgroundDrawableRes);
            }
            this.mHeaderStatusTv = (TextView)this.mRefreshHeaderView.findViewById(R.id.tv_normal_refresh_header_status);
            this.mHeaderArrowIv = (ImageView)this.mRefreshHeaderView.findViewById(R.id.iv_normal_refresh_header_arrow);
            this.mHeaderChrysanthemumIv = (ImageView)this.mRefreshHeaderView.findViewById(R.id.iv_normal_refresh_header_chrysanthemum);
            this.mHeaderChrysanthemumAd = (AnimationDrawable)this.mHeaderChrysanthemumIv.getDrawable();
            this.mHeaderStatusTv.setText(this.mPullDownRefreshText);
        }
        //重新整理不可用
        if(!isRefreshEnabled){
            return null;
        }
        return this.mRefreshHeaderView;
    }
    //已經開始重新整理
    public void changeToRefreshing() {
        this.mHeaderStatusTv.setText(this.mRefreshingText);
        this.mHeaderArrowIv.clearAnimation();
        this.mHeaderArrowIv.setVisibility(View.GONE);
        this.mHeaderChrysanthemumIv.setVisibility(View.VISIBLE);
        this.mHeaderChrysanthemumAd.start();
    }
    //開始下拉
    public void changeToPullDown() {
        this.mHeaderStatusTv.setText(this.mPullDownRefreshText);
        this.mHeaderChrysanthemumIv.setVisibility(View.GONE);
        this.mHeaderChrysanthemumAd.stop();
        this.mHeaderArrowIv.setVisibility(View.VISIBLE);
    }
    //下拉到一定程度,可以重新整理
    public void changeToReleaseRefresh() {
        this.mHeaderStatusTv.setText(this.mReleaseRefreshText);
        this.mHeaderChrysanthemumIv.setVisibility(View.GONE);
        this.mHeaderChrysanthemumAd.stop();
        this.mHeaderArrowIv.setVisibility(View.VISIBLE);
    }
    //結束重新整理
    public void onEndRefreshing() {
        this.mHeaderStatusTv.setText(this.mPullDownRefreshText);
        this.mHeaderChrysanthemumIv.setVisibility(View.GONE);
        this.mHeaderChrysanthemumAd.stop();
        this.mHeaderArrowIv.setVisibility(View.VISIBLE);
    }
    @Override
    public void handleScale(float scale, int moveYDistance) {
    }

    @Override
    public void changeToIdle() {
    }


    /** 設定載入 */
    public void updateLoadingMoreText(String text){
        this.mFooterStatusTv.setText(text);
    }
    /** 隱藏載入更多圖片 */
    public void hideLoadingMoreImg(){
        this.mFooterChrysanthemumIv.setVisibility(View.GONE);
    }
    /** 顯示載入更多圖片 */
    public void showLoadingMoreImg(){
        this.mFooterChrysanthemumIv.setVisibility(View.VISIBLE);
    }
    /**
     * 自定義載入更多底部
     */
    @Override
    public View getLoadMoreFooterView() {
        if (!this.mIsLoadingMoreEnabled) {
            return null;
        }
        Log.i("TAG" , "啦啦啦啦");
        if (this.mLoadMoreFooterView == null) {
            this.mLoadMoreFooterView = View.inflate(this.mContext, R.layout.footer_bga_dodo, null);
            this.mLoadMoreFooterView.setBackgroundColor(Color.TRANSPARENT);
            this.mFooterStatusTv = (TextView) this.mLoadMoreFooterView.findViewById(R.id.tv_normal_refresh_footer_status);
            this.mFooterChrysanthemumIv = (ImageView) this.mLoadMoreFooterView.findViewById(R.id.iv_normal_refresh_footer_chrysanthemum);
            this. mFooterChrysanthemumAd = (AnimationDrawable) this.mFooterChrysanthemumIv.getDrawable();
            this.mFooterStatusTv.setText(this.mLodingMoreText);
        }
        return mLoadMoreFooterView;
    }

在重新整理方法裡面添加了是否需要重新整理的判斷,這樣我們就可以控制是否使用重新整理:

//重新整理不可用
if(!isRefreshEnabled){
    return null;
}

以載入更多為例看看自定義載入:

if (!this.mIsLoadingMoreEnabled) {
    return null;
    }
    Log.i("TAG" , "啦啦啦啦");
    if (this.mLoadMoreFooterView == null) {
        this.mLoadMoreFooterView = View.inflate(this.mContext, R.layout.footer_bga_dodo, null);
        this.mLoadMoreFooterView.setBackgroundColor(Color.TRANSPARENT);
        this.mFooterStatusTv = (TextView) this.mLoadMoreFooterView.findViewById(R.id.tv_normal_refresh_footer_status);
        this.mFooterStatusTv.setText(this.mLodingMoreText);
    }
    return mLoadMoreFooterView;

先判斷是否需要載入功能,然後得到自定義載入佈局和裡面需要操作的控制元件進行編寫;

footer_bga_dodo.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="horizontal">

    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="15dp"
        android:layout_marginRight="10dip"
        android:layout_marginTop="15dp">

        <ImageView
            android:id="@+id/iv_normal_refresh_footer_chrysanthemum"
            android:layout_width="34dp"
            android:layout_height="34dp"
            android:src="@anim/header_dodo_bga_refresh_loading"/>
    </FrameLayout>

    <TextView
        android:id="@+id/tv_normal_refresh_footer_status"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="15dp"
        android:layout_marginTop="15dp"
        android:text="載入中..."
        android:textColor="#777"
        android:textSize="12sp" />
</LinearLayout>

header_dodo_bga_refresh_loading.xml

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false" >
    <item
        android:drawable="@mipmap/default_ptr_wodfan_frame1"
        android:duration="200"/>
    <item
        android:drawable="@mipmap/default_ptr_wodfan_frame2"
        android:duration="200"/>
</animation-list>

在res目錄下新建anim包,建立佈局檔案header_dodo_bga_refresh_loading.xml,用Animation-list實現逐幀動畫,自定義就是如此的簡單,當然如果你想慕課網那樣比較複雜的效果,你可以參考BGANormalRefreshViewHolder、BGAStickinessRefreshViewHolder、BGAMoocStyleRefreshViewHolder這幾個類,操作裡面的handleScale()方法實現更多的特效;

在自定義裡面還有許多方法,例如:修改重新整理和載入的時候需要更變文字等等,在這裡就不仔細說了;

自定義DefineBAGRefreshWithLoadView類已經寫好了,接下來就是編寫我們的主類和佈局:

activity_define_refresh_with_load.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <include layout="@layout/fml_title"/>
    <cn.bingoogolapple.refreshlayout.BGARefreshLayout
        android:id="@+id/define_bga_refresh_with_load"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <android.support.v7.widget.RecyclerView
            android:id="@+id/define_bga_refresh_with_load_recycler"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:padding="5dp"
            android:scrollbars="none">

        </android.support.v7.widget.RecyclerView>
    </cn.bingoogolapple.refreshlayout.BGARefreshLayout>
</LinearLayout>

DefineLoadWithRefreshActivity.java

  • 繼承BGARefreshLayout裡面的BGARefreshLayoutDelegate的介面得到重新整理和載入的方法:

這裡寫圖片描述

  • 得到控制元件和設定監聽:
//得到控制元件
mBGARefreshLayout = (BGARefreshLayout) findViewById(R.id.define_bga_refresh_with_load);
//設定重新整理和載入監聽
mBGARefreshLayout.setDelegate(this);
  • 呼叫setRefreshViewHolder()方法傳入實現好的自定義類DefineBAGRefreshWithLoadView
/**
* 設定 BGARefreshLayout重新整理和載入
* */
private void setBgaRefreshLayout() {
   mDefineBAGRefreshWithLoadView = new DefineBAGRefreshWithLoadView(mContext , true , true);
   //設定重新整理樣式
   mBGARefreshLayout.setRefreshViewHolder(mDefineBAGRefreshWithLoadView);
   mDefineBAGRefreshWithLoadView.updateLoadingMoreText("自定義載入更多");
}

基本程式碼就這些下面是完整程式碼:

DefineLoadWithRefreshActivity.java


/**
 * Created by fml on 2015/12/4 0004.
 */
public class DefineLoadWithRefreshActivity extends BaseActivity implements BGARefreshLayout.BGARefreshLayoutDelegate{
    private BGARefreshLayout mBGARefreshLayout;
    private RecyclerView mRecyclerView;
    private Context mContext;
    /** title */
    private TextView mTitle;
    /** 資料 */
    private List<String> mListData = new ArrayList<String>();
    /** 一次載入資料的條數 */
    private int DATASIZE = 10;
    /** 資料填充adapter */
    private RecyclerViewAdapter mRecyclerViewAdapter = null;
    /** 設定一共請求多少次資料 */
    private int ALLSUM = 0;
    /** 設定重新整理和載入 */
    private DefineBAGRefreshWithLoadView mDefineBAGRefreshWithLoadView = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_define_refresh_with_load);
        mContext = this;
        initView();
        setBgaRefreshLayout();
        setRecyclerView();
    }

    /** 進入頁面首次載入資料 */
    @Override
    protected void onStart() {
        super.onStart();
        mBGARefreshLayout.beginRefreshing();
        onBGARefreshLayoutBeginRefreshing(mBGARefreshLayout);
    }

    private void initView() {
        mTitle = (TextView) findViewById(R.id.fml_title);
        mTitle.setText("自定義重新整理和載入更多樣式");
        mBGARefreshLayout = (BGARefreshLayout) findViewById(R.id.define_bga_refresh_with_load);
        mRecyclerView = (RecyclerView) findViewById(R.id.define_bga_refresh_with_load_recycler);
        //設定重新整理和載入監聽
        mBGARefreshLayout.setDelegate(this);
    }
    /**
     * 設定 BGARefreshLayout重新整理和載入
     * */
    private void setBgaRefreshLayout() {
        mDefineBAGRefreshWithLoadView = new DefineBAGRefreshWithLoadView(mContext , true , true);
        //設定重新整理樣式
        mBGARefreshLayout.setRefreshViewHolder(mDefineBAGRefreshWithLoadView);
        mDefineBAGRefreshWithLoadView.updateLoadingMoreText("自定義載入更多");
    }
    /** 設定RecyclerView的佈局方式 */
    private void setRecyclerView(){
        //垂直listview顯示方式
        mRecyclerView.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false));
    }
    /** 模擬請求網路資料 */
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case 0:
                    mListData.clear();
                    setData();
                    mBGARefreshLayout.endRefreshing();
                    break;
                case 1:
                    setData();
                    mBGARefreshLayout.endLoadingMore();
                    break;
                case 2:
                    mBGARefreshLayout.endLoadingMore();
                    break;
                default:
                    break;

            }
        }
    };
    /**
     * 新增假資料
     * */
    private void setData() {
        for(int i = 0 ; i < DATASIZE ; i++){
            mListData.add("第" + (ALLSUM * 10 + i) +"條資料");
        }
        if(ALLSUM == 0){
            setRecyclerCommadapter();
        }else{
            mRecyclerViewAdapter.notifyDataSetChanged();
        }
    }
    /** 資料填充 */
    private void setRecyclerCommadapter() {
        mRecyclerViewAdapter = new RecyclerViewAdapter(mContext , mListData);
        mRecyclerView.setAdapter(mRecyclerViewAdapter);
        //點選事件
        mRecyclerViewAdapter.setOnItemClickListener(new RecyclerViewAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View v, int position) {
                Toast.makeText(mContext, "onclick  " + position, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onItemLongClick(View v, int position) {
                Toast.makeText(mContext, "onlongclick  " + position, Toast.LENGTH_SHORT).show();
            }
        });
    }
    /** 重新整理 */
    @Override
    public void onBGARefreshLayoutBeginRefreshing(BGARefreshLayout refreshLayout) {
        mDefineBAGRefreshWithLoadView.updateLoadingMoreText("自定義載入更多");
        mDefineBAGRefreshWithLoadView.showLoadingMoreImg();
        ALLSUM = 0;
        handler.sendEmptyMessageDelayed(0 , 2000);
    }
    /** 載入 */
    @Override
    public boolean onBGARefreshLayoutBeginLoadingMore(BGARefreshLayout refreshLayout) {
        if(ALLSUM == 2){
            mDefineBAGRefreshWithLoadView.updateLoadingMoreText("沒有更多資料");
            mDefineBAGRefreshWithLoadView.hideLoadingMoreImg();
            handler.sendEmptyMessageDelayed(2 , 2000);
            return true;
        }
        ALLSUM++;
        handler.sendEmptyMessageDelayed(1 , 2000);
        return true;
    }
}

在進入頁面的時候,先顯示出來重新整理的效果的操作是在onStart()方法裡面呼叫了onBGARefreshLayoutBeginRefreshing()方法,程式碼如下:

/** 開始重新整理 **/
mBGARefreshLayout.beginRefreshing();
/** 獲取資料 **/
onBGARefreshLayoutBeginRefreshing(mBGARefreshLayout);

沒有跟多資料載入的時候,彈出沒有更多資料的效果的操作是,仍然執行重新整理的動作,但不請求資料,隱藏載入更多的圖片,更改文字,程式碼如下:

if(ALLSUM == 2){
    /** 設定文字 **/
    mDefineBAGRefreshWithLoadView.updateLoadingMoreText("沒有更多資料");
    /** 隱藏圖片 **/
    mDefineBAGRefreshWithLoadView.hideLoadingMoreImg();
    handler.sendEmptyMessageDelayed(2 , 2000);
    return true;
}

自定義重新整理和載入更多就這些了,可能有些地方表達的並不是很清楚,大家看一下我的程式碼,程式碼裡面的註釋還是挺清楚的

側滑刪除的效果實現

側滑刪除的效果,主要是使用封裝好的工具類SlidingButtonView.java,下面是裡面的一些方法:

監聽手勢:

@Override
    public boolean onTouchEvent(MotionEvent ev) {
        Log.i("TAG" , "18");
        int action = ev.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
                Log.i("TAG" , "ACTION_MOVE  8");
                mIonSlidingButtonListener.onDownOrMove(this);
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                Log.i("TAG" , "ACTION_CANCEL  10");
                changeScrollx();
                return true;
            default:
                break;
        }
        return super.onTouchEvent(ev);
    }

滑動改變:

@Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        Log.i("TAG", "11");
        mTextView_Delete.setTranslationX(l - mScrollWidth);
    }

根據拖動距離判斷關閉或是開啟選單:

public void changeScrollx(){
        Log.i("TAG" , "滾動滾動條  12");
        if(getScrollX() >= (mScrollWidth/2)){
            this.smoothScrollTo(mScrollWidth, 0);
            isOpen = true;
            mIonSlidingButtonListener.onMenuIsOpen(this);
            Log.i("TAG", "滾動滾動條  展開  13" + isOpen);
        }else{
            Log.i("TAG" , "滾動滾動條  關閉   14");
            this.smoothScrollTo(0, 0);
            isOpen = false;
        }
    }

定義滑動監聽介面:

public interface IonSlidingButtonListener{
        void onMenuIsOpen(View view);
        void onDownOrMove(SlidingButtonView slidingButtonView);
    }

操作如下:

item_sliding_delete.xml

<?xml version="1.0" encoding="utf-8"?>
<com.example.sliding.SlidingButtonView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:background="@android:color/white"
    android:layout_marginBottom="3dp">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    <TextView
        android:id="@+id/item_sliding_delete"
        android:layout_height="match_parent"
        android:layout_width="100dp"
        android:gravity="center"
        android:layout_toRightOf="@+id/item_sliding_lay"
        android:text="刪 除"
        android:background="@drawable/btn_click_red_havebackground"
        android:textColor="#DDFFFFFF"/>
        <RelativeLayout
            android:id="@+id/item_sliding_lay"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <TextView
                android:id="@+id/item_sliding_text"
                android:layout_height="match_parent"
                android:layout_width="match_parent"
                android:gravity="center_vertical"
                android:textSize="20dp"
                android:textColor="#DD000000"
                android:background="@drawable/btn_click_black_havebackground"
                android:text="c2222"
                />
        </RelativeLayout>
    </RelativeLayout>
</com.example.sliding.SlidingButtonView>

資料填充器SlidingRecyclerViewAdapter.java

首先因為我們需要自定義介面來提供點選、長點選和刪除動作的方法:

private IonSlidingViewClickListener mIonSlidingViewClickListener;
//定義介面
public interface IonSlidingViewClickListener {
    void onItemClick(View view, int position);
    void onLongItemClick(View view, int position);
    void onDeleteBtnCilck(View view, int position);
}
//設定監聽
public void setDeleteLister(IonSlidingViewClickListener iDeleteBtnClickListener){
    if(iDeleteBtnClickListener != null){
        mIonSlidingViewClickListener = iDeleteBtnClickListener;
    }
}

其次實現SlidingButtonView裡面的IonSlidingButtonListener介面,並在建立ViewHolder的onCreateViewHolder()方法裡面設定監聽:

((SlidingButtonView) v).setSlidingButtonListener(SlidingRecyclerViewAdapter.this);

之後在繫結ViewHolder的onBindViewHolder()方法裡面觸發事件:

/** 觸發點選事件 */
holder.mViewGroup.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
   Log.i("TAG","點選內容");
       //判斷是否有刪除選單開啟
       if (menuIsOpen()) {
           Log.i("TAG","選單處於開啟狀態");
           //關閉選單
           closeMenu();
       } else {
           Log.i("TAG","選單處於關閉狀態");
           int n = holder.getLayoutPosition();
           mIonSlidingViewClickListener.onItemClick(v, n);
       }
   }
});
/** 觸發長點選事件 */
holder.mViewGroup.setOnLongClickListener(new View.OnLongClickListener() {
   @Override
   public boolean onLongClick(View v) {
   Log.i("TAG", "點選內容");
   //判斷是否有刪除選單開啟
   if (menuIsOpen()) {
       Log.i("TAG", "選單處於開啟狀態");
       //關閉選單
       closeMenu();
   } else {
       Log.i("TAG", "選單處於關閉狀態");
       int n = holder.getLayoutPosition();
       mIonSlidingViewClickListener.onLongItemClick(v, n);
   }
   return true;
   }
});
/** 觸發刪除事件 */
holder.mDeleteText.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
       Log.i("TAG", "點選");
       int n = holder.getLayoutPosition();
       mIonSlidingViewClickListener.onDeleteBtnCilck(v, n);
   }
});

最後在主程式碼裡面實現IonSlidingViewClickListener 介面,設定監聽,即可:

mSlidingRecyclerViewAdapter.setDeleteLister(this);
/** 點選事件 */
@Override
public void onItemClick(View view, int position) {
    Toast.makeText(mContext,"點選了 "+position,Toast.LENGTH_SHORT).show();
}
/** 長點選事件 */
@Override
public void onLongItemClick(View view, int position) {
    Toast.makeText(mContext,"長點選了 "+position,Toast.LENGTH_SHORT).show();
}
/** 刪除事件 */
@Override
public void onDeleteBtnCilck(View view, int position) {
    mListData.remove(position);
    mSlidingRecyclerViewAdapter.notifyDataSetChanged();
}

對於新增的四種功能已經全部實現,可定有表達不太清楚地地方,大家可以檢視我的原始碼

相關推薦

RecyclerView+BGARefreshLayout實現定義重新整理載入刪除效果

前言 還有2個月就過年了,對於我們這樣在外漂泊的異鄉人來說,一家人團聚在一起,吃一頓團圓飯,那是再幸福不過的事了。我們之所以遠離家鄉來到異鄉就像異鄉人這首歌寫的一樣,只為一扇窗! 正文 上篇文章給大家講解了一下關於RecyclerView的使用,今天給

自主實現RecyclerView重新整理載入HeaderFooter以及swiperefreshlayout的部分講解

  年前年後的那段時間比較忙,忙的來忘了寫部落格。最近空閒了,有時間了,來看部落格發現有兩個來月沒有發文章了,對自己的沒有堅持先來幾個,部落格還是要寫的,以後會持續更新。   廢話少說,網上關於列表控

RecyclerView重新整理載入及新增頭佈局腳佈局實現

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

[log] vue使用Mint元件實現重新整理載入

https://mint-ui.github.io/docs/#/zh-cn2/loadmore 使用的vue <mt-loadmore :top-method="loadTop" :bottom

better-scroll實現重新整理載入更多(巨簡單...)

1、廢話少說,先看看移動端的列表頁面 (1)正常瀏覽 (2)下拉重新整理中 (3)下拉重新整理結束 (4) 上拉載入 (5)上拉 載入中 3、網上也有一些基本使用教程,這裡就不一一累贅,下

關於重新整理載入的問題--RecyclerView-- SwipeToLoadLayout

RecyclerView-- SwipeToLoadLayout關於頁面資料載入的問題:下拉重新整理,本次只介紹關於RecycleView的一個重新整理框架SwipeToLoadLayout(一)首先介紹下RecyclerView,RecyclerView相比ListView

重新整理載入更多控制元件實現原理及解析(一)

以前那個賬號,以後可能不用了,把文章搬過來!!! 效果預覽 接受hi大頭鬼hi的建議,來一個動態圖,方便大家知道這是個什麼東西。 動機 原理     無論是下拉重新整理還是上拉載入更多,原理都是在內容View(ListView、Re

Android RecyclerView重新整理載入更多到底自動載入更多

一、廢話 搞了這麼久的Android,可能是我渠道比較閉塞,一直沒找到比較好用的下拉重新整理,往上找的第三方比較知名的一些,都說有這樣那樣的瑕疵,一直用的SwipeRefreshLayout 做下拉載入,然後在RecycleView最後多加一個item,只要載入了這個ite

微信小程式重新整理載入

下拉重新整理: (1)直接呼叫onPullDownRefresh:function()事件,首先設定app.js以及有該需求的頁面json檔案中的 “enablePullDownRefresh”: true, //允許下拉重新整理 “backgroundTextStyle”: “dar

Apicloud——重新整理載入

2018-12-07  13:18:21 非Apicloud中的外掛 1 <!doctype html> 2 <html> 3 4 <head> 5 <meta charset="utf-8"> 6

vue better-scroll 使用 重新整理載入

我的目的是為了實現列表的下拉重新整理、上拉載入,所以選擇了better-scroll這個庫。 用好這個庫,需要理解下面說明 必須包含兩個大的div,外層和內層div 外層div設定可視的大小(寬或者高)-有限制寬或高 內層div,包裹整個可以滾動的部分 內層d

一個簡單好用的重新整理載入控制元件

*本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家釋出 有更新: 最新的庫版本為1.0.2(相容舊版本,舊版本是1.0.0),完整的庫地址: compile'com.zt.maven.widget:refreshview:1.0.2

[Android]Ultra-Pull-To-Refresh之listview重新整理載入的用例-已更新

前言 本次demo的編輯環境為android studio,java1.8 截圖 使用 1.本示例依賴jar如下: dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) co

SwipeRefreshLayout 重新整理載入的使用

一、SwipeRefreshLayout簡單介紹 1、SwipeRefreshLayout是Google推出的重新整理控制元件。 2、可以設定下拉重新整理的高度,達到一定高度時才會重新整理 3、使用該控制元件實現重新整理時,需要在這個佈局裡包裹可以滑動的子

瀑布流,重新整理載入更多

前言:由於專案需要,經理喊我做一個瀑布流的檢視,在網上找了幾個目前主流的幾個瀑布流解決方案。最後分別研究了各自的解決方案,我選擇了StageredGridView。大家可以在github上找到。但是最後我發現用StageredGridView來實現下拉重新整理、上拉載入更

Android仿QQ重新整理回彈

附上原始碼地址…… http://download.csdn.net/detail/qq_36255612/9717199 首先自定義一個Scrollview, 重寫computeScroll、on

Android 基於 MVP 框架的重新整理載入頁面,ViewPresenter層基類封裝

前言 Android 專案開發中經常遇到列表式頁面,並且需要實現下拉重新整理,上拉到底後加載下一頁的功能,這裡結合我們專案正在使用的 MVP 框架,介紹一種基類封裝方案,實現 View、Adapter、資料處理Presenter層的基類封裝,後續繼承這幾個類,

使用APICloud編寫優雅的HTML5程式碼《一》:重新整理載入更多

摘要: 發​現​A​P​I​C​l​o​u​d​倡​導​符​合​C​M​D​以​及​A​M​D​規​範​的​J​S​編​碼​標​準​,​提​供​基​於​H​T​M​L​5​的​跨​平​臺​A​p​p​編​譯​,​並​開​放​大​量​的​端​A​P​I​和​雲​A

重新整理載入SmartRefreshLayout

支援所有的 View(AbsListView、RecyclerView、WebView....View) 和多層巢狀的檢視結構支援自定義並且已經集成了很多炫酷的 Header 和 Footer (圖)

再也不用擔心重新整理載入啦!-定義ListView對重新整理載入

前言:       看過許多下拉重新整理的例子,好多大牛們的程式碼寫的很完美,讓人羨慕嫉妒恨~~~,可是,對於下拉重新整理時的手勢操作卻沒有給出詳細的解釋,當一堆堆邏輯程式碼出來的時候,對於我們這些菜鳥來說,理解起來真是讓人腦子都大了。為了解放大腦(懶得自己進行全面分析),