激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Android - RecyclerView實現拖拽排序效果

RecyclerView實現拖拽排序效果

2022-02-28 15:33崔晨博 Android

這篇文章主要為大家詳細介紹了RecyclerView實現拖拽排序效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

RecyclerView實現拖拽排序效果

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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) {
   //滑動事件 下面注釋的代碼,滑動后數據和條目錯亂,被舍棄
//   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) {
    //側滑刪除可以使用;
  }
 
  @Override
  public boolean isLongPressDragEnabled() {
   return true;
  }
  /**
   * 長按選中Item的時候開始調用
   * 長按高亮
   * @param viewHolder
   * @param actionState
   */
  @Override
  public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
   if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
    viewHolder.itemView.setBackgroundColor(Color.RED);
    //獲取系統震動服務//震動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(); //完成拖動后刷新適配器,這樣拖動后刪除就不會錯亂
  }
 });

設置給RecyclerView即可:

?
1
helper.attachToRecyclerView(rv);

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
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) {
   //滑動事件 下面注釋的代碼,滑動后數據和條目錯亂,被舍棄
//   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) {
    //側滑刪除可以使用;
  }
 
  @Override
  public boolean isLongPressDragEnabled() {
   return true;
  }
  /**
   * 長按選中Item的時候開始調用
   * 長按高亮
   * @param viewHolder
   * @param actionState
   */
  @Override
  public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
   if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
    viewHolder.itemView.setBackgroundColor(Color.RED);
    //獲取系統震動服務//震動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布局文件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?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="查看數據"
   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="添加數據"
   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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?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

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

原文鏈接:https://blog.csdn.net/qq_35605213/article/details/80541461

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品99久久久久久宅女 | 精品国产一区在线观看 | 国产欧美精品综合一区 | 密室逃脱第一季免费观看完整在线 | 国产免费一区二区三区在线能观看 | 久久99精品久久久久久国产越南 | 精品一区二区6 | 欧美一区二区三区四区电影 | 韩国三级日本三级香港三级黄 | 欧美黄色一区 | 91色成人| 亚洲一区国产二区 | 久久综合一区 | 精品国产91久久久久久久 | 国产一级毛片不卡 | 九九热在线视频观看这里只有精品 | 国产精品一品二区三区四区18 | 国产xxxxx在线观看 | 久草免费资源视频 | 日本在线不卡免费 | 香蕉秀 | 爱福利视频网 | 国产1区2| 伊人av影院 | 龙的两根好大拔不出去h | 欧美一区二区黄色片 | 国产男女 爽爽爽爽视频 | 日韩精品dvd| 中文字幕综合在线观看 | 国产精品免费大片 | 精品国产96亚洲一区二区三区 | 人人看人人艹 | 成人在线视频免费 | 久久精品电影网 | 欧美一区二区三区免费不卡 | 特片网久久 | 国产精品久久久久久久久久10秀 | 久久综合久久综合久久综合 | av大全在线免费观看 | 国产成人精品自拍视频 | 久久久精品视频在线观看 |