国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久国产精品久久久久久电车 | 正在播放国产一区 | 国产精品视屏 | 国产a级黄色毛片 | 亚洲精品无码专区在线播放 | 综合久久一区 | 综合久久网 | 欧美视频成人 | 欧美成人精品一区二区三区 | 成人欧美一区二区三区色青冈 | 午夜视频网 | 欧美激情亚洲 | 在线成人福利 | 亚洲成人免费 | www.成人在线视频 | 久久久久国产精品免费免费搜索 | 欧美日韩精品一区二区三区四区 | 91中文字幕 | 中文字幕一二三区 | 亚洲v在线 | 日韩成人精品在线观看 | 欧洲一级视频 | 久久亚洲视频 | 久久大陆| 丝袜美腿一区二区三区 | 99久久精品免费看国产一区二区三区 | 午夜精品久久久久久久久久久久久 | 91精品国产综合久久福利软件 | 国产精品一区在线观看 | 国产成人av在线播放 | 日本不卡一区二区三区在线观看 | 久久精品日韩 | 中文字幕亚洲欧美日韩在线不卡 | 久久久免费视频看看 | 伊人春色网 | 欧美日韩一区二区在线 | 国产模特私拍xxxx | 国产成人免费在线 | 免费看黄在线观看 | 国产精品永久免费视频 | 国产亚洲欧美一区 |