1. 程式人生 > >Android RecyclerView通用Adapter及item拖拽、滑動刪除

Android RecyclerView通用Adapter及item拖拽、滑動刪除

package test.gzy.qqtest.RecyclerView; import android.app.Service; import android.graphics.Color; import android.os.Bundle; import android.os.Vibrator; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.helper.ItemTouchHelper; import android.widget.TextView; import java.util.ArrayList; import java.util.Collections; import test.gzy.qqtest.Utils.Adapter.BaseViewHolder;
import test.gzy.qqtest.Utils.Adapter.NormalAdapter; import test.gzy.qqtest.Utils.OnListener.OnRecyclerItemClickListener; import test.gzy.qqtest.R; /** * Created by GZY on 16/5/18. */ public class RecyclerViewTestActivity extends AppCompatActivity { public RecyclerView recyclerView; public ArrayList<String> lists
; public String[] datas = new String[]{"蘋果", "橘子", "西瓜", "香蕉", "橘子", "西瓜", "香蕉", "橘子", "西瓜", "香蕉", "橘子", "西瓜", "香蕉", "橘子", "西瓜", "香蕉", "橘子", "西瓜", "香蕉", "橘子", "西瓜", "香蕉"}; public NormalAdapter adapter; public ItemTouchHelper itemTouchHelper; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recycler_test); initView(); initData(); setRecyclerView(); } public void initView() { recyclerView = (RecyclerView) findViewById(R.id.recycler_view); } public void initData() { lists = new ArrayList<>(); for (int i = 0; i < datas.length; i++) { lists.add(datas[i]); } } public void setRecyclerView() { LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); linearLayoutManager.setAutoMeasureEnabled(true); recyclerView.setLayoutManager(linearLayoutManager); adapter = new NormalAdapter(lists, R.layout.item_recyclerviewtest) { @Override protected void onBindView(BaseViewHolder holder, int position) { TextView textView = holder.getView(R.id.item_recycler_tv); textView.setText(lists.get(position)); } }; // //第一種Item點選事件 // adapter.setOnItemClickListener(new OnItemClickListener() { // @Override // public void onItemClick(int position) { // Snackbar.make(recyclerView, position + "", Snackbar.LENGTH_SHORT).show(); // } // }); recyclerView.setAdapter(adapter); //第二種Item點選事件 recyclerView.addOnItemTouchListener(new OnRecyclerItemClickListener(recyclerView) { @Override public void onItemClick(RecyclerView.ViewHolder vh) { Snackbar.make(recyclerView, vh.getLayoutPosition() + "", Snackbar.LENGTH_SHORT).show(); } @Override public void onLongClick(RecyclerView.ViewHolder vh) { //如果item不是最後一個,則執行拖拽 if (vh.getLayoutPosition() != lists.size() - 1) { itemTouchHelper.startDrag(vh); } } }); /** * 拖拽 */ // ItemTouchHelper會在拖拽的時候回撥Callback中相應的方法,我們只需在Callback中實現自己的邏輯就可以了。 itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() { //ItemTouchHelper會在拖拽的時候回撥Callback中相應的方法,我們只需在Callback中實現自己的邏輯就可以了。 @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { final int dragFlags; final int swipeFlags; if (recyclerView.getLayoutManager() instanceof GridLayoutManager) { dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; swipeFlags = 0; } else { dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; //注意⚠當設定了滑動刪除時要換成下面那句 // swipeFlags = 0; swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END; } //獲取系統震動服務 Vibrator vib = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE); // 震動70毫秒 vib.vibrate(70); return makeMovementFlags(dragFlags, swipeFlags); } //dragFlags 是拖拽標誌,swipeFlags是滑動標誌,我們把swipeFlags 都設定為0,暫時不考慮滑動相關操作。 /** * 滑動 * @param recyclerView * @param viewHolder * @param target * @return */ //如果我們設定了相關的dragFlags,那麼當我們長按item的時候就會進入拖拽並在拖拽過程中不斷回撥onMove()方法, // 我們就在這個方法裡獲取當前拖拽的item和已經被拖拽到所處位置的item的ViewHolder,有了這2個ViewHolder, // 我們就可以交換他們的資料集並呼叫Adapter的notifyItemMoved方法來重新整理item。 @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { //得到拖動的 ViewHolder的Position int fromPosition = viewHolder.getAdapterPosition(); //得到目標ViewHolder的position int toPosition = target.getAdapterPosition(); if (fromPosition < toPosition) { for (int i = fromPosition; i < toPosition; i++) { Collections.swap(lists, i, i + 1);//改變實際的資料集 } } else { for (int i = fromPosition; i > toPosition; i--) { Collections.swap(lists, i, i - 1);//改變實際的資料集 } } adapter.notifyItemMoved(fromPosition, toPosition); return true; } /** * 側滑刪除 * @param viewHolder * @param direction */ @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { int position = viewHolder.getAdapterPosition(); adapter.notifyItemRemoved(position); lists.remove(position); } /** * 高亮 * @param viewHolder * @param actionState */ //到這裡,已經可以拖拽了,基本的效果如下: //但是拖拽的時候我們拖拽的物件不能高亮顯示,這是不友好的,我們希望拖拽的Item在拖拽的過程中背景顏色加深,這樣就需要繼續重寫下面兩個方法: @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { viewHolder.itemView.setBackgroundColor(Color.LTGRAY); } super.onSelectedChanged(viewHolder, actionState); } @Override public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { super.clearView(recyclerView, viewHolder); viewHolder.itemView.setBackgroundColor(0); } //OK,這樣就完成了Item的拖拽排序,簡單看下現在的效果: /** * 設定每個item不可以被點選 */ @Override public boolean isLongPressDragEnabled() { return false; } }); itemTouchHelper.attachToRecyclerView(recyclerView); } }

相關推薦

Android RecyclerView通用Adapteritem滑動刪除

package test.gzy.qqtest.RecyclerView; import android.app.Service; import android.graphics.Color; import android.os.Bundle; import android.os.Vibrator; impo

RecycleView裡面的item滑動刪除

找到一個寫的很好的: RecyclerView進階:使用ItemTouchHelper實現拖拽和側滑刪除 注: 滑動刪除的時候,注意不要下標越界: public void onItemDelete(int position) { if (data.size() &g

RecyclerView通用adapter以及item點選事件的實現

  今天實現內容如下: 1.實現recyclerview通用的adapter CommonAdapter 2.實現recyclerview item的點選事件 先上效果圖 viewpager+f

Android開發學習之ImageView手勢縮放旋轉

           在Android應用中,圖片隨手勢的拖拽、縮放、旋轉在很多場景中都會用到,今天我們要做的就是在ImageView的基礎上實現一個可以拖拽、縮放、轉轉的TouchView。              一、實現原理              OnTouc

RecyclerView借助ItemTouchHelper實現動和滑動刪除功能

enable all istview aslist mar -- main erl pub RecyclerView是官方推薦代替ListView的空間,怎樣實現RecyclerView列表元素的拖動呢? 官方提供了ItemTouchHelper類使用過程例如以下

Android開發之RecyclerView的互動動畫(實現刪除)

做RecyclerView做相關的動畫效果的時候,用的最多的是v7包下的ItemTouchHelper類,這個類很強大,如有興趣的童鞋可以自行翻看原始碼,接下來我帶領大家實現RecyclerView相關的互動動畫。大家看下面的效果(拖拽和刪除): ------------

Android RecyclerView StaggeredGridLayoutManager瀑布流item位置變換問題解決

瀑布流 位置變換網上一搜一堆 全是一下這種方法,然而還是會有問題 manager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE); //防止item 交換位置 recyclerView.addOnScrollList

RecyclerView 通用Adapter通用ViewHolder

背景 在使用RecyclerView時,經常需要針對特定的頁面寫viewHolder,相當繁瑣。後來看到專案中採用了統一通用的viewHolder,使用相當簡單。為了更加通用,對原有程式碼進行了抽象簡化,做成了一個依賴庫,直接呼叫即可。 先上效果圖: 開原始碼地址(一共

Android recyclerview 多個佈局 item資料錯亂

這個問題困擾了兩三天,recyclerview在採用多種佈局的情況下,在onBindViewHolder繫結的時候會,會將不會顯示的佈局用View.GONE隱藏起來,看似沒有問題!但是上下滑動的時候會發生item顯示錯亂! 原本的item資料顯示,在滑動幾次後,顯示條數只剩下幾條 走了

Android中ListView元件的Item動(Item改變順序)

1. 引言      此文章介紹如何實現拖動ListView元件的Item,改變Item的位置。效果圖及實現如下。 2. 效果圖     (1) 拖動下圖中每一項左邊的把手,上下移動,鬆開時就會改變Item的順序。               (2) 拖動過程,如下圖

優雅的在通用Adapteritem內部控制元件監聽事件

很多人對鴻洋大神的通用Adapter感興趣,通用Adapter提供了全新的繫結控制元件思路,為開發節省了不必要的程式碼,需求中需要做item內部控制元件監聽點選事件如何做,正常的我們需要在Adapter中 直接設定就可以了,使用了通用的Adapter你可以這樣做

Android RecyclerView瀑布流中Item寬度異常的問題(原始碼分析)

問題描述 通過RecyclerView配合StaggeredGridLayoutManager可以很方便的實現瀑布流效果,一般情況下會把作為Item的子View寬度設定為MATCH_PARENT,那麼子View將根據列數(假定是垂直排列)平均分配Recycle

Android RecyclerView滾動定位到item,並使其置頂

/**準確定位到指定位置,並且將指定位置的item置頂, 若直接呼叫scrollToPosition(...)方法,則不會置頂。**/

Android Instrumentation 模擬點選傳送keycode焦點異常丟失。

Instrumentation模擬點選,拖拽,向系統傳送keycode。 需要注意的幾點: Android系統座標系,X軸正方向為右,Y軸正方向為下(與數學座標系相反) 所有事件在傳送時均需要在Thread中執行,否則會報異常。 模擬輸入法種特殊

Android 使用變形矩陣實現可以,縮放,旋轉的影象

上篇博文介紹了變形矩陣的一些用法,所以這篇博文就結合變形矩陣來實現一個可以拖拽、縮放、旋轉的影象吧。 首先,我們就繼承ImageView來實現我們的自定義View。 程式碼如下: public class MyMatrixImg extends Ima

Android自定義View實現圖片顯示,並實現縮放切換功能

這裡貼三個檔案的原始碼,第一個是main.java package com.example.test; import java.util.ArrayList; import java.util.List; import com.example.test.MyXZ; i

Android RecyclerView通用介面卡,支援HeaderFooterLoadMoreEmptyView等功能

前言 RecyclerView已經發布很久了,高度的解耦性和靈活的定製性使得其一經發布就廣受好評,但在使用過程中會發現,編寫介面卡的程式碼量貌似有點多,而且不支援新增HeaderView、FooterView等功能,甚至連Item點選監聽都沒有,這當然是不能忍

js仿百度地圖縮放添加圖層功能(原創)

ets tle clas 火狐 相對 inner tlist posit css 最近項目中完成的需求,仿百度地圖中的功能: 要求:1.底層圖可以拖拽、縮放。    2.拖拽一個圖標,在底層圖上對應位置添加一個標註點,該標註點位置要隨底層圖移動。    3.添加的標註

基於svg.js實現對圖形的選擇和編輯操作

鼠標移出 strong lse 方便 jquery cap .cn sta plot 本文主要記錄如何使用 svg.js 實現對圖形的拖拽,選擇,圖像渲染及各類形狀的繪制操作。 1、關於SVG SVG 是可縮放的矢量圖形,使用XML格式定義圖像,可以生成對應的DOM節點,便

js仿百度地圖縮放新增圖層功能(原創)

最近專案中完成的需求,仿百度地圖中的功能: 要求:1.底層圖可以拖拽、縮放。       2.拖拽一個圖示,在底層圖上對應位置新增一個標註點,該標註點位置要隨底層圖移動。    3.新增的標註點,可以拖動,刪除。 主要知識點和難點就是各個瀏覽器的點選、拖拽、縮放事件相容性,對js運動屬性、運動偏移位置的瞭解,