简体   繁体   English

Android中的Recycler View不能点击

[英]Recycler View in Android not Clicking

I am working on an Android app. 我正在开发一个Android应用程序。 I am facing some problem with opening a popup menu when I click on an Item in the Recycler View. 在“回收者视图”中单击某个项目时,我在打开弹出菜单时遇到一些问题。

Show.java (the Activity containing the Recycler View). Show.java(包含“回收者视图”的活动)。 mRecycler is the object associated with the RecyclerView. 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);
        }
    }));

Code snippet for xml of RecyclerView 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 RecyclerViewClickListener.java

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

RecyclerTouchListener.java - class that implements the OnItemTouchListener 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){}
}

Nothing happens when I click an item on the RecyclerView. 当我单击RecyclerView上的任何项目时,没有任何反应。 The android system does not even acknowledge that it was clicked. android系统甚至不承认它已被单击。 Please check what is the problem with my code. 请检查我的代码有什么问题。

Would You please try this 你可以试试这个吗

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

finally put this one your activity 最后把这个放在你的活动上

public class Show extends AppCompactActivity implements PopupMenu.OnMenuItemClickListener 

hopefully by this way, You can listen your click listener. 希望通过这种方式,您可以收听点击监听器。 if it's working properly, You can set your logic. 如果工作正常,则可以设置逻辑。

If your RecyclerView items have "clickable" children in their XML file, try to declare the property: 如果您的RecyclerView项目在其XML文件中具有“可点击的”子级,请尝试声明属性:

android:clickable="false"

Leave the clickable true only on the father of your list item. 仅在列表项的项上保留clickable为true

If this is not your case, or you absolutely need clickable elements in your list item, there is another solution. 如果不是您这种情况,或者您绝对需要列表项中的可点击元素,那么还有另一种解决方案。


If you are using a RecyclerView, you should have implementend a RecyclerView Adapter somewhere in your code. 如果您使用的是RecyclerView,则应在代码中的某个地方实现RecyclerView适配器。

In the OnBindViewHolder method, try the following code: OnBindViewHolder方法中,尝试以下代码:

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

  //YOUR CODE ...

  holder.itemView.setOnTouchListener(yourOnTouchListener);

  //MORE CODE ...
}

This will set the OnTouchListener to the single ItemView at the moment the list is generated. 这将在生成列表时将OnTouchListener设置为单个ItemView。

I hope my answer is helpful and understandable enough. 我希望我的回答是有帮助的并且可以理解的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM