RecylerView 를 사용 하여 드래그 정렬 을 완료 합 니 다.

최근 Recylerview 를 사용 하여 드래그 정렬 을 마 쳤 습 니 다.옆으로 미 끄 러 지 며 삭 제 했 습 니 다.여기에 기록 하 십시오.
사용 해 야 할 것: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 만 있 습 니 다.다른 조작 은 모두 같다.

좋은 웹페이지 즐겨찾기