国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Android之RecycleView實現指定范圍的拖動效果

瀏覽:67日期:2022-09-23 13:34:45

1 問題

在RecycleView里面實現指定位置的拖動效果,(這里是實現線性布局的,不是網格布局的)

@Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { Log.i(TAG, 'onMove viewHolder.getAdapterPosition() is:' + viewHolder.getAdapterPosition()); int itemViewType = viewHolder.getAdapterPosition(); Log.i(TAG, 'onMove---------------------------------itemViewType is:' + itemViewType);// if (itemViewType == 0 || itemViewType == 1 || itemViewType == 16) {// Log.i(TAG, 'onMove---------------------------------itemViewType is:' + itemViewType);// return false;// } int fromPosition = viewHolder.getAdapterPosition();//得到拖動ViewHolder的position int toPosition = target.getAdapterPosition();//得到目標ViewHolder的position Log.i(TAG, 'onMove---------------------------------fromPosition is:' + fromPosition); Log.i(TAG, 'onMove---------------------------------toPosition is:' + toPosition);//這里的position如果不是指定范圍內的話,直接返回false,就拖動不到其它位置了 if (DragUtil.INSTANCE.getProhibitDragIndexs().contains(toPosition)) { return false; } itemTouchAdapter.onMove(fromPosition,toPosition); return true; }

2 關鍵代碼如下

MyItemTouchCallback.java

import android.graphics.Canvas;import android.graphics.Color;import android.graphics.drawable.Drawable;import android.util.Log; import androidx.recyclerview.widget.GridLayoutManager;import androidx.recyclerview.widget.ItemTouchHelper;import androidx.recyclerview.widget.RecyclerView; import com.appsinnova.android.keepdrop.manager.FileScanManager; /** * Created by Administrator on 2016/4/12. */public class MyItemTouchCallback extends ItemTouchHelper.Callback { public static final String TAG = MyItemTouchCallback.class.getSimpleName(); private ItemTouchAdapter itemTouchAdapter; public MyItemTouchCallback(ItemTouchAdapter itemTouchAdapter){ this.itemTouchAdapter = itemTouchAdapter; } @Override public boolean isLongPressDragEnabled() { return false; } @Override public boolean isItemViewSwipeEnabled() { return true; } @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { Log.i(TAG, 'getMovementFlags viewHolder.getAdapterPosition() is:' + viewHolder.getAdapterPosition()); int itemViewType = viewHolder.getAdapterPosition(); Log.i(TAG, '---------------------------------itemViewType is:' + itemViewType);// if (itemViewType == 0 || itemViewType == 1 || itemViewType == 16) {// Log.i(TAG, '-getMovementFlags--------------------------------itemViewType is:' + itemViewType);// return makeMovementFlags(0, 0);// } if (recyclerView.getLayoutManager() instanceof GridLayoutManager) { final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; final int swipeFlags = 0; return makeMovementFlags(dragFlags, swipeFlags); } else { final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; //final int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END; final int swipeFlags = 0; Log.i(TAG, 'makeMovementFlags start'); return makeMovementFlags(dragFlags, swipeFlags); } } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { Log.i(TAG, 'onMove viewHolder.getAdapterPosition() is:' + viewHolder.getAdapterPosition()); int itemViewType = viewHolder.getAdapterPosition(); Log.i(TAG, 'onMove---------------------------------itemViewType is:' + itemViewType);// if (itemViewType == 0 || itemViewType == 1 || itemViewType == 16) {// Log.i(TAG, 'onMove---------------------------------itemViewType is:' + itemViewType);// return false;// } int fromPosition = viewHolder.getAdapterPosition();//得到拖動ViewHolder的position int toPosition = target.getAdapterPosition();//得到目標ViewHolder的position Log.i(TAG, 'onMove---------------------------------fromPosition is:' + fromPosition); Log.i(TAG, 'onMove---------------------------------toPosition is:' + toPosition);//這里的position如果不是指定范圍內的話,直接返回false,就拖動不到其它位置了 if (DragUtil.INSTANCE.getProhibitDragIndexs().contains(toPosition)) { return false; } itemTouchAdapter.onMove(fromPosition,toPosition); return true; } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { int position = viewHolder.getAdapterPosition(); itemTouchAdapter.onSwiped(position); } @Override public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) { //滑動時改變Item的透明度 final float alpha = 1 - Math.abs(dX) / (float) viewHolder.itemView.getWidth(); viewHolder.itemView.setAlpha(alpha); viewHolder.itemView.setTranslationX(dX); } else { super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); } } @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { if (background == null && bkcolor == -1) {Drawable drawable = viewHolder.itemView.getBackground();if (drawable == null) { bkcolor = 0;} else { background = drawable;} } viewHolder.itemView.setBackgroundColor(Color.LTGRAY); } super.onSelectedChanged(viewHolder, actionState); } @Override public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { super.clearView(recyclerView, viewHolder); viewHolder.itemView.setAlpha(1.0f); if (background != null) viewHolder.itemView.setBackgroundDrawable(background); if (bkcolor != -1) viewHolder.itemView.setBackgroundColor(bkcolor); //viewHolder.itemView.setBackgroundColor(0); if (onDragListener!=null){ onDragListener.onFinishDrag(); } } private Drawable background = null; private int bkcolor = -1; private OnDragListener onDragListener; public MyItemTouchCallback setOnDragListener(OnDragListener onDragListener) { this.onDragListener = onDragListener; return this; } public interface OnDragListener{ void onFinishDrag(); } public interface ItemTouchAdapter { void onMove(int fromPosition, int toPosition); void onSwiped(int position); }}

OnRecyclerItemClickListener.java

import android.view.GestureDetector;import android.view.MotionEvent;import android.view.View; import androidx.core.view.GestureDetectorCompat;import androidx.recyclerview.widget.RecyclerView; /** * Created by Administrator on 2016/4/14. */public class OnRecyclerItemClickListener implements RecyclerView.OnItemTouchListener { private GestureDetectorCompat mGestureDetector; private RecyclerView recyclerView; public OnRecyclerItemClickListener(RecyclerView recyclerView){ this.recyclerView = recyclerView; mGestureDetector = new GestureDetectorCompat(recyclerView.getContext(),new ItemTouchHelperGestureListener()); } @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { mGestureDetector.onTouchEvent(e); return false; } @Override public void onTouchEvent(RecyclerView rv, MotionEvent e) { mGestureDetector.onTouchEvent(e); } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } private class ItemTouchHelperGestureListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onSingleTapUp(MotionEvent e) { View child = recyclerView.findChildViewUnder(e.getX(), e.getY()); if (child!=null) {RecyclerView.ViewHolder vh = recyclerView.getChildViewHolder(child);onItemClick(vh); } return true; } @Override public void onLongPress(MotionEvent e) { View child = recyclerView.findChildViewUnder(e.getX(), e.getY()); if (child!=null) {RecyclerView.ViewHolder vh = recyclerView.getChildViewHolder(child);onLongClick(vh); } } } public void onLongClick(RecyclerView.ViewHolder vh){} public void onItemClick(RecyclerView.ViewHolder vh){}}

適配器里面實現接口

MyItemTouchCallback.ItemTouchAdapter

import android.text.TextUtils;import android.util.Log;import android.view.View;import android.widget.ImageView; import org.greenrobot.eventbus.EventBus; import java.util.ArrayList;import java.util.Collections;import java.util.List; import static com.appsinnova.android.keepdrop.recommend.entity.ChannelHead.channelType; public class ChannelManagerAdapter extends BaseMultiItemQuickAdapter<MultiItemEntity, BaseViewHolder> implements MyItemTouchCallback.ItemTouchAdapter { public static final String TAG = ChannelManagerAdapter.class.getSimpleName(); public static final int MY_VEDIO_TYPE = 0; public static final int MORE_VEDIO_TYPE = 1; public static final int CAN_EDITABLE = 1; public static final int CAN_NOT_EDITABLE = 0; public List<MultiItemEntity> results = null; public ChannelManagerAdapter(List<MultiItemEntity> data) { super(data); addItemType(ChannelHead.channelHeadType, R.layout.item_channel_head); addItemType(channelType, R.layout.item_channel); this.results = data; } @Override protected void convert(BaseViewHolder helper, MultiItemEntity item) { switch (helper.getItemViewType()) { } } @Override public void onMove(int fromPosition, int toPosition) { if (fromPosition==results.size()-1 || toPosition==results.size()-1){ return; } if (fromPosition < toPosition) { for (int i = fromPosition; i < toPosition; i++) {Collections.swap(results, i, i + 1); } } else { for (int i = fromPosition; i > toPosition; i--) {Collections.swap(results, i, i - 1); } }//這個數據是移動后的數據,會更新原始數據 int size = results.size(); List<RecommendVedioModel.RecommendVedioItem> items = new ArrayList<RecommendVedioModel.RecommendVedioItem>(); RecommendVedioModel recommendVedioModel = SPHelper.getInstance().getObject(SpConstants.RECOMMEND_VEDIO_CATETGORY, RecommendVedioModel.class); for (int i = 0; i < size; ++i) { if (results.get(i).getItemType() == channelType) {RecommendVedioModel.RecommendVedioItem item = (RecommendVedioModel.RecommendVedioItem)results.get(i);items.add(item); } } if (recommendVedioModel != null) { recommendVedioModel.items = items; } else { Log.i(TAG, 'recommendVedioModel is null'); } SPHelper.getInstance().putObject(SpConstants.RECOMMEND_VEDIO_CATETGORY, recommendVedioModel); notifyItemMoved(fromPosition, toPosition); } @Override public void onSwiped(int position) { }}

然后在頁面顯示的地方

channelManagerAdapter = ChannelManagerAdapter(allDatas) val layoutManager = LinearLayoutManager(this) layoutManager.orientation = LinearLayoutManager.VERTICAL channelRecycleview.setLayoutManager(layoutManager) channelRecycleview.setAdapter(channelManagerAdapter) val itemTouchHelper = ItemTouchHelper(MyItemTouchCallback(channelManagerAdapter)) itemTouchHelper.attachToRecyclerView(channelRecycleview) channelRecycleview.addOnItemTouchListener(object : OnRecyclerItemClickListener(channelRecycleview) { override fun onLongClick(vh: RecyclerView.ViewHolder) {LogUtil.i(TAG, 'onLongClick vh.layoutPosition is:' + vh.layoutPosition)var index = vh.layoutPositionif (!prohibitDragIndexs.contains(index)) { itemTouchHelper.startDrag(vh)} } })

到此這篇關于Android之RecycleView實現指定范圍的拖動效果的文章就介紹到這了,更多相關android recycleView實現指定范圍的拖動內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Android
相關文章:
主站蜘蛛池模板: 国产91丝袜在线播放九色 | 国产日产亚洲系列首页 | 国产在线观看高清不卡 | 男人把女人桶到喷白浆的视频 | 日本久久一区二区 | 最爽的乱淫片免费 | 欧美人成在线观看ccc36 | 国产高清成人mv在线观看 | 欧美a在线 | 性欧美17一18sex性高清播放 | 成人黄激情免费视频 | 99手机在线视频 | 91热成人精品国产免费 | 亚洲国产精品久久久久 | 国产午夜免费不卡精品理论片 | 日韩在线视频观看 | 欧美成人免费tv在线播放 | 日本高清免费视频www | 精品亚洲福利一区二区 | 毛片视频免费观看 | 成年女人免费视频播放成年m | 国产1区2区三区不卡 | 亚洲精品高清国产麻豆专区 | 日本韩国欧美一区 | 国产成人深夜福利在线观看 | 中文国产成人精品久久水 | 久久久久综合国产 | 亚洲精品成人7777在线观看 | 91精品国产色综合久久 | 亚洲视频手机在线观看 | 久久久欧美综合久久久久 | 久久成人国产精品 | 二区久久国产乱子伦免费精品 | 国产亚洲免费观看 | 七七国产福利在线二区 | 国产精品亚洲精品久久成人 | 久久福利青草狠狠午夜 | 美女视频永久黄网站免费观看韩国 | 国产成人免费片在线视频观看 | 欧美亚洲国产片在线观看 | 日韩午夜|