詳解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下拉重新整理、上拉載入、Header、Footer以及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 框架的下拉重新整理、上拉載入頁面,View和Presenter層基類封裝
前言 Android 專案開發中經常遇到列表式頁面,並且需要實現下拉重新整理,上拉到底後加載下一頁的功能,這裡結合我們專案正在使用的 MVP 框架,介紹一種基類封裝方案,實現 View、Adapter、資料處理Presenter層的基類封裝,後續繼承這幾個類,
使用APICloud編寫優雅的HTML5程式碼《一》:下拉重新整理、上拉載入更多
摘要: 發現APICloud倡導符合CMD以及AMD規範的JS編碼標準,提供基於HTML5的跨平臺App編譯,並開放大量的端API和雲A
下拉重新整理、上拉載入SmartRefreshLayout
支援所有的 View(AbsListView、RecyclerView、WebView....View) 和多層巢狀的檢視結構支援自定義並且已經集成了很多炫酷的 Header 和 Footer (圖)
再也不用擔心下拉重新整理,上拉載入啦!-自定義ListView對上拉重新整理,上拉載入的詳解
前言: 看過許多下拉重新整理的例子,好多大牛們的程式碼寫的很完美,讓人羨慕嫉妒恨~~~,可是,對於下拉重新整理時的手勢操作卻沒有給出詳細的解釋,當一堆堆邏輯程式碼出來的時候,對於我們這些菜鳥來說,理解起來真是讓人腦子都大了。為了解放大腦(懶得自己進行全面分析),