Android中的Recycler View不点击

时间:2017-05-21 13:44:10

标签: java android android-recyclerview

我正在开发Android应用。当我点击Recycler View中的Item时,我在打开弹出菜单时遇到了一些问题。

Show.java(包含Recycler View的Activity)。 mRecycler是与RecyclerView相关联的对象。

mRecycler.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), mRecycler, new RecyclerViewClickListener() {
        @Override
        public void onClick(View view, final int position) {
            PopupMenu menu = new PopupMenu(Show.this,mRecycler);
            MenuItem itemView = (MenuItem) findViewById(R.id.three);
            if(method.equals("Completed"))
                itemView.setTitle("Mark as imcomplete");
            menu.getMenuInflater().inflate(R.menu.menu_popup,menu.getMenu());

            menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){
                public boolean onMenuItemClick(MenuItem item){
                    int id=item.getItemId();
                    switch (id){
                        case R.id.one:
                            Intent intent = new Intent(Show.this,Add.class);
                            intent.putExtra("Task",tasks.get(position));
                            startActivity(intent);
                            finish();
                            startActivity(getIntent());
                            break;
                        case R.id.two:
                            deleteRecord(position);
                            break;
                        case R.id.three:
                            toggleComplete(position);
                    }
                    return true;
                }
            });

        }

        @Override
        public void onLongClick(View view, int position) {
            onClick(view,position);
        }
    }));

RecyclerView xml的代码段

<android.support.v7.widget.RecyclerView
        android:id="@+id/recycler"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:scrollbars="vertical"
        android:clickable="true"
        android:contextClickable="true"
        android:longClickable="true" />

RecyclerViewClickListener.java

public interface RecyclerViewClickListener {
    void onClick(View view,int position);
    void onLongClick(View view,int position);
}

RecyclerTouchListener.java - 实现OnItemTouchListener的类

public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener{
    private GestureDetector gestureDetector;
    private RecyclerViewClickListener clickListener;

    public RecyclerTouchListener (Context context,final RecyclerView recyclerView,
                                  final RecyclerViewClickListener 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.getChildAdapterPosition(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.getChildAdapterPosition(child));
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv,MotionEvent e){}

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntecept){}
}

单击RecyclerView上的项目时没有任何反应。 android系统甚至不承认它被点击了。请检查我的代码有什么问题。

2 个答案:

答案 0 :(得分:1)

请你试试这个

mRecyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), mRecyclerView, new ClickListener() {
            @Override
            public void onClick(View view, int position) {
                menuCardIndex = position;
                PopupMenu popupMenu = new PopupMenu(Show.this, view);
                popupMenu.setOnMenuItemClickListener(Show.this);
                popupMenu.inflate(R.menu.menu_popup);
                popupMenu.show();
            }

            @Override
            public void onLongClick(View view, int position) {
            }
        }));

@Override
public boolean onMenuItemClick(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.one:
            Your_First_Operation;
            return true;
        case R.id.two:
            Your_Second_Operation;
            return true
        case R.id.three:
            Your_Third_Operation;
            return true
    }
    return false;
}

最后把这个作为你的活动

public class Show extends AppCompactActivity implements PopupMenu.OnMenuItemClickListener 

希望通过这种方式,你可以听你的点击监听器。如果它正常工作,你可以设置你的逻辑。

答案 1 :(得分:0)

如果您的RecyclerView项目的XML文件中包含“可点击”子项,请尝试声明该属性:

android:clickable="false"

仅将可点击的 true 保留在列表项的上。

如果您不是这种情况,或者您绝对需要列表项中的可点击元素,则还有另一种解决方案。

如果您使用的是RecyclerView,则应在代码中的某处实施RecyclerView适配器。

OnBindViewHolder 方法中,尝试以下代码:

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {

  //YOUR CODE ...

  holder.itemView.setOnTouchListener(yourOnTouchListener);

  //MORE CODE ...
}

这将在生成列表时将OnTouchListener设置为单个ItemView。

我希望我的答案有用且可以理解。