RecyclerView側(cè)滑菜單和滑動(dòng)刪除Item

【需求】 手機(jī)可以在本地添加通知提醒譬挚,并且支持編輯和刪除粪薛,如下圖:


支持編輯和刪除.png

【三方依賴(lài)庫(kù)】

// RecyclerView側(cè)滑菜單黔姜,Item拖拽甘有,滑動(dòng)刪除Item律适,自動(dòng)加載更多腔长,HeaderView袭祟,F(xiàn)ooterView,Item分組黏貼
compile 'com.yanzhenjie:recyclerview-swipe:1.1.4'

【xml 布局】

<com.yanzhenjie.recyclerview.swipe.SwipeMenuRecyclerView
    android:id="@+id/xrv_warn"
    android:layout_above="@+id/rl_add_remind"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

【代碼】

    initSlide();  // 初始化 側(cè)滑刪除編輯
    initTallyList();  // 獲取 本地記賬提醒列表

【方法】

private void initSlide() {

    mAdapter = new TallyRemindAdapter(this);
    // srvWarn.setItemViewSwipeEnabled(true);// 開(kāi)啟滑動(dòng)刪除捞附。默認(rèn)關(guān)閉巾乳。
    srvWarn.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));

    // 創(chuàng)建菜單:
    SwipeMenuCreator mSwipeMenuCreator = new SwipeMenuCreator() {
        @Override
        public void onCreateMenu(SwipeMenu leftMenu, SwipeMenu rightMenu, int viewType) {
           /* SwipeMenuItem deleteItem = new SwipeMenuItem(mContext);
            // 各種文字和圖標(biāo)屬性設(shè)置您没。
            leftMenu.addMenuItem(deleteItem); // 在Item左側(cè)添加一個(gè)菜單。*/


            // 在Item右側(cè)添加一個(gè)菜單胆绊。
            // 1.編輯
            // 各種文字和圖標(biāo)屬性設(shè)置氨鹏。
            SwipeMenuItem modifyItem = new SwipeMenuItem(TallyRemindActivity.this)
                    .setBackgroundColor(getResources().getColor(R.color.vest_yellow))
                    .setText("編輯")
                    .setTextColor(Color.BLACK)
                    .setTextSize(15) // 文字大小。
                    .setWidth(140)
                    .setHeight(ViewGroup.LayoutParams.MATCH_PARENT);
            rightMenu.addMenuItem(modifyItem);
            // 2 刪除
            SwipeMenuItem deleteItem = new SwipeMenuItem(TallyRemindActivity.this);
            deleteItem.setText("刪除")
                    .setBackgroundColor(getResources().getColor(R.color.pwd_f3323b))
                    .setTextColor(Color.WHITE) // 文字顏色压状。
                    .setTextSize(15) // 文字大小仆抵。
                    .setWidth(140)
                    .setHeight(ViewGroup.LayoutParams.MATCH_PARENT);

            rightMenu.addMenuItem(deleteItem);

            // 注意:哪邊不想要菜單,那么不要添加即可种冬。
        }
    };
    // 設(shè)置監(jiān)聽(tīng)器肢础。
    srvWarn.setSwipeMenuCreator(mSwipeMenuCreator);

    SwipeMenuItemClickListener mMenuItemClickListener = new SwipeMenuItemClickListener() {
        @Override
        public void onItemClick(SwipeMenuBridge menuBridge) {
            // 任何操作必須先關(guān)閉菜單,否則可能出現(xiàn)Item菜單打開(kāi)狀態(tài)錯(cuò)亂碌廓。
            menuBridge.closeMenu();

            int direction = menuBridge.getDirection(); // 左側(cè)還是右側(cè)菜單传轰。
            int adapterPosition = menuBridge.getAdapterPosition(); // RecyclerView的Item的position。
            int menuPosition = menuBridge.getPosition(); // 菜單在RecyclerView的Item中的Position谷婆。
            if (menuPosition == 0) {

                TallyRemindBean tallyRemindBean = tallyRecordList.get(adapterPosition);
                showTimeSelector(true, tallyRemindBean);

            } else {
                ToastUtil.showToast("刪除成功");
                cancelLocalNotify(Long.valueOf(tallyRecordList.get(adapterPosition).getTime()));  // 取消本地通知
                TallyRemindBean tallyRemindBean = tallyRecordList.get(adapterPosition);
                tallyRecordList.clear();
                tallyRecordList.add(tallyRemindBean);
                TallyRecordDataModel.getInstance(TallyRemindActivity.this).deletTallyRecordFromDb(tallyRecordList);
                initTallyList(); // 刷新

            }
        }
    };

    // 菜單點(diǎn)擊監(jiān)聽(tīng)慨蛙。
    srvWarn.setSwipeMenuItemClickListener(mMenuItemClickListener);

    // 必須 最后執(zhí)行
    srvWarn.setAdapter(mAdapter);
}

【添加通知 和 取消通知】

/**
 * 添加本地推送
 * @param startTime
 */
private void initLocalNotify(long startTime) {

    long intervalMillis = 1000 * 60 * 60 * 24;  // 一天
    Intent intent = new Intent(mContext, RemindActionService.class);
    intent.putExtra("title", "記賬提醒");
    intent.putExtra("contentText", "記得記賬喔");
    PendingIntent pendingIntent = PendingIntent.getService(mContext, (int )startTime, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager am = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
    am.setRepeating(AlarmManager.RTC_WAKEUP, startTime, intervalMillis, pendingIntent);

}


/**
 * 取消本地推送
 * @param startTime
 */
private void cancelLocalNotify(long startTime) {

    Intent intent = new Intent(mContext, RemindActionService.class);
    intent.putExtra("title", "記賬提醒");
    intent.putExtra("contentText", "記得記賬喔");
    PendingIntent pendingIntent = PendingIntent.getService(mContext, (int )startTime, intent, PendingIntent.FLAG_CANCEL_CURRENT);
    AlarmManager am = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
    am.cancel(pendingIntent);

}

【時(shí)間選擇器】

/**
 * 時(shí)間選擇器
 */
private void showTimeSelector(final boolean isEdit, final TallyRemindBean tallyRemindBean) {

    Calendar c = Calendar.getInstance();
    selectedDate = Calendar.getInstance();
    startDate = Calendar.getInstance();
    endDate = Calendar.getInstance();

    //正確設(shè)置方式 原因:注意事項(xiàng)有說(shuō)明
    startDate.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH),
            c.get(Calendar.DAY_OF_MONTH), c.get(Calendar.HOUR), c.get(Calendar.MINUTE), 0);
    endDate.set(2019, 11, 31);

    // 時(shí)間選擇器
    TimePickerView pvTime = new TimePickerBuilder(TallyRemindActivity.this, new OnTimeSelectListener() {

        @Override
        public void onTimeSelect(Date date, View v) {

            mTime = date.getTime() + "";
            // mTvTime.setText(DateUtil.long2Date(date.getTime(), "yyyy-MM-dd"));

            if(isEdit){  // 處于編輯狀態(tài)

                if(tallyRemindBean != null){

                    tallyRemindBean.setTime(mTime);
                    TallyRecordDataModel.getInstance(TallyRemindActivity.this).updateTallyRecordFromDb(tallyRemindBean);
                    initTallyList(); // 刷新
                    initLocalNotify(date.getTime());
                }

            }else{   // 添加一條記錄

                mTallyId++;
                TallyRemindBean mTallyBean = new TallyRemindBean();
                mTallyBean.setTime(mTime);
                mTallyBean.setUserId(userId+"");
                TallyRecordDataModel.getInstance(TallyRemindActivity.this).addTallyRecordToDb(mTallyBean); // 保存到數(shù)據(jù)庫(kù)
                initTallyList();  // 刷新列表
                initLocalNotify(date.getTime());
            }

        }
    })
            .setRangDate(startDate, endDate) // 設(shè)置 時(shí)間范圍
            .setDate(selectedDate)  // 設(shè)置 默認(rèn)當(dāng)前時(shí)間
            .setTitleText("設(shè)置提醒")
            .setType(new boolean[]{false, false, false, true, true, false})
            .build();// 默認(rèn)全部顯示

    pvTime.show();

}

【實(shí)體類(lèi)】

public class TallyRemindBean {

private String time;
private int id;
private String userId;


public String getTime() {
    return time;
}

public void setTime(String time) {
    this.time = time;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getUserId() {
    return userId;
}

public void setUserId(String userId) {
    this.userId = userId;
     }
 }

【數(shù)據(jù)庫(kù)操作】

 /**
 * 從本地db刪除信息的方法
 *
 * @param tallyBeans
 */
public int deletTallyRecordFromDb(ArrayList<TallyRemindBean> tallyBeans) {
    if (tallyBeans == null || tallyBeans.isEmpty()) {
        return 0;
    }
    StringBuffer stringBuffer = new StringBuffer();
    for (TallyRemindBean messageInfo : tallyBeans) {
        if (messageInfo == null) {
            continue;
        }
        if (stringBuffer.length() > 0) {
            stringBuffer.append(" or ");
        }
        stringBuffer.append(ITallyRemindTable.ID + " = " + messageInfo.getId());
    }
    return delete(ITallyRemindTable.TABLE_NAME, stringBuffer.toString(), null);
}




/**
 * 從本地db更改信息的方法
 *
 * @param tallyBean
 */
public int updateTallyRecordFromDb(TallyRemindBean tallyBean) {
    if (tallyBean == null ) {
        return 0;
    }
    String whereClause = ITallyRemindTable.ID + " = ?" ;
    ContentValues contentValues = new ContentValues();
    contentValues.put(ITallyRemindTable.TIME, tallyBean.getTime() );
    return update(ITallyRemindTable.TABLE_NAME, contentValues, whereClause, new String[]{tallyBean.getId() + ""});
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市纪挎,隨后出現(xiàn)的幾起案子期贫,更是在濱河造成了極大的恐慌,老刑警劉巖异袄,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件通砍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡烤蜕,警方通過(guò)查閱死者的電腦和手機(jī)封孙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)讽营,“玉大人虎忌,你說(shuō)我怎么就攤上這事〕髋簦” “怎么了膜蠢?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)莉兰。 經(jīng)常有香客問(wèn)我挑围,道長(zhǎng),這世上最難降的妖魔是什么糖荒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任杉辙,我火速辦了婚禮,結(jié)果婚禮上寂嘉,老公的妹妹穿的比我還像新娘奏瞬。我一直安慰自己枫绅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布硼端。 她就那樣靜靜地躺著并淋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪珍昨。 梳的紋絲不亂的頭發(fā)上县耽,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音镣典,去河邊找鬼兔毙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛兄春,可吹牛的內(nèi)容都是我干的澎剥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼赶舆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼哑姚!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起芜茵,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叙量,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后九串,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體绞佩,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年猪钮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了品山。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡躬贡,死狀恐怖谆奥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拂玻,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布宰译,位于F島的核電站檐蚜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏沿侈。R本人自食惡果不足惜闯第,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缀拭。 院中可真熱鬧咳短,春花似錦填帽、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至勾效,卻和暖如春嘹悼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背层宫。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工杨伙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人萌腿。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓限匣,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親毁菱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子米死,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容