RecylerView 를 사용 하여 드래그 정렬 을 완료 합 니 다.
9537 단어 recyclerview드래그정렬
사용 해 야 할 것:ItemTouchHelper.Callback 같은 종류 입 니 다.
효과 그림:
RecylerView 가 있 는 Activity 에서 Adapter 를 설정 하 는 것 외 에 해 야 할 일 은 다음 과 같 습 니 다.
MyItemTouchHelperCallback callback = new MyItemTouchHelperCallback(adapter); // ItemTouchHelper.Callback, RecylerView
ItemTouchHelper helper = new ItemTouchHelper(callback); // callback ItemTouchHelper 。 , ,
helper.attachToRecyclerView(recyclerView); // help recylerview ,
Activity 에서 의 조작 은 이렇게 간단 하 다.다음 에 인 터 페 이 스 를 정의 합 니 다.이 인 터 페 이 스 는 결합 을 해제 하기 위해 서 입 니 다.왜냐하면 일부 글 이 activity 에서 onMove 와 onSwipe 를 처리 하고 추상 적 으로 이해 하 는 것 을 보 았 기 때 문 입 니 다.
public interface OnMoveAndSwipeListener {
public boolean onItemMove(int fromPosition, int toPosition); // boolean
public void onItemDismiss(int position);
}
RecylerView 의 Adapter 에서 이 인 터 페 이 스 를 실현 합 니 다.위의 두 가지 방법 을 복사 하면,
@Override
public boolean onItemMove(int fromPosition, int toPosition) {
if (fromPosition < toPosition) {
// ,
for (int i = fromPosition; i < toPosition; i++) {
Collections.swap(list,i,i+1);
}
}else{
// ,
for (int i = fromPosition; i >toPosition ; i--) {
Collections.swap(list,i,i-1);
}
}
notifyItemMoved(fromPosition,toPosition);
return true;
}
@Override
public void onItemDismiss(int position) {
// , onItemMove , ,
}
이렇게 하면 Adapter 의 작업 도 완 성 됩 니 다.똑 같이 간단 합 니 다.모두 고정된 방식 이 있 습 니 다.여러분 이 본 demo 는 모두 기본 적 인 애니메이션 이 있 습 니 다.이 애니메이션 효 과 는 RecylerView 를 설정 할 때 recylerview.setItemAnimator(매개 변수)입 니 다.설정 되 어 있 습 니 다.이 방법 을 사용 하지 않 으 면 기본 애니메이션 효과 입 니 다.Adapter 를 설정 하 는 것 외 에 해 야 할 일 은 다음 과 같 습 니 다.
계승 ItemTouchHelper.Callback 을 쓰 는 것 이 마지막 단계 이자 본 고 는 처음에 Activity 에서 실례 화 된 유형 입 니 다.
코드 도 많 지 않 습 니 다:
public class MyItemTouchHelperCallback extends ItemTouchHelper.Callback {
MyAdapter adapter;
public MyItemTouchHelperCallback(MyAdapter adapter) {
this.adapter = adapter;
}
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
//
// , up down, gridview recylerview,up,down,left,right
final int moveMode = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
// , ,
//final int swipeMode = ItemTouchHelper.START | ItemTouchHelper.END;
Log.e("getMovementFlags","getMovementFlags");
return makeMovementFlags(moveMode, 0);// , 0
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
// , adapter onItemMove ,
return adapter.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
// , onMove
// adapter.onItemDismiss(viewHolder.getAdapterPosition());
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
// item , item ,
super.onSelectedChanged(viewHolder, actionState);
if (actionState!= ItemTouchHelper.ACTION_STATE_IDLE){
viewHolder.itemView.setBackgroundColor(Color.LTGRAY);
}
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
// , , 。
super.clearView(recyclerView, viewHolder);
viewHolder.itemView.setBackgroundColor(0);
}
}
여기까지 간단 한 드래그 와 사 이 드 스 케 이 트 가 완성 되 었 습 니 다.사실 드래그 와 사 이 드 스 케 이 트 의 논 리 는 모두 같 습 니 다.위의 절차 에 따라 효과 가 나 왔 습 니 다.위 는 단지 간단 한 효과 일 뿐이다.위의 효 과 를 실현 하 였 습 니 다.다음은 좀 더 진급 하 는 효 과 를 보 겠 습 니 다.
RecycleViewSwipeDismiss
상술 한 효 과 를 얻 으 려 면 먼저 위의 논 리 를 말 해 보 세 요.
우선 그의 모든 Item 의 구 조 는 2 층 이다.
<?xml version="1.0" encoding="utf-8"?>
<!-- view, -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rl_background"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/iv_done"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="16dp"
android:layout_marginStart="16dp"
android:src="@mipmap/bt_ic_done_white_24" />
<ImageView
android:id="@+id/iv_schedule"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:src="@mipmap/bt_ic_schedule_white_24" />
<!-- view-->
<LinearLayout
android:id="@+id/ll_item"
android:layout_width="match_parent"
android:layout_height="64dp"
android:background="@android:color/white"
android:gravity="center_vertical"
android:orientation="vertical"
android:paddingLeft="16dp"
android:paddingRight="16dp">
<TextView
android:id="@+id/tv_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
tools:text="Item" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_below="@id/ll_item"
android:background="#B2B2b2" />
</RelativeLayout>
원리:전체 화면의 linearlayout 은 사 이 드 스 케 이 트 효 과 를 담당 하고 뿌리 구 조 는 색상 이 있 고 그림 이 있 는 층 입 니 다.linearlayout 이 미 끄 러 졌 기 때문에 뿌리 구조 와 위의 그림 이 나 왔 습 니 다.MyItemTouchHelperCallback 에서 다시 복사 하 는 몇 가지 방법 과 다 중 복사 하 는 몇 가지 방법 이 필요 합 니 다.
<span style="white-space:pre"> </span> @Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
// View , ,
// ViewHolder itemView, ItemTouchUIUtil clearView view
getDefaultUIUtil().clearView(((SampleAdapter.ItemViewHolder) viewHolder).vItem);
((SampleAdapter.ItemViewHolder) viewHolder).vBackground.setBackgroundColor(Color.TRANSPARENT);
((SampleAdapter.ItemViewHolder) viewHolder).ivSchedule.setVisibility(View.GONE);
((SampleAdapter.ItemViewHolder) viewHolder).ivDone.setVisibility(View.GONE);
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
// viewHolder
if (viewHolder != null) {
// ViewHolder itemView, ItemTouchUIUtil clearView view
getDefaultUIUtil().onSelected(((SampleAdapter.ItemViewHolder) viewHolder).vItem);
}
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
// ItemTouchHelper onDraw , Canvas , RecyclerView
// ViewHolder itemView, ItemTouchUIUtil clearView view
getDefaultUIUtil().onDraw(c, recyclerView, ((SampleAdapter.ItemViewHolder) viewHolder).vItem, dX, dY, actionState, isCurrentlyActive);
if (dX > 0) { //
((SampleAdapter.ItemViewHolder) viewHolder).vBackground.setBackgroundResource(R.color.colorDone);
((SampleAdapter.ItemViewHolder) viewHolder).ivDone.setVisibility(View.VISIBLE);
((SampleAdapter.ItemViewHolder) viewHolder).ivSchedule.setVisibility(View.GONE);
}
if (dX < 0) { //
((SampleAdapter.ItemViewHolder) viewHolder).vBackground.setBackgroundResource(R.color.colorSchedule);
((SampleAdapter.ItemViewHolder) viewHolder).ivSchedule.setVisibility(View.VISIBLE);
((SampleAdapter.ItemViewHolder) viewHolder).ivDone.setVisibility(View.GONE);
}
}
@Override
public void onChildDrawOver(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
// ItemTouchHelper onDrawOver , Canvas , RecyclerView
// ViewHolder itemView, ItemTouchUIUtil clearView view
getDefaultUIUtil().onDrawOver(c, recyclerView, ((SampleAdapter.ItemViewHolder) viewHolder).vItem, dX, dY, actionState, isCurrentlyActive);
}
});
getDefaultUIUtil()의 방법 으로 미끄럼 동작 을 지정 하 는 것 은 linearlayout 이기 때문에 매번 미 끄 러 질 때마다 linearlayout 만 있 습 니 다.다른 조작 은 모두 같다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
드래그텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.