【发布时间】:2018-01-25 16:01:03
【问题描述】:
我正在尝试在 recyclerview 中实现拖放。我成功地实现了它。但我有一个小问题。只有当我拖动特定的 viewHolder(一个 ImageView)时才会发生拖放。但是在我的 recyclerview 中,当我触摸行的任何部分并拖动时,该项目开始拖动。我只希望在触摸 ImageView 并拖动时拖动行或项目。
我遵循了这个教程:https://medium.com/@ipaulpro/drag-and-swipe-with-recyclerview-b9456d2b1aaf
代码:
public class EditItemTouchHelperCallback extends ItemTouchHelper.Callback {
private final PlaylistUserAdapter mAdapter;
public EditItemTouchHelperCallback(PlaylistUserAdapter adapter) {
mAdapter = adapter;
}
@Override
public boolean isLongPressDragEnabled() {
return true;
}
@Override
public boolean isItemViewSwipeEnabled() {
return true;
}
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
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) {
mAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
mAdapter.onItemDismiss(viewHolder.getAdapterPosition());
}
适配器:
public class PlaylistUserAdapter extends RecyclerView.Adapter<PlaylistUserAdapter.ViewHolder> implements ItemTouchHelperAdapter{
private Context context;
private ArrayList<SongInfoModel> SongList = new ArrayList<>();
private RecyclerItemClickListener listener;
private final OnStartDragListener mDragStartListener;
private SparseBooleanArray expandState = new SparseBooleanArray();
public PlaylistUserAdapter(Context context, ArrayList<SongInfoModel> songList,OnStartDragListener dragListner,RecyclerItemClickListener listener) {
this.context = context;
SongList = songList;
this.listener = listener;
mDragStartListener = dragListner;
}
@Override
public PlaylistUserAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.row_song, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final PlaylistUserAdapter.ViewHolder holder, int position) {
final SongInfoModel songInfoModel = SongList.get(position);
final boolean isExpanded = expandState.get(position);
holder.expandableLayout.setVisibility(isExpanded?View.VISIBLE:View.GONE);
holder.songName.setText(songInfoModel.SongName);
holder.artistName.setText(songInfoModel.ArtistName);
holder.duration.setText(String.valueOf(songInfoModel.duration));
String duration = Utility.convertDuration(songInfoModel.getDuration());
holder.duration.setText(duration);
Picasso.with(context).load(songInfoModel.getAlbumIDArtwork()).placeholder(R.drawable.ic_launcher).into(holder.iv_artwork);
Picasso.with(context).load(R.mipmap.drag).into(holder.expandArrow);
holder.bind(songInfoModel, listener);
holder.expandArrow.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (MotionEventCompat.getActionMasked(motionEvent) == MotionEvent.ACTION_DOWN) {
mDragStartListener.onStartDrag(holder,songInfoModel);}
return false;
}
});
}
@Override
public int getItemCount() {
return SongList.size();
}
@Override
public boolean onItemMove(int fromPosition, int toPosition) {
ContentResolver cr = context.getContentResolver();
if (fromPosition < SongList.size() && toPosition < SongList.size()) {
if (fromPosition < toPosition) {
for (int i = fromPosition; i < toPosition; i++) {
Collections.swap(SongList, i, i + 1);
}
} else {
for (int i = fromPosition; i > toPosition; i--) {
Collections.swap(SongList, i, i - 1);
}
}
notifyItemMoved(fromPosition, toPosition);
}
PlayListUser.trackMoved(fromPosition,toPosition, cr, SongList);
return true;
}
@Override
public void onItemDismiss(int position) {
SongList.remove(position);
notifyItemRemoved(position);
}
public class ViewHolder extends RecyclerView.ViewHolder implements ItemTouchHelperViewHolder {
private TextView songName;
private TextView artistName;
private TextView duration;
private ImageView iv_artwork;
private ImageView expandArrow;
private RelativeLayout expandableLayout;
private CardView card_view;
private LinearLayout PlaySongLayout;
private LinearLayout AddPlayListLayout;
private LinearLayout EditTag;
private LinearLayout RingtoneLayout;
private LinearLayout ShareLayout;
private LinearLayout DeleteLayout;
public ViewHolder(View itemView) {
super(itemView);
songName = (TextView)itemView.findViewById(R.id.SongName);
artistName= (TextView)itemView.findViewById(R.id.ArtistName);
duration = (TextView) itemView.findViewById(R.id.duration);
iv_artwork = (ImageView) itemView.findViewById(R.id.iv_artwork);
expandableLayout = itemView.findViewById(R.id.expandableLayout);
card_view = itemView.findViewById(R.id.card_view);
expandArrow=itemView.findViewById(R.id.expandArrow);
PlaySongLayout = itemView.findViewById(R.id.PlaySongLayout);
AddPlayListLayout = itemView.findViewById(R.id.AddPlayListLayout);
EditTag = itemView.findViewById(R.id.EditTag);
RingtoneLayout = itemView.findViewById(R.id.RingtoneLayout);
ShareLayout = itemView.findViewById(R.id.ShareLayout);
DeleteLayout = itemView.findViewById(R.id.DeleteLayout);
}
public void bind(final SongInfoModel songInfoModel, final RecyclerItemClickListener listener) {
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onClickListener(songInfoModel, getLayoutPosition());
}
});
itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
listener.onLongClickListener(songInfoModel, getLayoutPosition(),view);
onClickButton(expandableLayout,getLayoutPosition(),card_view);
return true;
}
});
}
@Override
public void onItemSelected() {
itemView.setBackgroundColor(Color.LTGRAY);
}
@Override
public void onItemClear() {
itemView.setBackgroundColor(0);
}
【问题讨论】:
标签: android android-recyclerview drag-and-drop