Android 列表侧滑删除

SwipeLayout

import android.content.Context;

import android.util.AttributeSet;

import android.util.Log;

import android.view.MotionEvent;

import android.view.View;

import android.widget.HorizontalScrollView;

import android.widget.TextView;

import com.wondersgroup.smartcampus.teacher.R;

/**

* Created by ${zhanggaobo} on 2018/6/25.

* 侧滑删除

*/

public class SwipeLayoutextends HorizontalScrollView {

private TextViewmTextView_Delete;

private int mScrollWidth;

private IonSlidingButtonListenermIonSlidingButtonListener;

private BooleanisOpen =false;

private Booleanonce =false;

public SwipeLayout(Context context) {

this(context,null);

}

public SwipeLayout(Context context, AttributeSet attrs) {

this(context, attrs,0);

}

public SwipeLayout(Context context, AttributeSet attrs,int defStyleAttr) {

super(context, attrs, defStyleAttr);

this.setOverScrollMode(OVER_SCROLL_NEVER);

}

@Override

    protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

if (!once) {

mTextView_Delete = (TextView) findViewById(R.id.tv_delete);

once =true;

}

}

@Override

    protected void onLayout(boolean changed,int l,int t,int r,int b) {

super.onLayout(changed, l, t, r, b);

if (changed) {

this.scrollTo(0,0);

//获取水平滚动条可以滑动的范围,即右侧按钮的宽度

            mScrollWidth =mTextView_Delete.getWidth();

Log.i("asd","mScrollWidth:" +mScrollWidth);

}

}

@Override

    public boolean onTouchEvent(MotionEvent ev) {

int action = ev.getAction();

switch (action) {

case MotionEvent.ACTION_DOWN:

case MotionEvent.ACTION_MOVE:

mIonSlidingButtonListener.onDownOrMove(this);

break;

case MotionEvent.ACTION_UP:

case MotionEvent.ACTION_CANCEL:

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);

mTextView_Delete.setTranslationX(l -mScrollWidth);

}

/**

* 按滚动条被拖动距离判断关闭或打开菜单

*/

    public void changeScrollx() {

if (getScrollX() >= (mScrollWidth /2)) {

this.smoothScrollTo(mScrollWidth,0);

isOpen =true;

mIonSlidingButtonListener.onMenuIsOpen(this);

}else {

this.smoothScrollTo(0,0);

isOpen =false;

}

}

/**

* 打开菜单

*/

    public void openMenu() {

if (isOpen) {

return;

}

this.smoothScrollTo(mScrollWidth,0);

isOpen =true;

mIonSlidingButtonListener.onMenuIsOpen(this);

}

/**

* 关闭菜单

*/

    public void closeMenu() {

if (!isOpen) {

return;

}

this.smoothScrollTo(0,0);

isOpen =false;

}

public void setSlidingButtonListener(IonSlidingButtonListener listener) {

mIonSlidingButtonListener = listener;

}

public interface IonSlidingButtonListener {

void onMenuIsOpen(View view);

void onDownOrMove(SwipeLayout swipeLayout);

}

}

layout

android:id="@+id/swipe_layout"

    android:layout_width="match_parent"

    android:layout_height="60dp"

    android:layout_marginBottom="1dp"

    android:background="@color/white">

        android:layout_width="match_parent"

        android:layout_height="match_parent">

            android:id="@+id/tv_delete"

            android:layout_width="100dp"

            android:layout_height="match_parent"

            android:layout_toRightOf="@+id/layout_content"

            android:background="@color/red_car"

            android:gravity="center"

            android:text="删 除"

            android:textColor="#DDFFFFFF" />

            android:id="@+id/layout_content"

            android:layout_width="match_parent"

            android:layout_height="match_parent"

            android:background="@color/white"

            android:clickable="true">

                android:id="@+id/imgae_check"

                android:layout_width="16dp"

                android:layout_height="16dp"

                android:layout_alignParentRight="true"

                android:layout_centerVertical="true"

                android:layout_marginRight="@dimen/margin_15"

                android:src="@mipmap/icon_circle_big"

                android:visibility="gone" />

                android:id="@+id/image_file"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:layout_alignParentLeft="true"

                android:layout_centerVertical="true"

                android:layout_marginLeft="@dimen/margin_15"

                android:layout_marginRight="@dimen/margin_15"

                android:src="@mipmap/icon_file_folder" />

                android:layout_width="match_parent"

                android:layout_height="match_parent"

                android:layout_toRightOf="@+id/image_file"

                android:gravity="center_vertical"

                android:orientation="vertical">

                    android:id="@+id/text_file_name"

                    android:layout_width="wrap_content"

                    android:layout_height="wrap_content"

                    android:layout_marginBottom="@dimen/margin_5"

                    android:lineSpacingExtra="6sp"

                    android:text="教学笔记-2018"

                    android:textColor="#333333"

                    android:textSize="15sp" />

                    android:id="@+id/text_file_time"

                    android:layout_width="wrap_content"

                    android:layout_height="wrap_content"

                    android:text="2018-06-20  12:00"

                    android:textColor="#999999"

                    android:textSize="12.1sp" />


package com.wondersgroup.smartcampus.teacher.adapter.file;

import android.content.Context;

import android.support.annotation.NonNull;

import android.support.v7.widget.RecyclerView;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ImageView;

import android.widget.RelativeLayout;

import android.widget.TextView;

import com.johnson.commonlibs.common_utils.utils.DateUtils;

import com.johnson.commonlibs.common_utils.utils.DensityUtil;

import com.johnson.commonlibs.common_utils.utils.StrUtils;

import com.wondersgroup.smartcampus.teacher.R;

import com.wondersgroup.smartcampus.teacher.model.filesmanager.FilesResult;

import com.wondersgroup.smartcampus.teacher.view.SwipeLayout;

import java.util.ArrayList;

import java.util.List;

import butterknife.Bind;

import butterknife.ButterKnife;

/**

* 列表适配器

*/

public class MyFilesAdapterextends RecyclerView.Adapterimplements SwipeLayout.IonSlidingButtonListener {

private Listdata;

private Contextcontext;

private SwipeLayoutmMenu =null;

private IonSlidingViewClickListenermIDeleteClickListener;

private Listchooses =new ArrayList<>();

private boolean isSelect =false;

public void setSelect(boolean select) {

isSelect = select;

chooses.clear();

notifyDataSetChanged();

}

public void setData(List data) {

this.data = data;

notifyDataSetChanged();

}

public void clear() {

chooses.clear();

notifyDataSetChanged();

}

public List getData() {

return data;

}

public List getChooses() {

return chooses;

}

public MyFilesAdapter(List data, Context context) {

this.data = data;

this.context = context;

}

public void setmIDeleteClickListener(IonSlidingViewClickListener mIDeleteClickListener) {

this.mIDeleteClickListener = mIDeleteClickListener;

}

@NonNull

@Override

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

return new ViewHolder(LayoutInflater.from(context).inflate(R.layout.item_files_view, parent,false));

}

@Override

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

final FilesResult.BodyBean.DocListBean dataBean =data.get(position);

final ViewHolder viewHolder = (ViewHolder) holder;

viewHolder.swipeLayout.closeMenu();

if (!StrUtils.equals(dataBean.getDocType(),"0")) {

viewHolder.tvDelete.setVisibility(View.VISIBLE);

if (StrUtils.equals(dataBean.getDocType(),"1")) {

viewHolder.imageFile.setImageResource(R.mipmap.icon_file_doc);

}else if (StrUtils.equals(dataBean.getDocType(),"2")) {

viewHolder.imageFile.setImageResource(R.mipmap.icon_file_pdf);

}else if (StrUtils.equals(dataBean.getDocType(),"3")) {

viewHolder.imageFile.setImageResource(R.mipmap.icon_file_jpg);

}else if (StrUtils.equals(dataBean.getDocType(),"4")) {

viewHolder.imageFile.setImageResource(R.mipmap.icon_file_video);

}

if (isSelect) {

viewHolder.imgaeCheck.setVisibility(View.VISIBLE);

if (chooses.contains(dataBean.getId())) {

viewHolder.imgaeCheck.setImageResource(R.mipmap.icon_check);

}else {

viewHolder.imgaeCheck.setImageResource(R.mipmap.icon_circle_big);

}

}else {

viewHolder.imgaeCheck.setVisibility(View.GONE);

}

}else {

viewHolder.tvDelete.setVisibility(View.GONE);

viewHolder.imageFile.setImageResource(R.mipmap.icon_file_folder);

viewHolder.imgaeCheck.setVisibility(View.GONE);

}

viewHolder.textFileName.setText(dataBean.getName());

viewHolder.textFileTime.setText(DateUtils.time2StringMM(dataBean.getCreateTime()));

viewHolder.layoutContent.getLayoutParams().width = DensityUtil.getScreenWidth(context);

viewHolder.layoutContent.setOnClickListener(new View.OnClickListener() {

@Override

            public void onClick(View v) {

//判断是否有删除菜单打开

                if (menuIsOpen()) {

closeMenu();//关闭菜单

                }else {

if (!isSelect) {

int n =viewHolder.getLayoutPosition();

mIDeleteClickListener.onItemClick(v, n);

}else {

if (!StrUtils.equals(dataBean.getDocType(),"0")) {

if (chooses.contains(dataBean.getId())) {

chooses.remove(dataBean.getId());

viewHolder.imgaeCheck.setImageResource(R.mipmap.icon_circle_big);

}else {

chooses.add(dataBean.getId());

viewHolder.imgaeCheck.setImageResource(R.mipmap.icon_check);

}

}else {

int n =viewHolder.getLayoutPosition();

mIDeleteClickListener.onItemClick(v, n);

}

}

}

}

});

viewHolder.layoutContent.setOnLongClickListener(new View.OnLongClickListener() {

@Override

            public boolean onLongClick(View v) {

int n =viewHolder.getLayoutPosition();

mIDeleteClickListener.onLongClick(v, n);

return true;

}

});

viewHolder.tvDelete.setOnClickListener(new View.OnClickListener() {

@Override

            public void onClick(View v) {

int n =viewHolder.getLayoutPosition();

mIDeleteClickListener.onDeleteBtnCilck(v, n);

}

});

}

@Override

    public int getItemCount() {

return (data !=null &&data.size() >0) ?data.size() :0;

}

/**

* 关闭菜单

*/

    public void closeMenu() {

mMenu.closeMenu();

mMenu =null;

}

/**

* 判断是否有菜单打开

*/

    public Boolean menuIsOpen() {

if (mMenu !=null) {

return true;

}

return false;

}

/**

* 删除菜单打开信息接收

*/

    @Override

    public void onMenuIsOpen(View view) {

mMenu = (SwipeLayout) view;

}

/**

* 滑动或者点击了Item监听

*

    * @param slidingButtonView

    */

    @Override

    public void onDownOrMove(SwipeLayout slidingButtonView) {

if (menuIsOpen()) {

if (mMenu != slidingButtonView) {

closeMenu();

}

}

}

public interface IonSlidingViewClickListener {

void onItemClick(View view,int position);

void onDeleteBtnCilck(View view,int position);

void onLongClick(View view,int position);

}

class ViewHolderextends RecyclerView.ViewHolder {

@Bind(R.id.swipe_layout)

SwipeLayoutswipeLayout;

@Bind(R.id.tv_delete)

TextViewtvDelete;

@Bind(R.id.imgae_check)

ImageViewimgaeCheck;

@Bind(R.id.image_file)

ImageViewimageFile;

@Bind(R.id.text_file_name)

TextViewtextFileName;

@Bind(R.id.text_file_time)

TextViewtextFileTime;

@Bind(R.id.layout_content)

RelativeLayoutlayoutContent;

public ViewHolder(View itemView) {

super(itemView);

ButterKnife.bind(this, itemView);

((SwipeLayout) itemView).setSlidingButtonListener(MyFilesAdapter.this);

}

}

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容