Android 에서 RecyclerView 드래그,사 이 드 삭제 기능 의 구현 코드
GridView 메 인 파일 구현 입 니 다.
public class GridViewActivity extends AppCompatActivity {
RecyclerView mRecyclerView;
List<String> mStringList;
RecyclerAdapter mRecyAdapter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recyclerview);
initView();
initRecy();
}
private void initView() {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mRecyclerView = (RecyclerView) findViewById(R.id.view_recycler);
}
private void initRecy() {
if (mStringList == null) {
mStringList = new ArrayList<>();
}
mStringList.addAll(DataManager.getData(20 - mStringList.size()));
mRecyAdapter = new RecyclerAdapter(R.layout.item_gridview, mStringList, true);
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 4));
mRecyclerView.addItemDecoration(new DividerGriItemDecoration(this));
mRecyclerView.setHasFixedSize(true);
RecyItemTouchHelperCallback itemTouchHelperCallback = new RecyItemTouchHelperCallback(mRecyAdapter, false, true);
final ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemTouchHelperCallback);
itemTouchHelper.attachToRecyclerView(mRecyclerView);
mRecyclerView.addOnItemTouchListener(new OnRecyclerItemClickListener(mRecyclerView) {
@Override
public void onItemClick(RecyclerView.ViewHolder viewHolder) {
RecyclerAdapter.ViewHolder viewHolder1 = (RecyclerAdapter.ViewHolder) viewHolder;
String tvString = viewHolder1.mTextView.getText().toString();
Toast.makeText(GridViewActivity.this, " " + tvString, Toast.LENGTH_SHORT).show();
}
@Override
public void onLongClick(RecyclerView.ViewHolder viewHolder) {
RecyclerAdapter.ViewHolder viewHolder1 = (RecyclerAdapter.ViewHolder) viewHolder;
String tvString = viewHolder1.mTextView.getText().toString();
Toast.makeText(GridViewActivity.this, " !", Toast.LENGTH_SHORT).show();
if (viewHolder.getLayoutPosition() != 0) {
itemTouchHelper.startDrag(viewHolder);
}
}
});
mRecyclerView.setAdapter(mRecyAdapter);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
}
return super.onOptionsItemSelected(item);
}
}
코드 는 이해 하기 어렵 지 않 습 니 다.바로 activity 에 초기 화 된 물건 을 많이 설치 하 는 것 입 니 다.RecyclerView 초기 화,setLayoutManager,addItemDecoration,setHasFixedSize,itemTouchHelper,addOnItemTouchListener,setAdapter.드래그 효과 의 핵심 코드 는 itemTouchHelper.startDrag(view Holder)입 니 다.다른 것 은 모두 그것 을 둘러싸 고 돈다.그리고 각 설정 을 구체 적 으로 살 펴 보 세 요.
DataManager
public class DataManager {
private static List<String> sStringList = Arrays.asList(" ", " ", " ", " ",
" ", " ", " ", " ", " ", " ");
public static final List<String> getData(int number) {
List<String> stringList = new ArrayList<>();
for (int i = 0; i < number; i++) {
stringList.add(sStringList.get(i % sStringList.size()));
}
return stringList;
}
}
Divider Griitem Decoration 이 건 item 의 사 이 드 라인 을 그 렸 어 요.
public class DividerGriItemDecoration extends RecyclerView.ItemDecoration {
private static final int[] ATTRS = new int[]{android.R.attr.listDivider};
private Drawable mDivider;
private int lineWidth = 1;
public DividerGriItemDecoration(GridViewActivity gridViewActivity) {
final TypedArray array = gridViewActivity.obtainStyledAttributes(ATTRS);
mDivider = array.getDrawable(0);
array.recycle();
}
public DividerGriItemDecoration(int color) {
mDivider = new ColorDrawable(color);
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
drawHorizontal(c, parent);
drawVertical(c, parent);
}
private void drawHorizontal(Canvas c, RecyclerView parent) {
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
final int left = child.getLeft() - params.leftMargin;
final int right = child.getRight() + params.rightMargin + lineWidth;
final int top = child.getBottom() + params.bottomMargin;
final int bottom = top + lineWidth;
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
private void drawVertical(Canvas c, RecyclerView parent) {
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
final int top = child.getTop() - params.topMargin;
final int bottom = child.getBottom() + params.bottomMargin;
final int left = child.getRight() + params.rightMargin;
final int right = left + lineWidth;
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
outRect.set(0, 0, lineWidth, lineWidth);
}
}
RecyclerAdapter 어댑터,ui 와 연결
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
private int item_layout;
private List<String> mDataList;
private List<Integer> mInts;
private boolean isFirstSpecial;
public RecyclerAdapter(int item_gridview, List<String> dataList, boolean isFisrtSpecial) {
this(item_gridview, dataList);
this.isFirstSpecial = isFisrtSpecial;
}
public RecyclerAdapter(int item_gridview, List<String> dataList) {
this.item_layout = item_gridview;
this.mDataList = dataList;
mInts = Arrays.asList(R.mipmap.ic_launcher, R.mipmap.ic_launcher,
R.mipmap.ic_launcher, R.mipmap.ic_launcher,
R.mipmap.ic_launcher, R.mipmap.ic_launcher);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(item_layout, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
String str = mDataList.get(position);
if (isFirstSpecial && position == 0) {
holder.itemView.setBackgroundColor(Color.LTGRAY);
holder.mTextView.setText(" ");
holder.mImageView.setImageResource(R.mipmap.ic_launcher);
} else {
holder.itemView.setBackgroundColor(Color.WHITE);
holder.mTextView.setText(str);
holder.mImageView.setImageResource(mInts.get(position % mInts.size()));
}
}
@Override
public int getItemCount() {
return mDataList == null ? 0 : mDataList.size();
}
public List<String> getDataList() {
return mDataList;
}
class ViewHolder extends RecyclerView.ViewHolder {
TextView mTextView;
ImageView mImageView;
public ViewHolder(View itemView) {
super(itemView);
mTextView = itemView.findViewById(R.id.tv_item);
mImageView = itemView.findViewById(R.id.img_item);
}
}
}
OnRecyclerItemClickListener,이벤트 클릭.저 희 는 제스처 도구 류 Gesture Detector Compat 를 빌려 서 작 동 합 니 다.
public abstract class OnRecyclerItemClickListener implements RecyclerView.OnItemTouchListener{
private GestureDetectorCompat mGestureDetectorCompat;
private RecyclerView mRecyclerView;
public OnRecyclerItemClickListener(RecyclerView mRecyclerView) {
this.mRecyclerView = mRecyclerView;
mGestureDetectorCompat = new GestureDetectorCompat(mRecyclerView.getContext(),
new ItemTouchHelperGestureListener());
}
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
mGestureDetectorCompat.onTouchEvent(e);
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
mGestureDetectorCompat.onTouchEvent(e);
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
//
public abstract void onItemClick(RecyclerView.ViewHolder viewHolder);
public abstract void onLongClick(RecyclerView.ViewHolder viewHolder);
private class ItemTouchHelperGestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onSingleTapUp(MotionEvent e) {
View childViewUnder = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
if (childViewUnder != null) {
RecyclerView.ViewHolder childViewHolder = mRecyclerView.getChildViewHolder(childViewUnder);
onItemClick(childViewHolder);
}
return true;
}
@Override
public void onLongPress(MotionEvent e) {
View childViewUnder = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
if (childViewUnder != null) {
RecyclerView.ViewHolder childViewHolder = mRecyclerView.getChildViewHolder(childViewUnder);
onLongClick(childViewHolder);
}
}
}
}
RecyItemTouchHelperCallback
public class RecyItemTouchHelperCallback extends ItemTouchHelper.Callback {
RecyclerView.Adapter mAdapter;
boolean isSwipeEnable;
boolean isFirstDragUnable;
public RecyItemTouchHelperCallback(RecyclerView.Adapter mAdapter) {
this.mAdapter = mAdapter;
isSwipeEnable = true;
isFirstDragUnable = false;
}
public RecyItemTouchHelperCallback(RecyclerView.Adapter mAdapter, boolean isSwipeEnable, boolean isFirstDragUnable) {
this.mAdapter = mAdapter;
this.isSwipeEnable = isSwipeEnable;
this.isFirstDragUnable = isFirstDragUnable;
}
// Touch
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {//
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN |
ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
int swipeFlags = 0;
return makeMovementFlags(dragFlags, swipeFlags);
} else {//list
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
return makeMovementFlags(dragFlags, swipeFlags);
}
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
int fromPosition = viewHolder.getAdapterPosition();
int toPosition = target.getAdapterPosition();
if (isFirstDragUnable && toPosition == 0) {
return false;
}
//
if (fromPosition < toPosition) {
for (int i = fromPosition; i < toPosition; i++) {
Collections.swap(((RecyclerAdapter) mAdapter).getDataList(), i, i + 1);
}
} else {
for (int i = fromPosition; i > toPosition; i--) {
Collections.swap(((RecyclerAdapter) mAdapter).getDataList(), i, i - 1);
}
}
//
mAdapter.notifyItemMoved(fromPosition, toPosition);
return true;
}
/**
*
*/
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
int adapterPosition = viewHolder.getAdapterPosition();
mAdapter.notifyItemRemoved(adapterPosition);
((RecyclerAdapter)mAdapter).getDataList().remove(adapterPosition);
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
viewHolder.itemView.setBackgroundColor(Color.LTGRAY);
}
super.onSelectedChanged(viewHolder, actionState);
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
viewHolder.itemView.setBackgroundColor(Color.WHITE);
}
@Override
public boolean isLongPressDragEnabled() {
return !isFirstDragUnable;
}
@Override
public boolean isItemViewSwipeEnabled() {
return isSwipeEnable;
}
}
다음은 list 관련 설정 입 니 다.마찬가지 로 listview 도 초기 화 설정 입 니 다.
public class ListViewActivity extends AppCompatActivity {
RecyclerView mRecyclerView;
List<String> mStringList;
RecyclerAdapter mRecyAdapter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recyclerview);
initView();
initRecy();
}
private void initRecy() {
if (mStringList == null) {
mStringList = new ArrayList<>();
}
mStringList.addAll(DataManager.getData(15 - mStringList.size()));
mRecyAdapter = new RecyclerAdapter(R.layout.item_listview, mStringList);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.addItemDecoration(new DividerListItemDecoration(this, LinearLayoutManager.VERTICAL));
mRecyclerView.setHasFixedSize(true);
RecyItemTouchHelperCallback itemTouchHelperCallback = new RecyItemTouchHelperCallback(mRecyAdapter);
final ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemTouchHelperCallback);
itemTouchHelper.attachToRecyclerView(mRecyclerView);
mRecyclerView.addOnItemTouchListener(new OnRecyclerItemClickListener(mRecyclerView) {
@Override
public void onItemClick(RecyclerView.ViewHolder viewHolder) {
RecyclerAdapter.ViewHolder viewHolder1 = (RecyclerAdapter.ViewHolder) viewHolder;
String tvString = viewHolder1.mTextView.getText().toString();
Toast.makeText(ListViewActivity.this, " " + tvString, Toast.LENGTH_SHORT).show();
}
@Override
public void onLongClick(RecyclerView.ViewHolder viewHolder) {
Toast.makeText(ListViewActivity.this, " !", Toast.LENGTH_SHORT).show();
}
});
mRecyclerView.setAdapter(mRecyAdapter);
}
private void initView() {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mRecyclerView = (RecyclerView) findViewById(R.id.view_recycler);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
}
return super.onOptionsItemSelected(item);
}
}
DividerListItemDecoration
public class DividerListItemDecoration extends RecyclerView.ItemDecoration {
private static final int[] ATTRS = new int[] {android.R.attr.listDivider};
public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
private Drawable mDivider;
private int mOrientation;
public DividerListItemDecoration() {
super();
}
public DividerListItemDecoration(Context context, int orientation) {
final TypedArray array = context.obtainStyledAttributes(ATTRS);
mDivider = array.getDrawable(0);
array.recycle();
this.mOrientation = orientation;
}
public DividerListItemDecoration(Context context, int orientation, int drawableId) {
mDivider = ContextCompat.getDrawable(context, drawableId);
setOrientation(orientation);
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDraw(c, parent, state);
}
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDrawOver(c, parent, state);
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
if (mOrientation == VERTICAL_LIST) {
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
} else {
outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
}
super.getItemOffsets(outRect, view, parent, state);
}
public void setOrientation(int orientation) {
if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
throw new IllegalArgumentException("invalid orientaion");
}
mOrientation = orientation;
}
}
원본 다운로드:http://download.csdn.net/download/loongago/9972876총결산
위 에서 말 한 것 은 소 편 이 소개 한 안 드 로 이 드 에서 RecyclerView 드래그,사 이 드 삭제 기능 의 실현 코드 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.