天天看點

android下拉重新整理+左滑删除的實作(第一種方式)

下拉重新整理+左滑删除的效果實作一:

使用谷歌官方的SwipeRefreshLayout和第三方左滑删除的庫swipemenu-recyclerview

先看效果:

android下拉重新整理+左滑删除的實作(第一種方式)

實作步驟:

1、導入swipemenu-recyclerview庫

2、使用SwipeRefreshLayout包裹

3、代碼

1、導入swipemenu-recyclerview庫

dependencies {
    compile 'com.tubb.smrv:swipemenu-recyclerview:3.0.2'
}
           

編寫删除的布局:

itemmenu.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="100dp"
    android:layout_height="match_parent"
    android:background="#f00">

    <Button
        android:id="@+id/delete_button"
        android:layout_width="100dp"
        android:layout_height="match_parent"
        android:text="删除" />
</LinearLayout>
           

編寫item主布局:

itemcontent.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="match_parent">

    <Button
        android:id="@+id/item_btn"
        android:layout_width="100dp"
        android:layout_height="wrap_content"/>

</LinearLayout>
           

編寫swipmenu-recyclerview主布局:

将item主布局和删除布局引入,其中smContentView和smMenuView的id值不能變

swipitem.xml

<?xml version="1.0" encoding="utf-8"?>
<com.tubb.smrv.SwipeMenuLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:background="#0fa"
    android:layout_height="wrap_content">

    <include
        android:id="@id/smContentView"
        layout="@layout/itemcontent" />

    <include
        android:id="@id/smMenuView"
        layout="@layout/itemmenu" />
</com.tubb.smrv.SwipeMenuLayout>
           

将自定義的SwipMenuRecyclerView引入主界面:

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:id="@+id/swiprefresh"
    android:layout_height="match_parent">

    <com.tubb.smrv.SwipeMenuRecyclerView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    </com.tubb.smrv.SwipeMenuRecyclerView>
</android.support.v4.widget.SwipeRefreshLayout>
           

布局完成。

代碼:

自定義一個類用來填充Item的内容

User.java

package com.example.eventbus.lhdswipmenu;

/**
 * Created by LHD on 2016/6/25.
 */
public class User {
    String name;

    public User(String mname) {
        this.name = mname;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
           

監聽itemview的點選事件的接口

onlhdSwipitemClickListener.java

package com.example.eventbus.lhdswipmenu;

import android.view.View;

/**
 * Created by LHD on 2016/6/25.
 */
public interface OnlhdSwipItemClickListener {
    public void onItemClick(View view,int position);
}
           

實作adapter

lhdswipadapter.java

package com.example.eventbus.lhdswipmenu;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by LHD on 2016/6/25.
 */
public class lhdswipadapter extends RecyclerView.Adapter<lhdswipadapter.ViewHolder> {

    private List<User> mItems = new ArrayList<User>();
    private Context mcontext;
    private OnlhdSwipItemClickListener listener;

    public lhdswipadapter(Context context, List<User> users, OnlhdSwipItemClickListener mlistner) {
        this.mcontext = context;
        this.mItems = users;
        this.listener = mlistner;
    }

    @Override
    public lhdswipadapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(mcontext).inflate(R.layout.swipeitem, parent, false);
        ViewHolder vh = new ViewHolder(v, this.listener);
        return vh;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        final ViewHolder mholder = holder;
        User user = mItems.get(position);
        mholder.button.setText(user.name);
        mholder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(mcontext, "點選了第" + position + "個Button", Toast.LENGTH_SHORT).show();
            }
        });
        mholder.deletebutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mItems.remove(position);
                notifyItemRemoved(position);
            }
        });
    }

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

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private OnlhdSwipItemClickListener mListener;
        private Button button;
        private Button deletebutton;

        public ViewHolder(View itemView, OnlhdSwipItemClickListener Listener) {
            super(itemView);
            button = (Button) itemView.findViewById(R.id.item_btn);
            deletebutton = (Button) itemView.findViewById(R.id.delete_button);
            this.mListener = Listener;
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if (mListener != null) {
                mListener.onItemClick(v, getAdapterPosition());
            }
        }
    }

}
           

實作分割線效果:

DividerItemDecoration.java

package com.example.eventbus.lhdswipmenu;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;

/**
 * Created by ls on 2016/3/21.
 */
public class DividerItemDecoration extends RecyclerView.ItemDecoration {

    private static final int[] ATTRS = new int[]{
            android.R.attr.listDivider
    };

    public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;

    public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;

    private Drawable mDivider;

    private int mOrientation;

    public DividerItemDecoration(Context context, int orientation) {
        final TypedArray a = context.obtainStyledAttributes(ATTRS);
        mDivider = a.getDrawable();
        a.recycle();
        setOrientation(orientation);
    }

    public void setOrientation(int orientation) {
        if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
            throw new IllegalArgumentException("invalid orientation");
        }
        mOrientation = orientation;
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent) {
        if (mOrientation == VERTICAL_LIST) {
            drawVertical(c, parent);
        } else {
            drawHorizontal(c, parent);
        }

    }


    public void drawVertical(Canvas c, RecyclerView parent) {
        final int left = parent.getPaddingLeft();
        final int right = parent.getWidth() - parent.getPaddingRight();

        final int childCount = parent.getChildCount();
        for (int i = ; i < childCount; i++) {
            final View child = parent.getChildAt(i);
            android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(parent.getContext());
            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                    .getLayoutParams();
            final int top = child.getBottom() + params.bottomMargin;
            final int bottom = top + mDivider.getIntrinsicHeight();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }

    public void drawHorizontal(Canvas c, RecyclerView parent) {
        final int top = parent.getPaddingTop();
        final int bottom = parent.getHeight() - parent.getPaddingBottom();

        final int childCount = parent.getChildCount();
        for (int i = ; i < childCount; i++) {
            final View child = parent.getChildAt(i);
            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                    .getLayoutParams();
            final int left = child.getRight() + params.rightMargin;
            final int right = left + mDivider.getIntrinsicHeight();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }

    @Override
    public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
        if (mOrientation == VERTICAL_LIST) {
            outRect.set(, , , mDivider.getIntrinsicHeight());
        } else {
            outRect.set(, , mDivider.getIntrinsicWidth(), );
        }
    }
}
           

實作首頁面代碼:

MainActivity.java

package com.example.eventbus.lhdswipmenu;

import android.os.Bundle;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Handler;

public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private List<User> users = new ArrayList<User>();
    private OnlhdSwipItemClickListener mlistener;
    private lhdswipadapter adapter;

    private SwipeRefreshLayout swipeRefreshLayout;
private Handler handler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initswiprefresh();

        LinearLayoutManager mLayoutManager = new LinearLayoutManager(this);
        mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView = (RecyclerView) findViewById(R.id.listview);
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));
        initdata();
        recyclerView.setAdapter(adapter);
    }

    private void initdata() {
        users.add(new User("1"));
        users.add(new User("2"));
        users.add(new User("3"));
        users.add(new User("4"));
        users.add(new User("5"));
        users.add(new User("6"));
        users.add(new User("7"));
        users.add(new User("8"));
        users.add(new User("9"));
        adapter = new lhdswipadapter(MainActivity.this, users, new OnlhdSwipItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                Toast.makeText(MainActivity.this, "點選了第" + position + "個View", Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void initswiprefresh() {
        swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swiprefresh);
        swipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_light, android.R.color.holo_red_light, android.R.color.holo_orange_light, android.R.color.holo_green_light);
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                users.add(new User("a"));
                users.add(new User("b"));
                users.add(new User("c"));
                users.add(new User("d"));
                users.add(new User("e"));
                swipeRefreshLayout.setRefreshing(false);
                adapter.notifyDataSetChanged();
            }
        });
    }
}
           

這樣就完成了,其中Item的主界面布局和删除布局都可以自定義。

代碼下載下傳:

http://dl.download.csdn.net/down11/20160625/805178d21800085b6b188344ae5d33a8.zip?response-content-disposition=attachment%3Bfilename%3D%22LHDSwipmenu.zip%22&OSSAccessKeyId=9q6nvzoJGowBj4q1&Expires=1466871030&Signature=Y9qjUheSLHaLGwjXTIK%2FalGsjv0%3D