我们可以一次给 onItemLongClick、OnClick 和 OnTouch 一次给 RecyclerView 吗



我们可以一次将onItemLongClick,OnClick和OnTouch提供给RecyclerView吗?我给了所有这三个,但 onTouchListener 只能工作,如果我删除 ontouch itemclick 和 longitemclick 都在担心.如果我只给 onTouch onTouch 在剩余的 onClick 上工作,你们中的任何一个人可以让我知道我必须一次处理这三个。请让我知道,谢谢!!我在这里看到描述,我没有得到解决方案

这是我的 ListAdapter.java

class ListAdapter extensions RecyclerView.Adapter {

private List<String> mList,mList1,mList2,mList3,mList4,mList5;
private Listener mListener;
Context mcontext;

ListAdapter(List<String> list,List<String> list_1,List<String> list_2,List<String> list_3,List<String> list_4,List<String> list_5,Listener listener,Context context)
{
    this.mList = list;
    this.mList1 = list_1;
    this.mList2 = list_2;
    this.mList3 = list_3;
    this.mList4 = list_4;
    this.mList5 = list_5;
    this.mListener = listener;
    this.mcontext=context;
}
@Override
public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(
            parent.getContext()).inflate(R.layout.list_row, parent, false);
    return new ListViewHolder(view);
}
@Override
public void onBindViewHolder(final ListViewHolder holder, final int position)
{

    holder.text.setText("Destination Is:"+mList.get(position));
    holder.text_1.setText("Item Title:"+mList1.get(position));
    holder.text_2.setText("Item Date:"+mList2.get(position));
    holder.text_3.setText("Item Time:"+mList3.get(position));
    holder.text_4.setText("Item Id:"+mList4.get(position));
    holder.text_5.setText("Assigned Person:"+mList5.get(position));
    holder.frameLayout.setTag(position);
           holder.frameLayout.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    switch (motionEvent.getAction())
                    {
                        case MotionEvent.ACTION_DOWN:
                            ClipData data = ClipData.newPlainText("", "");
                            View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                                view.startDragAndDrop(data, shadowBuilder, view, 0);
                            } else {
                                view.startDrag(data, shadowBuilder, view, 0);
                            }
                            return true;
                    }
                    return false;
                }
            });
    holder.frameLayout.setOnDragListener(new DragListener(mListener));
   holder.itemView.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View view)
        {
            Toast.makeText(mcontext, ""+mList.get(position), Toast.LENGTH_SHORT).show();
            mList1.get(position);
            mList2.get(position);
            mList3.get(position);
            mList4.get(position);
            mList5.get(position);
        }
    });
    holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View view) {
            Toast.makeText(mcontext, "You Clicked So Much Time Dude", Toast.LENGTH_SHORT).show();
            ClipData data = ClipData.newPlainText("", "");
            View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                view.startDragAndDrop(data, shadowBuilder, view, 0);
            } else {
                view.startDrag(data, shadowBuilder, view, 0);
            }
            return true;
        }
    });

}

DragListener getDragInstance() {
    if (mListener != null) {
        return new DragListener(mListener);
    } else {
        Log.e("ListAdapter", "Listener wasn't initialized!");
        return null;
    }
}
@Override
public int getItemCount() {
    return mList.size();
}
List<String> getList()
{
    return mList;
}
void updateList(List<String> list) {
    mList = list;
}

}

请提这个:

public interface ClickListener {
            void onClick(View view, int position);
            void onLongClick(View view, int position);
        }
        public static class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {
            private GestureDetector gestureDetector;
            private MainActivity.ClickListener clickListener;
            public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final MainActivity.ClickListener clickListener) {
                this.clickListener = clickListener;
                gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
                    @Override
                    public boolean onSingleTapUp(MotionEvent e) {
                        return true;
                    }
                    @Override
                    public void onLongPress(MotionEvent e) {
                        View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                        if (child != null && clickListener != null) {
                            clickListener.onLongClick(child, recyclerView.getChildPosition(child));
                        }
                    }
                });
            }
            @Override
            public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
                View child = rv.findChildViewUnder(e.getX(), e.getY());
                if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
                    clickListener.onClick(child, rv.getChildPosition(child));
                }
                return false;
            }
            @Override
            public void onTouchEvent(RecyclerView rv, MotionEvent e) {
            }
            @Override
            public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
            }
        }

最后添加回收器视图项目单击侦听器,如下所述。

recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), recyclerView, new RecyclerTouchListener.ClickListener() {
            @Override
            public void onClick(View view, int position) {
                Toast.makeText(getApplicationContext(), ""+position, Toast.LENGTH_SHORT).show();
            }
            @Override
            public void onLongClick(View view, int position) {
            }
        }));

容器视图或根视图中使用 OnLongClick 侦听器,并在其子视图上设置单击侦听器。

并通过获取视图 v .get id 方法来区分它们,如下所示

public void Onclick(View v){
if (v.getId()==(Integer)R.id.container_root){
}
 if (v.getId()==(Integer)R.id.child_element){
}
}

使用这样的东西。 这可能是您的解决方案

我没有尝试过,只是根据我的理论知识编写了代码。

创建您自己的 OnTouchListener:

public class RecyclerViewOnTouchListener implements OnTouchListener {
    private final GestureDetector gestureDetector;
    public OnSwipeTouchListener (Context ctx, ListAdapter listAdapter){
        gestureDetector = new GestureDetector(ctx, new GestureDetector.OnGestureListener() {
            @Override
            public boolean onDown(MotionEvent e) {
                return false;
            }
            @Override
            public void onShowPress(MotionEvent e) {
            }
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return false;
            }
            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                return false;
            }
            @Override
            public void onLongPress(MotionEvent e) {
            }
            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                return false;
            }
        });
    }
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return true;
    }
}

在上面的代码中,单击将调用onSingleTapUp(...){},长按将调用onLongPress(...){},对于触摸onTouch(...){}将被调用。

在您的适配器中更改以下内容:

holder.frameLayout.setOnTouchListener(new View.OnTouchListener((....}

对此:

holder.frameLayout.setOnTouchListener(new RecyclerViewOnTouchListener(getContext((, this(...}

在适配器内部编写 3 个公共方法,以便在单击、长按、触摸时执行某些操作,并在 RecyclerViewOnTouchListener 类中的相应方法中调用它们。

希望这有效!让我知道!:)

最新更新