Skip to content

guitarstar/SwipeLayout

Repository files navigation

SwipeLayout

image

源码解析博客-- 一分钟轻松打造左滑删除+下拉刷新Listview控件 http://blog.csdn.net/guitarstudio/article/details/48525339/

demo测试安装apk下载地址:https://github.com/guitarstar/SwipeLayout/blob/master/download/demo.apk

步骤 1. Add the JitPack repository to your build file

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

步骤 2. Add the dependency

dependencies {
        compile 'com.github.guitarstar:SwipeLayout:v1.0'
}

步骤 3. 列表的布局layout编写

<com.solo.library.SlideTouchView
    android:id="@+id/mSlideTouchView"
    android:layout_width="match_parent"
    android:layout_height="60dp">
    <!-- 下层布局 -->
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="horizontal">
        <Button
            android:id="@+id/btn_del"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:background="@android:color/holo_red_light"
            android:text="删除"/>
    </LinearLayout>
    <!-- 上层布局 -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#fff"><!-- 这里设个背景颜色将下层布局遮掩 -->
        <TextView
            android:id="@+id/tv"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"/>
    </LinearLayout>
</com.solo.library.SlideTouchView>

步骤 4. ListView的adapter继承SlideBaseAdapter(使用recyclerview的adapter继承SlideRecyclerViewBaseAdapter)

如果使用ListView的情况:

public class LvAdapter extends SlideBaseAdapter { List list; public LvAdapter(List list) { this.list = list; }

@Override
public int[] getBindOnClickViewsIds() {
    return new int[]{R.id.btn_del};  //必须调用, 删除按钮或者其他你想监听点击事件的View的id
}

@Override
public int getCount() {
    return list.size();
}

@Override
public Object getItem(int position) {
    return list.get(position);
}

@Override
public long getItemId(int position) {
    return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    MyViewHolder holder = new MyViewHolder();
    if (convertView == null) {
        convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_list_item, null);
        holder.tv = (TextView) convertView.findViewById(tv);
        holder.mSlideTouchView = (SlideTouchView) convertView.findViewById(R.id.mSlideTouchView);
        convertView.setTag(holder);

        bindSlideState(holder.mSlideTouchView); //必须调用
        
    } else {
        holder = (MyViewHolder) convertView.getTag();
    }
    
    bindSlidePosition(holder.mSlideTouchView, position);//必须调用

    holder.tv.setText(String.valueOf(list.get(position)));
    return convertView;
}

如果使用recyclerview的情况:
public class RcyAdapter extends SlideRecyclerViewBaseAdapter {
    List<Integer> list;

    public RcyAdapter(List<Integer> list) {
        this.list = list;
    }

    @Override
    public int[] getBindOnClickViewsIds() {
        return new int[]{R.id.btn_del};  //必须调用, 删除按钮或者其他你想监听点击事件的View的id
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_list_item, null);
        return new MyViewHolder(v);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        MyViewHolder viewHolder = (MyViewHolder) holder;
        viewHolder.tv.setText(String.valueOf(list.get(position)));

        bindSlidePosition(viewHolder.mSlideTouchView, position);//必须调用
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder {
        TextView tv;
        SlideTouchView mSlideTouchView;
        public MyViewHolder(View itemView) {
            super(itemView);
            tv = (TextView) itemView.findViewById(R.id.tv);
            mSlideTouchView = (SlideTouchView) itemView.findViewById(R.id.mSlideTouchView);

            bindSlideState(mSlideTouchView);//必须调用
        }
    }
}

步骤 5. 点击事件监听 adapter.setupRecyclerView(mRecyclerView); //里面的逻辑是监听滚动关闭按钮显示 (ListView中调用adapter.setupListView(mListView);) adapter.setOnClickSlideItemListener(new OnClickSlideItemListener() { @Override public void onItemClick(ISlide iSlideView, View v, int position) { //点击item时会回调此方法(onClick中也会回调) Toast.makeText(v.getContext(), "click item position:" + position, Toast.LENGTH_SHORT).show(); }

    @Override
    public void onClick(ISlide iSlideView, View v, int position) {
        //控件的所有子控件的点击回调都会回调此方法
        if (v.getId() == R.id.btn_del) { //对删除按钮的监听(上面adapter的getBindOnClickViewsIds()中设置了R.id.btn_del)
            iSlideView.close(); //关闭当前的按钮
            list.remove(position);
            adapter.notifyDataSetChanged();
        }
    }
});