滑动后如何检测recyclerview项目下方的点击视图?

时间:2019-07-05 05:11:01

标签: android android-recyclerview swipe

enter code here我有一个Recyclerview,其中包含每个项目的前景和背景视图。后台项目有两个用于删除和撤消的按钮。我想检测Recyclerview项目滑动时是否单击了按钮。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <LinearLayout
        android:id="@+id/category_item_row_background"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorAccent"
        android:orientation="horizontal"
        android:weightSum="1">

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.6"
            android:gravity="center_vertical|center"
            android:text="به سطل زباله منتقل شود؟"
            android:textColor="#fff"
            android:textSize="13dp" />
        <TextView
            android:id="@+id/delete_item"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.2"
            android:gravity="center_vertical|center"
            android:textColor="#fff"
            android:background="@color/colorAccent1"
            android:clickable="true"
            android:text="@string/delete"/>
        <TextView
            android:id="@+id/cancel_item"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.2"
            android:gravity="center_vertical|center"
            android:textColor="#fff"
            android:background="@color/colorAccent2"
            android:clickable="true"
            android:text="@string/cancel"/>

    </LinearLayout>
    <LinearLayout
        android:id="@+id/category_item_row_foreground"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="15dp"
        android:weightSum="1"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/category_list_category_title"
            style="@style/ListItemTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="0.85"
            android:gravity="right"
            android:paddingStart="20dp"
            android:paddingEnd="20dp"
            android:text="@string/review_tab_title" />

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="0.15"
            android:orientation="vertical"
            android:paddingStart="20dp"
            android:paddingEnd="20dp">

            <TextView
                android:id="@+id/category_list_card_count"
                style="@style/ListItemValue"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="@string/zero_value" />

            <TextView
                style="@style/ListItemLable"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="@string/card" />
        </LinearLayout>

    </LinearLayout>
</FrameLayout>

// RecyclerItemTouchHelper.java

public class RecyclerItemTouchHelper extends ItemTouchHelper.SimpleCallback {
    private RecyclerItemTouchHelperListener listener;

    public RecyclerItemTouchHelper(int dragDirs, int swipeDirs, RecyclerItemTouchHelperListener listener) {
        super(dragDirs, swipeDirs);
        this.listener = listener;
    }

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        return true;
    }

    @Override
    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
        if (viewHolder != null) {
            final View foregroundView = ((CategoryRecyclerAdapter.MyViewHolder) viewHolder).viewForeground;

            getDefaultUIUtil().onSelected(foregroundView);
        }
    }

    @Override
    public void onChildDrawOver(Canvas c, RecyclerView recyclerView,
                                RecyclerView.ViewHolder viewHolder, float dX, float dY,
                                int actionState, boolean isCurrentlyActive) {
        final View foregroundView = ((CategoryRecyclerAdapter.MyViewHolder) viewHolder).viewForeground;
        getDefaultUIUtil().onDrawOver(c, recyclerView, foregroundView, dX, dY,
                actionState, isCurrentlyActive);
    }

    @Override
    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        final View foregroundView = ((CategoryRecyclerAdapter.MyViewHolder) viewHolder).viewForeground;
        getDefaultUIUtil().clearView(foregroundView);

    }

    @Override
    public void onChildDraw(Canvas c, RecyclerView recyclerView,
                            RecyclerView.ViewHolder viewHolder, float dX, float dY,
                            int actionState, boolean isCurrentlyActive) {
        final View foregroundView = ((CategoryRecyclerAdapter.MyViewHolder) viewHolder).viewForeground;

        getDefaultUIUtil().onDraw(c, recyclerView, foregroundView, dX, dY,
                actionState, isCurrentlyActive);
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        listener.onSwiped(viewHolder, direction, viewHolder.getAdapterPosition());
    }

    @Override
    public int convertToAbsoluteDirection(int flags, int layoutDirection) {
        return super.convertToAbsoluteDirection(flags, layoutDirection);
    }

    public interface RecyclerItemTouchHelperListener {
        void onSwiped(RecyclerView.ViewHolder viewHolder, int direction, int position);
    }
}

// MainActivity.java

adapter = new CategoryRecyclerAdapter(categories, this, 1);
        recyclerView.setAdapter(adapter);


        ItemTouchHelper.SimpleCallback itemTouchHelperCallback = new RecyclerItemTouchHelper(0, ItemTouchHelper.LEFT| ItemTouchHelper.RIGHT, new RecyclerItemTouchHelper.RecyclerItemTouchHelperListener() {
            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction, int position) {
                if(ps!=-1){
                    if(ps==position)return;
                    adapter.notifyItemChanged(ps);
                }
                ps=position;
            }
        });
        new ItemTouchHelper(itemTouchHelperCallback).attachToRecyclerView(recyclerView);

// RecyclerAdapter.java

public class CategoryRecyclerAdapter extends RecyclerView.Adapter<CategoryRecyclerAdapter.MyViewHolder> {

    private ArrayList<Category> itemList;
    private Context ctx;
    private int itemClickType;

    public CategoryRecyclerAdapter(ArrayList<Category> items, Context context, int type) {//سازنده کلاس آداپتر
        this.itemList = items;
        ctx = context;
        itemClickType = type;
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {//یه کلاس viewholder دلخواه بسازید و از viewholder خودِ recyclerview ارث بری کند

        public TextView txtTitle, txtCount, btnDelete, btnCancel;
        public LinearLayout viewBackground, viewForeground;

        public MyViewHolder(View itemView) {//, int state) {//سازنده کلاس viewholder
            super(itemView);
            txtTitle = itemView.findViewById(R.id.category_list_category_title);
            txtCount = itemView.findViewById(R.id.category_list_card_count);
            viewBackground = itemView.findViewById(R.id.category_item_row_background);
            viewForeground = itemView.findViewById(R.id.category_item_row_foreground);

            btnDelete = itemView.findViewById(R.id.delete_item);
            btnCancel = itemView.findViewById(R.id.cancel_item);
        }
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {//دقت کنید اینجا کلاس خروجی از متد دقیقا باید کلاس viewHolder که خودتون نوشتید باشه
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_category_list, parent, false);
        return new MyViewHolder(view);
    }


    @Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {//و همینطور اینجا ورودی متد باید کلاس viewHolder که خودتون ایجاد کردید باشه
        final Category item = itemList.get(position);
        holder.txtTitle.setText(item.getName());
        holder.txtCount.setText(item.getCardCount() + "");
        if (position % 2 == 0) {
            holder.viewForeground.setBackgroundColor(ctx.getResources().getColor(R.color.colorFirst));
        } else {
            holder.viewForeground.setBackgroundColor(ctx.getResources().getColor(R.color.colorSecond));
        }
        holder.btnDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(ctx, "Delete!!!", Toast.LENGTH_SHORT).show();
            }
        });
...
...

现在onclick侦听器onBindViewHolder不起作用。 如何解决这个问题??

0 个答案:

没有答案