android-advancedrecyclerview icon indicating copy to clipboard operation
android-advancedrecyclerview copied to clipboard

2 small difficulties

Open polyak01 opened this issue 7 years ago • 0 comments

Hi!)

Have 2 issues.

  1. 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?

  1. 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:

photo_2017-07-25_14-49-35 2

@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;
    }
}

polyak01 avatar Jul 31 '17 06:07 polyak01