最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android使用RecycleView實現(xiàn)拖拽交換item位置

 更新時間:2020年05月21日 11:45:36   作者:mChenys  
這篇文章主要為大家詳細介紹了Android使用RecycleView實現(xiàn)拖拽交換item位置,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了RecycleView實現(xiàn)拖拽交換item位置的具體代碼,供大家參考,具體內容如下

老規(guī)矩,先來一張效果圖:

相比起ListView而言,RecycleView實現(xiàn)拖拽交換位置的效果要簡單很多,因為通過SDK中的ItemTouchHelper工具類可以輕松的實現(xiàn)這種效果,并且一套代碼支持所有布局方式;而ListView的話則需要通過生成View的緩存鏡像設置到ImageView中,然后通過WindowManager來操作該ImageView,具體怎么實現(xiàn)這里就不展開講解了.回歸到ItemTouchHelper話題上,這個工具類我們需要關心的方法只有一個,即:

public void attachToRecyclerView(@Nullable RecyclerView recyclerView) {}

通過名字也可以知道其作用就是和RecyclerView 建立關系.
而我們真正需要關心的地方就是ItemTouchHelper的內部類ItemTouchHelper.Callback,它是一個抽象類,需要我們去實現(xiàn)下面這幾個關鍵的抽象方法以及重寫幾個非抽象的方法:

//決定拖拽/滑動的方向
public abstract int getMovementFlags(RecyclerView recyclerView,
    ViewHolder viewHolder);

//和位置交換有關,可用于實現(xiàn)drag功能
public abstract boolean onMove(RecyclerView recyclerView,
    ViewHolder viewHolder, ViewHolder target);

//和滑動有關,可用于實現(xiàn)swipe功能
public abstract void onSwiped(ViewHolder viewHolder, int direction);

//是否長按啟用拖拽功能,默認是true
public boolean isLongPressDragEnabled() {return true;}

//是否支持滑動,默認true
public boolean isItemViewSwipeEnabled() {return true;}

//和目標View的狀態(tài)改變有關,例如drag,swipe,ide
public void onSelectedChanged(ViewHolder viewHolder, int actionState) {}

//和移除View的狀態(tài)有關,通常用于清除在onSelectedChanged,onChildDraw中對View設置的動畫
public void clearView(RecyclerView recyclerView, ViewHolder viewHolder) {}

當創(chuàng)建完ItemTouchHelper.Callback的實現(xiàn)類,我這里稱之為SimpleItemTouchHelperCallback后,還需要將數(shù)據的變化以及View的狀態(tài)通知到RecycleView的Adapter中,為了達到解耦的目的,通??梢酝ㄟ^定義接口來實現(xiàn),在SimpleItemTouchHelperCallback的構造方法中傳入該解耦接口的引用,并讓RecycleView的Adapter實現(xiàn)該解耦的接口,這樣就實現(xiàn)了這2個類的通信問題了.

來看看我定義的解耦接口:

/**
 * 定義RecycleView的Adapter和SimpleItemTouchHelperCallback直接交互的接口方法
 * Created by mChenys on 2017/2/16.
 */
public interface ItemTouchHelperAdapter {

 //數(shù)據交換
 void onItemMove(RecyclerView.ViewHolder source, RecyclerView.ViewHolder target);

 //數(shù)據刪除
 void onItemDissmiss(RecyclerView.ViewHolder source);

 //drag或者swipe選中
 void onItemSelect(RecyclerView.ViewHolder source);

 //狀態(tài)清除
 void onItemClear(RecyclerView.ViewHolder source);
}

完整的SimpleItemTouchHelperCallback代碼如下:

/**
 * 處理RecycleView的選中,拖拽移動,拖拽刪除的實現(xiàn)類
 * Created by mChenys on 2017/2/16.
 */
public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback {

 private ItemTouchHelperAdapter mAdapter;

 public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter) {
  mAdapter = adapter;
 }

 @Override
 public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
  //int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; //允許上下的拖動
  //int dragFlags =ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; //允許左右的拖動
  //int swipeFlags = ItemTouchHelper.LEFT; //只允許從右向左側滑
  //int swipeFlags = ItemTouchHelper.DOWN; //只允許從上向下側滑
  //一般使用makeMovementFlags(int,int)或makeFlag(int, int)來構造我們的返回值
  //makeMovementFlags(dragFlags, swipeFlags)

  int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; //允許上下左右的拖動
  return makeMovementFlags(dragFlags, 0);
 }

 @Override
 public boolean isLongPressDragEnabled() {
  return true;//長按啟用拖拽
 }

 @Override
 public boolean isItemViewSwipeEnabled() {
  return false; //不啟用拖拽刪除
 }

 @Override
 public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) {
  //通過接口傳遞拖拽交換數(shù)據的起始位置和目標位置的ViewHolder
  mAdapter.onItemMove(source, target);
  return true;
 }


 @Override
 public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
  //移動刪除回調,如果不用可以不用理
  // mAdapter.onItemDissmiss(viewHolder);
 }

 @Override
 public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
  super.onSelectedChanged(viewHolder, actionState);
  if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
   //當滑動或者拖拽view的時候通過接口返回該ViewHolder
   mAdapter.onItemSelect(viewHolder);
  }
 }

 @Override
 public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
  super.clearView(recyclerView, viewHolder);
  if (!recyclerView.isComputingLayout()) {
   //當需要清除之前在onSelectedChanged或者onChildDraw,onChildDrawOver設置的狀態(tài)或者動畫時通過接口返回該ViewHolder
   mAdapter.onItemClear(viewHolder);
  }
 }
}

RecycleView.Adapter實現(xiàn)類代碼

/**
 * Created by mChenys on 2017/2/15.
 */
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> implements ItemTouchHelperAdapter {
 ...

 @Override
 public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  ...
 }

 @Override
 public void onBindViewHolder(final MyAdapter.MyViewHolder holder, int position) {
  ...
 }

 @Override
 public int getItemCount() {
  //注意:這里最少有一個,因為有多了一個添加按鈕
  return null == mData ? 1 : mData.size() + 1;
 }

 @Override
 public void onItemMove(RecyclerView.ViewHolder source,
  RecyclerView.ViewHolder target) {
  int fromPosition = source.getAdapterPosition();
  int toPosition = target.getAdapterPosition();
  if (fromPosition < mData.size() && toPosition < mData.size()) {
   //交換數(shù)據位置
   Collections.swap(mData, fromPosition, toPosition);
   //刷新位置交換
   notifyItemMoved(fromPosition, toPosition);
  }
  //移動過程中移除view的放大效果
  onItemClear(source);
 }

 @Override
 public void onItemDissmiss(RecyclerView.ViewHolder source) {

  int position = source.getAdapterPosition();
  mData.remove(position); //移除數(shù)據
  notifyItemRemoved(position);//刷新數(shù)據移除
 }

 @Override
 public void onItemSelect(RecyclerView.ViewHolder viewHolder) {

  //當拖拽選中時放大選中的view
  viewHolder.itemView.setScaleX(1.2f);
  viewHolder.itemView.setScaleY(1.2f);
 }

 @Override
 public void onItemClear(RecyclerView.ViewHolder viewHolder) {

  //拖拽結束后恢復view的狀態(tài)
  viewHolder.itemView.setScaleX(1.0f);
  viewHolder.itemView.setScaleY(1.0f);
 }

 public class MyViewHolder extends RecyclerView.ViewHolder {
  ...

  public MyViewHolder(View itemView) {
   super(itemView);
   ...
  }
 }

}

MainActivity的使用方式

/**
 * Created by mChenys on 2017/2/16.
 */
public class MainActivity extends AppCompatActivity {
 ...
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  ...
  mRecyclerView = (RecyclerView) findViewById(R.id.recycleView);
  //創(chuàng)建adapter
  MyAdapter myAdapter = new MyAdapter(this, mData);
  //設置默認的布局方式
  mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
  //設置adapter
  mRecyclerView.setAdapter(myAdapter);
  //創(chuàng)建SimpleItemTouchHelperCallback
  ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallback(myAdapter);
  //用Callback構造ItemtouchHelper
  ItemTouchHelper touchHelper = new ItemTouchHelper(callback); 
  //調用ItemTouchHelper的attachToRecyclerView方法建立聯(lián)系
  touchHelper.attachToRecyclerView(mRecyclerView);
 }



 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  ...
  return super.onCreateOptionsMenu(menu);
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  ...
  return super.onOptionsItemSelected(item);
 }

}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android 嵌套Fragment的使用實例代碼

    Android 嵌套Fragment的使用實例代碼

    本文主要介紹Android Fragment,在這里提供了實例代碼跟效果圖,希望能幫助有需要的小伙伴
    2016-07-07
  • Android Service自啟動注意事項分析

    Android Service自啟動注意事項分析

    這篇文章主要介紹了Android Service自啟動注意事項,結合實例分析了Android Service自啟動過程中屬性設置的相關技巧,需要的朋友可以參考下
    2016-03-03
  • Android架構發(fā)展進化詳解

    Android架構發(fā)展進化詳解

    Android系統(tǒng)架構從上到下分為五層:應用層、應用框架層、系統(tǒng)運行庫層、硬件抽象層、Linux內核層,Android架構也經歷了多次演進,下面我們來詳細了解一下
    2022-08-08
  • Android 在 res/layout 文件夾 下創(chuàng)建一個 子文件夾實例

    Android 在 res/layout 文件夾 下創(chuàng)建一個 子文件夾實例

    這篇文章主要介紹了Android 在 res/layout 文件夾 下創(chuàng)建一個 子文件夾實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Android adb命令中pm工具的作用及用法說明

    Android adb命令中pm工具的作用及用法說明

    這篇文章主要介紹了Android adb命令中pm工具的作用及用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 創(chuàng)建子線程對Android進行網絡訪問

    創(chuàng)建子線程對Android進行網絡訪問

    這篇文章介紹了Android中創(chuàng)建子線程進行網絡訪問的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考
    2021-11-11
  • Android中ListView的item點擊沒有反應的解決方法

    Android中ListView的item點擊沒有反應的解決方法

    這篇文章主要介紹了Android中ListView的item點擊沒有反應的相關資料,需要的朋友可以參考下
    2017-10-10
  • Kotlin Job啟動流程源碼層深入分析

    Kotlin Job啟動流程源碼層深入分析

    如果要我拿現(xiàn)實中的一事物與Kotlin協(xié)程中的Job做一個類比,那么我會把Job比作成海洋中的冰山。自由漂浮的冰山約有90%體積沉在海水表面下,因此看著浮在水面上的形狀并猜不出水下的形狀
    2022-11-11
  • android studio實現(xiàn)簡單的計算器功能

    android studio實現(xiàn)簡單的計算器功能

    這篇文章主要為大家詳細介紹了android studio實現(xiàn)簡單的計算器功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Android 仿蘋果底部彈出Dialog

    Android 仿蘋果底部彈出Dialog

    這篇文章主要介紹了Android 仿蘋果底部彈出Dialog的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-12-12

最新評論

凤阳县| 兴安县| 静乐县| 木里| 宁明县| 甘南县| 磐安县| 石城县| 罗山县| 犍为县| 柳江县| 南漳县| 马山县| 安溪县| 新疆| 富顺县| 宁强县| 贵州省| 西平县| 宝应县| 炉霍县| 鄄城县| 禄劝| 洛扎县| 舞钢市| 巩留县| 遂溪县| 视频| 黔西县| 怀柔区| 达州市| 突泉县| 枣庄市| 岗巴县| 嵊州市| 梓潼县| 彩票| 信丰县| 平南县| 尼勒克县| 金川县|