欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

RecyclerView實現(xiàn)拖拽排序效果

 更新時間:2018年06月05日 08:29:18   作者:崔晨博  
這篇文章主要為大家詳細介紹了RecyclerView實現(xiàn)拖拽排序效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下

效果就是這樣,RecyclerView列表可拖拽排序,可刪除,可添加;

RecyclerView給我們提供了一個手勢器:

ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.Callback() { 
  @Override 
  public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 
   int dragFrlg = 0; 
   if (recyclerView.getLayoutManager() instanceof GridLayoutManager){ 
    dragFrlg = ItemTouchHelper.UP|ItemTouchHelper.DOWN|ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT; 
   }else if(recyclerView.getLayoutManager() instanceof LinearLayoutManager){ 
    dragFrlg = ItemTouchHelper.UP|ItemTouchHelper.DOWN; 
   } 
   return makeMovementFlags(dragFrlg,0); 
  } 
 
  @Override 
  public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { 
   //滑動事件 下面注釋的代碼,滑動后數(shù)據(jù)和條目錯亂,被舍棄 
//   Collections.swap(datas,viewHolder.getAdapterPosition(),target.getAdapterPosition()); 
//   ap.notifyItemMoved(viewHolder.getAdapterPosition(),target.getAdapterPosition()); 
 
   //得到當拖拽的viewHolder的Position 
   int fromPosition = viewHolder.getAdapterPosition(); 
   //拿到當前拖拽到的item的viewHolder 
   int toPosition = target.getAdapterPosition(); 
   if (fromPosition < toPosition) { 
    for (int i = fromPosition; i < toPosition; i++) { 
     Collections.swap(datas, i, i + 1); 
    } 
   } else { 
    for (int i = fromPosition; i > toPosition; i--) { 
     Collections.swap(datas, i, i - 1); 
    } 
   } 
   ap.notifyItemMoved(fromPosition, toPosition); 
   return true; 
  } 
 
  @Override 
  public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { 
    //側(cè)滑刪除可以使用; 
  } 
 
  @Override 
  public boolean isLongPressDragEnabled() { 
   return true; 
  } 
  /** 
   * 長按選中Item的時候開始調(diào)用 
   * 長按高亮 
   * @param viewHolder 
   * @param actionState 
   */ 
  @Override 
  public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { 
   if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { 
    viewHolder.itemView.setBackgroundColor(Color.RED); 
    //獲取系統(tǒng)震動服務(wù)//震動70毫秒 
    Vibrator vib = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE); 
    vib.vibrate(70); 
   } 
   super.onSelectedChanged(viewHolder, actionState); 
  } 
 
  /** 
   * 手指松開的時候還原高亮 
   * @param recyclerView 
   * @param viewHolder 
   */ 
  @Override 
  public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 
   super.clearView(recyclerView, viewHolder); 
   viewHolder.itemView.setBackgroundColor(0); 
   ap.notifyDataSetChanged(); //完成拖動后刷新適配器,這樣拖動后刪除就不會錯亂 
  } 
 }); 

設(shè)置給RecyclerView即可:

helper.attachToRecyclerView(rv); 

下面是完整的代碼和Xml布局文件:

public class MainActivity extends AppCompatActivity implements View.OnClickListener { 
 private final String TAG = this.getClass().getSimpleName(); 
 private List<String> d = Arrays.asList( 
   "A","B","C","D","E","F","G" 
   ,"H","I","J","K","L","M","N" 
   ,"O","P","Q","R","S","T" 
   ,"U","V","W","X","Y","Z"); 
 private RecyclerView rv ; 
 private Ap<String> ap; 
 private List<String> datas; 
 private EditText edAdd; 
 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.activity_main); 
  initData(); 
  rv = findViewById(R.id.rv); 
  edAdd =findViewById(R.id.et_add); 
  rv.setLayoutManager(new GridLayoutManager(this,3)); 
//  rv.setLayoutManager(new LinearLayoutManager(this)); 
  ap = new Ap(this, datas); 
  rv.setAdapter(ap); 
  helper.attachToRecyclerView(rv); 
  findViewById(R.id.tv).setOnClickListener(this); 
  findViewById(R.id.tv_add).setOnClickListener(this); 
 } 
 
 private void initData() { 
  datas = new ArrayList<>(); 
//  直接用d操作集合會崩潰,Arrays.asList集合不可增刪改;詳細可以看我的博客 
  for (int i = 0; i < d.size(); i++) { 
   datas.add(d.get(i)); 
  } 
 } 
 
 @Override 
 public void onClick(View view) { 
  switch (view.getId()){ 
   case R.id.tv: 
    for (int i = 0; i < datas.size(); i++) { 
     Log.i(TAG, "onClick: ____"+datas.get(i)); 
    } 
    break; 
   case R.id.tv_add: 
    ap.add(edAdd.getText().toString().trim()); 
    edAdd.setText(null); 
    break; 
  } 
 } 
 
 
 class Ap<T> extends RecyclerView.Adapter<Ap.Vh>{ 
  private Context context; 
  public List<T> stringList; 
  public Ap(Context context, List<T> stringList) { 
   this.context = context; 
   this.stringList = stringList; 
  } 
 
  @Override 
  public Ap.Vh onCreateViewHolder(ViewGroup parent, int viewType) { 
   return new Vh(LayoutInflater.from(context).inflate(R.layout.item_rv,null)); 
  } 
 
  @Override 
  public void onBindViewHolder(Ap.Vh holder, final int position) { 
   holder.tv.setText(stringList.get(position).toString()); 
   holder.iv.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     remove(position); 
    } 
   }); 
  } 
 
  @Override 
  public int getItemCount() { 
   return stringList.size(); 
  } 
 
  public void add(T item){ 
   int position = stringList.size(); 
   stringList.add(item); 
   notifyItemInserted(position); 
  } 
 
  public void add(int position,T item){ 
   stringList.add(position,item); 
   notifyItemInserted(position); 
  } 
//  public void remove(T item) { 
//   final int position = stringList.indexOf(item); 
//   if (-1 == position) 
//    return; 
//   stringList.remove(item); 
//   notifyItemRemoved(position); 
//  } 
 
  public void remove(int position) { 
   stringList.remove(position); 
   notifyItemRemoved(position); 
   notifyItemRangeChanged(position,stringList.size()); 
  } 
 
  class Vh extends RecyclerView.ViewHolder { 
 
   public Vh(View itemView) { 
    super(itemView); 
    tv = itemView.findViewById(R.id.tv); 
    iv = itemView.findViewById(R.id.iv_delete); 
   } 
   public TextView tv; 
   public ImageView iv; 
  } 
 } 

 ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.Callback() { 
  @Override 
  public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 
   int dragFrlg = 0; 
   if (recyclerView.getLayoutManager() instanceof GridLayoutManager){ 
    dragFrlg = ItemTouchHelper.UP|ItemTouchHelper.DOWN|ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT; 
   }else if(recyclerView.getLayoutManager() instanceof LinearLayoutManager){ 
    dragFrlg = ItemTouchHelper.UP|ItemTouchHelper.DOWN; 
   } 
   return makeMovementFlags(dragFrlg,0); 
  } 
 
  @Override 
  public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { 
   //滑動事件 下面注釋的代碼,滑動后數(shù)據(jù)和條目錯亂,被舍棄 
//   Collections.swap(datas,viewHolder.getAdapterPosition(),target.getAdapterPosition()); 
//   ap.notifyItemMoved(viewHolder.getAdapterPosition(),target.getAdapterPosition()); 
 
   //得到當拖拽的viewHolder的Position 
   int fromPosition = viewHolder.getAdapterPosition(); 
   //拿到當前拖拽到的item的viewHolder 
   int toPosition = target.getAdapterPosition(); 
   if (fromPosition < toPosition) { 
    for (int i = fromPosition; i < toPosition; i++) { 
     Collections.swap(datas, i, i + 1); 
    } 
   } else { 
    for (int i = fromPosition; i > toPosition; i--) { 
     Collections.swap(datas, i, i - 1); 
    } 
   } 
   ap.notifyItemMoved(fromPosition, toPosition); 
   return true; 
  } 
 
  @Override 
  public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { 
    //側(cè)滑刪除可以使用; 
  } 
 
  @Override 
  public boolean isLongPressDragEnabled() { 
   return true; 
  } 
  /** 
   * 長按選中Item的時候開始調(diào)用 
   * 長按高亮 
   * @param viewHolder 
   * @param actionState 
   */ 
  @Override 
  public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { 
   if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { 
    viewHolder.itemView.setBackgroundColor(Color.RED); 
    //獲取系統(tǒng)震動服務(wù)//震動70毫秒 
    Vibrator vib = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE); 
    vib.vibrate(70); 
   } 
   super.onSelectedChanged(viewHolder, actionState); 
  } 
 
  /** 
   * 手指松開的時候還原高亮 
   * @param recyclerView 
   * @param viewHolder 
   */ 
  @Override 
  public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 
   super.clearView(recyclerView, viewHolder); 
   viewHolder.itemView.setBackgroundColor(0); 
   ap.notifyDataSetChanged(); //完成拖動后刷新適配器,這樣拖動后刪除就不會錯亂 
  } 
 }); 
} 

Xml布局文件:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 xmlns:app="http://schemas.android.com/apk/res-auto" 
 xmlns:tools="http://schemas.android.com/tools" 
 android:layout_width="match_parent" 
 android:layout_height="match_parent" 
 tools:context="com.ccb.pactera.dragrecyclerviewdemo.MainActivity"> 
 
 <LinearLayout 
  android:id="@+id/ll" 
  android:background="#eeeeee" 
  android:orientation="horizontal" 
  android:layout_width="match_parent" 
  android:layout_height="48dp"> 
  <TextView 
   android:layout_width="0dp" 
   android:layout_weight="1" 
   android:layout_height="48dp" 
   android:id="@+id/tv" 
   android:text="查看數(shù)據(jù)" 
   android:textColor="#fff" 
   android:textSize="16dp" 
   android:gravity="center" 
   android:background="@color/colorAccent" 
   /> 
  <EditText 
   android:id="@+id/et_add" 
   android:layout_width="0dp" 
   android:layout_height="match_parent" 
   android:layout_weight="1"/> 
  <TextView 
   android:layout_width="0dp" 
   android:layout_weight="1" 
   android:layout_height="48dp" 
   android:id="@+id/tv_add" 
   android:text="添加數(shù)據(jù)" 
   android:textColor="#fff" 
   android:textSize="16dp" 
   android:gravity="center" 
   android:background="#fc1" 
   /> 
 </LinearLayout> 
 <android.support.v7.widget.RecyclerView 
  android:id="@+id/rv" 
  android:layout_below="@id/ll" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" /> 
 
</RelativeLayout> 

RecyclerView的Item:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 android:layout_width="match_parent" 
 android:background="#f1f1f1" 
 android:layout_height="match_parent"> 
 <RelativeLayout 
  android:layout_width="match_parent" 
  android:background="#fff" 
  android:layout_margin="0.5dp" 
  android:layout_height="match_parent"> 
 <ImageView 
  android:layout_width="match_parent" 
  android:layout_height="50dp" 
  android:src="@mipmap/icon" 
  android:id="@+id/iv" 
  android:layout_marginTop="10dp" 
  /> 
<TextView 
 android:id="@+id/tv" 
 android:layout_width="match_parent" 
 android:layout_height="wrap_content" 
 android:textSize="16dp" 
 android:layout_below="@id/iv" 
 android:gravity="center_horizontal" 
 android:layout_marginBottom="10dp" 
 /> 
 <ImageView 
  android:layout_width="25dp" 
  android:layout_height="25dp" 
  android:layout_alignParentRight="true" 
  android:src="@mipmap/detele" 
  android:id="@+id/iv_delete" 
  /> 
 </RelativeLayout> 
</RelativeLayout> 

資源鏈接Github

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

相關(guān)文章

  • flutter中的網(wǎng)絡(luò)請求數(shù)據(jù)獲取詳解

    flutter中的網(wǎng)絡(luò)請求數(shù)據(jù)獲取詳解

    這篇文章主要為大家介紹了flutter中的網(wǎng)絡(luò)請求數(shù)據(jù)獲取示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Android 實現(xiàn)沉浸式狀態(tài)欄的方法

    Android 實現(xiàn)沉浸式狀態(tài)欄的方法

    沉浸式狀態(tài)欄的來源就是很多手機用的是實體按鍵,沒有虛擬鍵,于是開了沉浸模式就只有狀態(tài)欄消失了。下面腳本之家小編給大家介紹Android 實現(xiàn)沉浸式狀態(tài)欄,需要的朋友可以參考下
    2015-09-09
  • android實現(xiàn)點擊按鈕控制圖片切換

    android實現(xiàn)點擊按鈕控制圖片切換

    這篇文章主要為大家詳細介紹了android實現(xiàn)點擊按鈕控制圖片切換,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • Android中activity處理返回結(jié)果的實現(xiàn)方式

    Android中activity處理返回結(jié)果的實現(xiàn)方式

    這篇文章主要介紹了Android中activity處理返回結(jié)果的實現(xiàn)方式,為了實現(xiàn)這個功能,Android提供了一個機制,跳轉(zhuǎn)到其他activity時,再返回,可以接受到其他activity返回的值,無需再start新的當前activity。需要的朋友可以參考下
    2016-12-12
  • Android自定義View實現(xiàn)箭頭沿圓轉(zhuǎn)動實例代碼

    Android自定義View實現(xiàn)箭頭沿圓轉(zhuǎn)動實例代碼

    這篇文章主要介紹了Android自定義View實現(xiàn)箭頭沿圓轉(zhuǎn)動實例代碼,需要的朋友可以參考下
    2017-09-09
  • Android 藍牙2.0的使用方法詳解

    Android 藍牙2.0的使用方法詳解

    這篇文章主要為大家詳細介紹了Android 藍牙2.0的使用方法,分享了Android操作藍牙2.0的使用流程,一些具有參考價值的代碼,感興趣的小伙伴們可以參考一下
    2016-03-03
  • Android?Studio中使用SQLite的操作方法

    Android?Studio中使用SQLite的操作方法

    這篇文章主要介紹了Android?Studio中使用SQLite的操作方法的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • Android跳轉(zhuǎn)三方應(yīng)用實例代碼

    Android跳轉(zhuǎn)三方應(yīng)用實例代碼

    大家好,本篇文章主要講的是Android跳轉(zhuǎn)三方應(yīng)用實例代碼,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • ObjectAnimator屬性動畫源碼分析篇

    ObjectAnimator屬性動畫源碼分析篇

    今天小編就為大家分享一篇關(guān)于ObjectAnimator屬性動畫源碼分析篇,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • android scrollview 滑動到頂端或者指定位置的實現(xiàn)方法

    android scrollview 滑動到頂端或者指定位置的實現(xiàn)方法

    下面小編就為大家?guī)硪黄猘ndroid scrollview 滑動到頂端或者指定位置的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04

最新評論