android-advancedrecyclerview
android-advancedrecyclerview copied to clipboard
2 small difficulties
Hi!)
Have 2 issues.
- I have items with content. When the user clicks on the item, a content opens or closes. It doesn't look perfect if content is opened, so I set all content GONE in onGetItemDraggableRange()
@Override
public ItemDraggableRange onGetItemDraggableRange(MyViewHolder holder, int position) {
for (int i = 0; i < mProvider.getSize(); i++) {
if (mProvider.getItem(i).isVisible()) {
mProvider.getItem(i).setVisible(false);
}
}
notifyDataSetChanged();
return null;
}
But I encountered with bug. When i try to drag CLOSED item - all is fine, and another OPENED items is closes content. When I try to drag OPENED item, all items closes content too, but item wich I try to drag closes content after dragging.
How can i Fix it? Maybe call notifyDataSetChanged() elsewhere?
- When I set background of the items to transparent color, I see my items tilted with gray shadows at the left and at the right. Also see small shadow at the bottom. Check the screen:
@Override
public void initList(SimpleDataProvider list) {
mLayoutManager = new LinearLayoutManager(activity);
// drag & drop manager
mRecyclerViewDragDropManager = new RecyclerViewDragDropManager();
// Start dragging after long press
mRecyclerViewDragDropManager.setInitiateOnLongPress(true);
mRecyclerViewDragDropManager.setInitiateOnMove(false);
mRecyclerViewDragDropManager.setLongPressTimeout(350);
//adapter
final DragOnLongPressExampleAdapter myItemAdapter = new DragOnLongPressExampleAdapter(list, activity);
mWrappedAdapter = mRecyclerViewDragDropManager.createWrappedAdapter(myItemAdapter); // wrap for dragging
final GeneralItemAnimator animator = new DraggableItemAnimator();
mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mWrappedAdapter); // requires *wrapped* adapter
mRecyclerView.setItemAnimator(animator);
mRecyclerView.addItemDecoration(new SimpleListDividerDecorator(ContextCompat.getDrawable(activity, R.drawable.list_divider_h), true));
mRecyclerViewDragDropManager.attachRecyclerView(mRecyclerView);
}
public class DragOnLongPressExampleAdapter
extends RecyclerView.Adapter<DragOnLongPressExampleAdapter.MyViewHolder>
implements DraggableItemAdapter<DragOnLongPressExampleAdapter.MyViewHolder> {
private static final String TAG = "MyDraggableItemAdapter";
private BaseActivity activity;
// NOTE: Make accessible with short name
private interface Draggable extends DraggableItemConstants {
}
private SimpleDataProvider mProvider;
static class MyViewHolder extends AbstractDraggableItemViewHolder {
FrameLayout mContainer;
View mDragHandle, detail;
TextView mTextView;
EmptyRecyclerView emptyRecyclerView;
ImageView categoryIv;
MyViewHolder(View v) {
super(v);
emptyRecyclerView = (EmptyRecyclerView) v.findViewById(R.id.sub_categories);
mContainer = (FrameLayout) v.findViewById(R.id.container);
mDragHandle = v.findViewById(R.id.drag_handle);
mTextView = (TextView) v.findViewById(android.R.id.text1);
categoryIv = (ImageView) v.findViewById(R.id.category_iv);
detail = v.findViewById(R.id.data);
}
}
public DragOnLongPressExampleAdapter(SimpleDataProvider dataProvider, BaseActivity activity) {
mProvider = dataProvider;
this.activity = activity;
// DraggableItemAdapter requires stable ID, and also
// have to implement the getItemId() method appropriately.
setHasStableIds(true);
}
@Override
public long getItemId(int position) {
return mProvider.getItem(position).getId();
}
@Override
public int getItemViewType(int position) {
return mProvider.getItem(position).getViewType();
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
final LayoutInflater inflater = LayoutInflater.from(parent.getContext());
final View v = inflater.inflate(R.layout.list_item_draggable, parent, false);
return new MyViewHolder(v);
}
@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
CategoriesDto item = mProvider.getItem(position);
// set text
holder.mTextView.setText(item.getText());
holder.detail.setVisibility(item.isVisible() ? View.VISIBLE : View.GONE);
// set background resource (target view ID: container)
final int dragState = holder.getDragStateFlags();
if (((dragState & Draggable.STATE_FLAG_IS_UPDATED) != 0)) {
if ((dragState & Draggable.STATE_FLAG_IS_ACTIVE) != 0) {
// need to clear drawable state here to get correct appearance of the dragging item.
DrawableUtils.clearState(holder.mContainer.getForeground());
holder.mContainer.setBackgroundResource(R.drawable.bg_item_dragging_active_state);
} else {
holder.mContainer.setBackgroundResource(R.drawable.bg_item_normal_state);
}
}
holder.mContainer.setOnClickListener(v -> {
mProvider.getItem(position).setVisible(!mProvider.getItem(position).isVisible());
notifyItemChanged(position, mProvider.getItem(position));
});
holder.emptyRecyclerView.setLayoutManager(new LinearLayoutManager(activity));
holder.emptyRecyclerView.addItemDecoration(new DividerItemDecoration(activity));
Picasso.with(holder.categoryIv.getContext())
.load(item.getImage())
.into(holder.categoryIv);
SubAdapter mAdapter = new SubAdapter(item.getList());
mAdapter.attachToRecyclerView(holder.emptyRecyclerView);
// mAdapter.setOnItemClickListener();
}
@Override
public int getItemCount() {
return mProvider.getSize();
}
@Override
public void onMoveItem(int fromPosition, int toPosition) {
Log.d(TAG, "onMoveItem(fromPosition = " + fromPosition + ", toPosition = " + toPosition + ")");
if (fromPosition == toPosition) {
return;
}
mProvider.moveItem(fromPosition, toPosition);
notifyItemMoved(fromPosition, toPosition);
}
@Override
public boolean onCheckCanStartDrag(MyViewHolder holder, int position, int x, int y) {
// x, y --- relative from the itemView's top-left
// final View containerView = holder.mContainer;
// final View dragHandleView = holder.mDragHandle;
//
// final int offsetX = containerView.getLeft() + (int) (ViewCompat.getTranslationX(containerView) + 0.5f);
// final int offsetY = containerView.getTop() + (int) (ViewCompat.getTranslationY(containerView) + 0.5f);
// boolean b = ViewUtils.hitTest(dragHandleView, x - offsetX, y - offsetY);
Log.d(TAG, "onCheckCanStartDrag return true");
return true;
}
@Override
public ItemDraggableRange onGetItemDraggableRange(MyViewHolder holder, int position) {
for (int i = 0; i < mProvider.getSize(); i++) {
if (mProvider.getItem(i).isVisible()) {
mProvider.getItem(i).setVisible(false);
}
}
notifyDataSetChanged();
return null;
}
@Override
public boolean onCheckCanDrop(int draggingPosition, int dropPosition) {
return true;
}
}