1. 程式人生 > >SwipeRecyclerView 的側滑實現,simple版,有引入包的過程

SwipeRecyclerView 的側滑實現,simple版,有引入包的過程

效果圖:

左滑,出現新增

在這裡插入圖片描述

部落格內容

  1. 導包步驟
  2. 易出錯地方
  3. 完整程式碼
0. 導包步驟

Gradle

implementation 'com.yanzhenjie:recyclerview-swipe:1.1.4'

在xml中引用SwipeRecyclerView:

<com.yanzhenjie.recyclerview.swipe.SwipeMenuRecyclerView
...
    />
關鍵點,易出錯地方
  1. setWidth(),不是 setWeight();
  2. 介面卡的新增要放在menu建立完畢之後
// 建立選單:
        SwipeMenuCreator mSwipeMenuCreator = new SwipeMenuCreator() {
            @Override
            public void onCreateMenu(SwipeMenu leftMenu, SwipeMenu rightMenu, int viewType) {

                int width = getResources().getDimensionPixelOffset(R.dimen.dp_100);
                int height = ViewGroup.LayoutParams.MATCH_PARENT;
                // 注意:哪邊不想要選單,那麼不要新增即可。
                SwipeMenuItem addItem = new SwipeMenuItem(MainActivity.this)
                        .setBackground(R.drawable.selector_green)
                        .setImage(R.mipmap.ic_action_delete)
                        .setText("新增")
                        .setTextColor(Color.WHITE)
                        .setWidth(width)
                        .setHeight(height);
                rightMenu.addMenuItem(addItem); // 新增選單到右側。
            }
        };
// 設定監聽器。
        swipeRecyclerView.setSwipeMenuCreator(mSwipeMenuCreator);

        SwipeMenuItemClickListener mMenuItemClickListener = new SwipeMenuItemClickListener() {
            @Override
            public void onItemClick(SwipeMenuBridge menuBridge) {
                // 任何操作必須先關閉選單,否則可能出現Item選單開啟狀態錯亂。
                menuBridge.closeMenu();
                int direction = menuBridge.getDirection(); // 左側還是右側選單。
                int adapterPosition = menuBridge.getAdapterPosition(); // RecyclerView的Item的position。
                int menuPosition = menuBridge.getPosition(); // 選單在RecyclerView的Item中的Position。
                Toast.makeText(MainActivity.this, direction + " " + adapterPosition + " " + menuPosition, Toast.LENGTH_SHORT).show();
            }
        };

        // 選單點選監聽。
        swipeRecyclerView.setSwipeMenuItemClickListener(mMenuItemClickListener);

        // 新增介面卡
        swipeRecyclerView.setAdapter(adapter);
完整程式碼

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="red_normal">#FF0000</color>
    <color name="red_pressed">#FF6666</color>
    <color name="green_normal">#37C000</color>
    <color name="green_pressed">#30A070</color
</resources>

dimens.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="dp_200">200dp</dimen>
    <dimen name="dp_100">100dp</dimen>
    <dimen name="dp_70">70dp</dimen>
    <dimen name="dp_10">10dp</dimen>
    <dimen name="dp_2">2dp</dimen>
</resources>

recyclerview_demo_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?selectableItemBackground"
    android:gravity="center_vertical"
    android:minHeight="@dimen/dp_70"
    android:padding="@dimen/dp_10">

    <TextView
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:text="Testing"/>

</LinearLayout>

RecycleDemoAdapter.java


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.TextView;
import android.widget.Toast;

import java.util.List;

public class RecycleDemoAdapter extends RecyclerView.Adapter<RecycleDemoAdapter.MyHolder> {

    private Context context;   // 方便檢視的操作
    private List<String> list;
    public  RecycleDemoAdapter(Context context,List<String> list)
    {
        this.context = context;
        this.list = list;
    }

    //
//    public void update(List<String> list)
//    {
//        this.list = list;
//        notifyDataSetChanged();
//    }
    // 獲取 item 的佈局
    @NonNull
    @Override
    public MyHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recyclerview_demo_item,viewGroup,false);
        MyHolder myHolder = new MyHolder(view);
        return myHolder;
    }
    @Override
    public int getItemCount() {
        return list.size();
    }

    // 繫結類
    public class MyHolder extends RecyclerView.ViewHolder {
        TextView textView;
        public MyHolder(@NonNull View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.name);
        }
    }
    //   實際繫結 item 操作
    @Override
    public void onBindViewHolder(@NonNull MyHolder myHolder, final int position) {
        String s = list.get(position);
        myHolder.textView.setText(s);
//        myHolder.textView.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                Toast.makeText(context, "點選了:"+list.get(position), Toast.LENGTH_SHORT).show();
//            }
//        });
    }

}

ic_action_delete.png(PS:這裡是有圖片的) 在這裡插入圖片描述

MainActivity.java


import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;
import android.widget.Toast;

import com.yanzhenjie.recyclerview.swipe.SwipeMenu;
import com.yanzhenjie.recyclerview.swipe.SwipeMenuBridge;
import com.yanzhenjie.recyclerview.swipe.SwipeMenuCreator;
import com.yanzhenjie.recyclerview.swipe.SwipeMenuItem;
import com.yanzhenjie.recyclerview.swipe.SwipeMenuItemClickListener;
import com.yanzhenjie.recyclerview.swipe.SwipeMenuRecyclerView;

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

public class MainActivity extends AppCompatActivity {

    private SwipeMenuRecyclerView swipeRecyclerView;
    private List<String> list = new ArrayList<>();
    private RecyclerView.Adapter adapter;
    private LinearLayoutManager layoutManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        loadCH();
    }

    private void loadCH() {

        swipeRecyclerView = findViewById(R.id.swipeRecyclerView);
//// 向list 裡新增資料
        addData();
        adapter = new RecycleDemoAdapter(this, list);
        //        設定 recyclerView 的 佈局管理器
//        就是 recyclerview 的顯示效果
        layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        swipeRecyclerView.setLayoutManager(layoutManager);

        // 建立選單:
        SwipeMenuCreator mSwipeMenuCreator = new SwipeMenuCreator() {
            @Override
            public void onCreateMenu(SwipeMenu leftMenu, SwipeMenu rightMenu, int viewType) {

                int width = getResources().getDimensionPixelOffset(R.dimen.dp_100);
                int height = ViewGroup.LayoutParams.MATCH_PARENT;
                // 注意:哪邊不想要選單,那麼不要新增即可。
                SwipeMenuItem addItem = new SwipeMenuItem(MainActivity.this)
                        .setBackground(R.drawable.selector_green)
                        .setImage(R.mipmap.ic_action_delete)
                        .setText("新增")
                        .setTextColor(Color.WHITE)
                        .setWidth(width)
                        .setHeight(height);
                rightMenu.addMenuItem(addItem); // 新增選單到右側。
            }
        };
// 設定監聽器。
        swipeRecyclerView.setSwipeMenuCreator(mSwipeMenuCreator);

        SwipeMenuItemClickListener mMenuItemClickListener = new SwipeMenuItemClickListener() {
            @Override
            public void onItemClick(SwipeMenuBridge menuBridge) {
                // 任何操作必須先關閉選單,否則可能出現Item選單開啟狀態錯亂。
                menuBridge.closeMenu();
                int direction = menuBridge.getDirection(); // 左側還是右側選單。
                int adapterPosition = menuBridge.getAdapterPosition(); // RecyclerView的Item的position。
                int menuPosition = menuBridge.getPosition(); // 選單在RecyclerView的Item中的Position。
                Toast.makeText(MainActivity.this, direction + " " + adapterPosition + " " + menuPosition, Toast.LENGTH_SHORT).show();
            }
        };

        // 選單點選監聽。
        swipeRecyclerView.setSwipeMenuItemClickListener(mMenuItemClickListener);

        // 新增介面卡
        swipeRecyclerView.setAdapter(adapter);
    }

    private void addData() {
        for (int i = 0; i < 100; i++) {
            list.add("開心:" + i);
        }

    }

}