onClickListener不能使用RecyclerView项目

时间:2016-10-11 09:30:02

标签: android android-recyclerview onclicklistener

我的主要活动(包含RecyclerView的活动)如下所示:

myList = (RecyclerView) findViewById(R.id.my_list);
myAdapter = new MyAdapter(this, getData());
myList.setAdapter(myAdapter);
myList.setLayoutManager(new LinearLayoutManager(this));

然后我有一个MyViewHolder,

public class MyViewHolder extends RecyclerView.ViewHolder {
    ...
    public Button addButton;
    public View root;
    public MyViewHolder(View itemView) {
        super(itemView);
        ...
        addButton = (Button) itemView.findViewById(R.id.add_button);
        root = itemView;
    }
    ...
}

然后是适配器

public class MyAdapter extends RecyclerView.Adapter <MyViewHolder>{
    private LayoutInflater myInflater;

    List<MyModel> data = Collections.emptyList();

    Context context;

    public MyAdapter (Context context, List<MyModel> data) {
        myInflater = LayoutInflater.from(context);
        this.data = data;
        this.context = context;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = myInflater.inflate(R.layout.my_item, parent, false);
        MyViewHolder myViewHolder = new MyViewHolder(view);
        return myViewHolder;
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, int position) {
        ...
        holder.addButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d("Hello", "Added");
            }
        });
        holder.root.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d("Hello", "Rooted");
            }
        });
    }
...
}

从上面可以看出,我有一个RecyclerView项目,它有一个按钮作为孩子。在单击childButton时,onClickListener正常工作,我打印出Added。但当我点击整个项目(根)时,没有任何反应。为什么root onClickListener不起作用?

我是Android的真正初学者,所以我不确定我哪里出错了。

修改

my_item.xml看起来像:

<LinearLayout>
    <RelativeLayout
         android:clickable="true"> <-- this is the problem as correctly pointed out by user13
        <RelativeLayout>
            <TextView>
            <LinearLayout>
                <TextView>
                <TextView>
                <TextView>
            </LinearLayout>
        </RelativeLayout>
        <RelativeLayout>
            <Button>
            <Button>
        </RelativeLayout>
    </RelativeLayout>
</LinearLayout>

2 个答案:

答案 0 :(得分:2)

您可能需要将以下属性添加到 my_item.xml 中的根kurt@kurt-ThinkPad:~$ netstat -a | grep 8080 kurt@kurt-ThinkPad:~$

LinearLayout

答案 1 :(得分:0)

您需要添加onTouch侦听器,在项目中添加以下内容

ClickListener.java

  public interface ClickListener {
        void onClick(View view, int position);

        void onLongClick(View view, int position);
    }

RecyclerTouchListener .java

public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {

        private GestureDetector gestureDetector;
        private ClickListener clickListener;

        public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final 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)    {

        }
    }

现在你设置适配器的地方就像这样使用这个类

  myList .addOnItemTouchListener(new RecyclerTouchListener(this, myList , new ClickListener() {
            @Override
            public void onClick(View view, int position) {
              //do your stuff on click
            }

            @Override
            public void onLongClick(View view, int position) {
                //do your stuff on ling click
            }
        }));

    }