如何获得RecyclerView的点击(不是孩子)

帕特里夏·李

有什么办法来设置onClickListener一个RecyclerView

我有一个RecyclerView有一些孩子的,并OnClickListener在父母上放了一个RecyclerView但是,onClick当我单击该视图时不会触发。请参阅下面的示例代码-我们希望点击父级而不是子级。在这种情况下,我们不关心项目的点击。

我曾尝试做setFocusable(false)setClickable(false)setOnClickListener(null)对孩子也没有用。无论如何,我都不认为孩子会从父母那里窃取点击,因为当我单击没有孩子的区域时,这些点击也不会注册。

package com.formagrid.hellotest;

import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.Arrays;
import java.util.List;

public class HelloActivity extends Activity {

    private RecyclerView mRecyclerView;
    private RecyclerAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hello);

        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        mAdapter = new RecyclerAdapter(Arrays.asList("hi", "this", "is", "some", "text"));
        mRecyclerView.setAdapter(mAdapter);
        mRecyclerView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d("patricia", view.toString());
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.Holder> {

        public class Holder extends RecyclerView.ViewHolder {

            protected TextView textView;

            public Holder(TextView itemView) {
                super(itemView);
                this.textView = itemView;
            }

        }

        private List<String> contents;

        public RecyclerAdapter(List<String> contents) {
            this.contents = contents;
        }

        @Override
        public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
            return new Holder(new TextView(parent.getContext()));
        }

        @Override
        public void onBindViewHolder(Holder holder, int position) {
            holder.textView.setText(contents.get(position));
        }

        @Override
        public int getItemCount() {
            return contents.size();
        }

    }

}
迈克·M

有什么办法来设置onClickListener一个RecyclerView

不能。也就是说,您可以设置一个OnClickListener,但RecyclerView永远不会调用它。RecyclerView拦截所有触摸事件,但从不调用performClick(),这是View调用其侦听器的方式。

但是,您可以OnClickListener使用OnTouchListener和来模拟an GestureDetector对于GestureDetector的侦听器,我们可以使用SimpleOnGestureListener仅实现onSingleTapUp()方法的。

class ClickListener extends GestureDetector.SimpleOnGestureListener {
    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        Toast.makeText(HelloActivity.this, "Clicked", 0).show();
        return true;
    }
};

然后,我们只需要养活GestureDetectorMotionEvent距离S OnTouchListener,并检查返回来决定是否消费的情况下,以不干扰滚动,拖拽等。

final GestureDetector detector = new GestureDetector(HelloActivity.this, new ClickListener());

mRecyclerView.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(detector.onTouchEvent(event)) {
                return true;
            }
            return false;
        }
    }
);

请注意,上面的解决方案只适用于“简单” RecyclerView,就像问题中描述和给出的那样。如果您正在使用涉及更多的项目处理(例如拖放或滑动),则需要在触摸事件链的更远处处理手势检测。

为此,我们可以RecyclerView在该dispatchTouchEvent()方法中子类化并执行检测如果检测到单击,我们将简单地调用performClick(),这将触发RecyclerViewOnClickListener

public class ClickableRecyclerView extends RecyclerView {

    private final GestureDetectorCompat detector;

    public ClickableRecyclerView(Context context) {
        this(context, null);
    }

    public ClickableRecyclerView(Context context, AttributeSet attrs) {
        super(context, attrs);
        detector = new GestureDetectorCompat(context, new ClickListener());
    }

    private class ClickListener extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            performClick();
            return true;
        }
    };

    @Override
    public boolean dispatchTouchEvent(MotionEvent e) {
        detector.onTouchEvent(e);
        return super.dispatchTouchEvent(e);
    }
}

只需使用此子类代替您的Regular RecyclerView,然后OnClickListener像往常一样在其上设置一个即可根据您实例化的方式,可能需要其他构造函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何获得div的孩子

来自分类Dev

如何获得孩子 - Firebase

来自分类Dev

如何获得被点击的元素?

来自分类Dev

如何获得上个孩子

来自分类Dev

如何获得修订ID的孩子?

来自分类Dev

如何获得父母元素的孩子?

来自分类Dev

我如何获得一个不是我的孩子的僵尸进程?

来自分类Dev

如何找到离点击位置最近的孩子?

来自分类Dev

如何获得点击次数

来自分类Dev

如何从点击按钮获得价值

来自分类Dev

如何获得被点击元素的ID

来自分类Dev

如何获得被点击元素的位置

来自分类Dev

如何找到 RecyclerView 被点击的项目?

来自分类Dev

如何判断孩子QWidget是否获得关注

来自分类Dev

如何从孩子那里获得父母的财产?

来自分类Dev

孩子退出后如何获得其状态?

来自分类Dev

如何从酶中获得反应孩子

来自分类Dev

您如何获得在firebase .on中更新的孩子?

来自分类Dev

如何获得Android电话会议的孩子?

来自分类Dev

功能组件时如何获得孩子的裁判

来自分类Dev

如何判断孩子QWidget是否获得关注

来自分类Dev

如何从孩子那里获得父母的财产?

来自分类Dev

聚合如何获得同类型的孩子

来自分类Dev

如何获得孩子在listview内的位置?

来自分类Dev

我如何获得孩子的HWNDS的句柄?

来自分类Dev

如何从孩子到父母获得状态反应

来自分类Dev

在嵌套的recyclerview情况下,没有在父recyclerview的项目上获得点击事件。如何获得两个recyclerviews?

来自分类Dev

jQuery的如何选择父母而不是孩子

来自分类Dev

jQuery的如何选择父母而不是孩子