【Android -- UI 开发】RecyclerView 实现拖拽 + 固定首个效果

网友投稿 477 2022-11-18

【Android -- UI 开发】RecyclerView 实现拖拽 + 固定首个效果

仿腾讯视频中全部频道界面,首个精选长按不能拖动,其余的可以拖动。

效果图

1、添加依赖

//Butter Knife implementation 'com.jakewharton:butterknife:10.2.1' annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.0' //TitleBar implementation 'com.github.getActivity:TitleBar:8.6'

2、布局文件

3、逻辑代码

1. GridActivity.java

2. 适配器代码

public class GirdAdapter extends RecyclerView.Adapter { private int item_layout; private List mDataList; private List mInts; private boolean isFirstSpecial; public GirdAdapter(int item_layout, List dataList) { this.item_layout = item_layout; mDataList = dataList; mInts = Arrays.asList(R.mipmap.ic_apple, R.mipmap.ic_banana, R.mipmap.ic_cherry, R.mipmap.ic_grape, R.mipmap.ic_mango, R.mipmap.ic_pineapple, R.mipmap.ic_orange, R.mipmap.ic_pear, R.mipmap.ic_strawberry); } public GirdAdapter(int item_layout, List dataList, boolean isFirstSpecial) { this(item_layout, dataList); this.isFirstSpecial = isFirstSpecial; } @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 string = mDataList.get(position); if (isFirstSpecial && position == 0) { holder.itemView.setBackgroundColor(Color.LTGRAY); holder.mTextView.setText("苹果"); holder.mImageView.setImageResource(R.mipmap.ic_apple); } else { holder.itemView.setBackgroundColor(Color.WHITE); holder.mTextView.setText(string); holder.mImageView.setImageResource(mInts.get(position % mInts.size())); } } @Override public int getItemCount() { return mDataList == null ? 0 : mDataList.size(); } public List getDataList() { return mDataList; } public class ViewHolder extends RecyclerView.ViewHolder { public TextView mTextView; ImageView mImageView; ViewHolder(View itemView) { super(itemView); mTextView = (TextView) itemView.findViewById(R.id.tv_title); mImageView = (ImageView) itemView.findViewById(R.id.img_item); } }}

/** * Created on 2022/3/19 14:30 * * @author Gong Youqiang */public abstract class OnRecyclerItemClickListener implements RecyclerView.OnItemTouchListener { private GestureDetectorCompat mGestureDetectorCompat; private RecyclerView mRecyclerView; public OnRecyclerItemClickListener(RecyclerView recyclerView) { mRecyclerView = recyclerView; 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); } } }}

4. 长按拖动逻辑代码

/** * Created on 2022/3/19 14:27 * * @author Gong Youqiang */public class RecyItemTouchHelperCallback extends ItemTouchHelper.Callback { RecyclerView.Adapter mAdapter; boolean isSwipeEnable; boolean isFirstDragUnable; public RecyItemTouchHelperCallback(RecyclerView.Adapter adapter) { mAdapter = adapter; isSwipeEnable = true; isFirstDragUnable = false; } public RecyItemTouchHelperCallback(RecyclerView.Adapter adapter, boolean isSwipeEnable, boolean isFirstDragUnable) { mAdapter = adapter; this.isSwipeEnable = isSwipeEnable; this.isFirstDragUnable = isFirstDragUnable; } @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 { 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(((GirdAdapter) mAdapter).getDataList(), i, i + 1); } } else { for (int i = fromPosition; i > toPosition; i--) { Collections.swap(((GirdAdapter) 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); ((GirdAdapter) 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; }}

5. 数据类

/** * Created on 2022/3/19 14:58 * * @author Gong Youqiang */public class DataManager { private static List sStringList = Arrays.asList("苹果", "香蕉", "樱桃", "葡萄", "芒果", "菠萝", "桔子", "梨子", "草莓"); public static final List getData(int number) { List stringList = new ArrayList<>(); for (int i = 0; i < number; i++) { stringList.add(sStringList.get(i % sStringList.size())); } return stringList; }}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:回流法油酸值测试操作步骤_酸值测试操作流程
下一篇:Spring Security 核心过滤器链讲解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~