Java RecyclerView单击事件不工作

Java RecyclerView单击事件不工作,java,android,xml,android-recyclerview,android-adapter,Java,Android,Xml,Android Recyclerview,Android Adapter,由于某些原因,尽管项目显示正常,但单击事件对my RecyclerView不起作用。根据屏幕大小,我使用了两种不同的适配器。有人知道它为什么不起作用以及如何修复吗 recyclerview\u item\u gridcell(用于较大屏幕) RecyclerView适配器类(用于较小屏幕) 公共类MyRecycleServiceAdapterll扩展了RecycleView.Adapter{ 私有字符串[]mData; 私人停车场; 私有MyRecycleServiceAdapterll.Ite

由于某些原因,尽管项目显示正常,但单击事件对my RecyclerView不起作用。根据屏幕大小,我使用了两种不同的适配器。有人知道它为什么不起作用以及如何修复吗

recyclerview\u item\u gridcell(用于较大屏幕)

RecyclerView适配器类(用于较小屏幕)

公共类MyRecycleServiceAdapterll扩展了RecycleView.Adapter{
私有字符串[]mData;
私人停车场;
私有MyRecycleServiceAdapterll.ItemClickListener McClickListener;
MyRecycleServiceAdapterll(上下文,字符串[]数据){
this.mInflater=LayoutInflater.from(上下文);
this.mData=数据;
}
@凌驾
@非空
public MyRecycleServiceAdapterll.ViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
视图=最小充气器。充气(R.layout.recyclerview\u item\u textview,父项,false);
返回新的MyRecycleServiceAdapterll.ViewHolder(视图);
}
@凌驾
BindViewHolder上的公共无效(@NonNull myRecycleServiceAdapterll.ViewHolder,int位置){
holder.myTextView.setText(mData[position]);
}
@凌驾
public int getItemCount(){
返回mData.length;
}
公共类ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
文本视图myTextView;
ViewHolder(视图项视图){
超级(项目视图);
myTextView=itemView.findViewById(R.id.item\u text);
setOnClickListener(这个);
}
@凌驾
公共void onClick(视图){
if(mClickListener!=null)mClickListener.onItemClick(视图,getAdapterPosition());
}
}
字符串getItem(int-id){
返回mData[id];
}
void setClickListener(myRecycleServiceAdapterLL.ItemClickListener ItemClickListener){
this.mClickListener=itemClickListener;
}
公共接口项ClickListener{
void onItemClick(视图,int位置);
}
}
RecyclerView适配器类(用于较大屏幕)

公共类MyRecycleServiceAdapterGL扩展了RecycleView.Adapter{
私有字符串[]mData;
私人停车场;
私有项ClickListener McClickListener;
MyRecycleServiceAdapterGL(上下文,字符串[]数据){
this.mInflater=LayoutInflater.from(上下文);
this.mData=数据;
}
@凌驾
@非空
public MyRecycleServiceAdapterGL.ViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
View=mInflater.inflate(R.layout.recyclerview\u item\u gridcell,父项,false);
返回新的MyRecycleServiceAdapterGL.ViewHolder(视图);
}
@凌驾
public void onBindViewHolder(@NonNull ViewHolder,int位置){
holder.myTextView.setText(mData[position]);
}
@凌驾
public int getItemCount(){
返回mData.length;
}
公共类ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
文本视图myTextView;
ViewHolder(视图项视图){
超级(项目视图);
myTextView=itemView.findViewById(R.id.info\u text);
setOnClickListener(这个);
}
@凌驾
公共void onClick(视图){
if(mClickListener!=null)mClickListener.onItemClick(视图,getAdapterPosition());
}
}
字符串getItem(int-id){
返回mData[id];
}
void setClickListener(myRecycleServiceAdapterGL.ItemClickListener ItemClickListener){
this.mClickListener=itemClickListener;
}
//父活动将实现此方法以响应单击事件
公共接口项ClickListener{
void onItemClick(视图,int位置);
}
}

检查您的根视图在xml单元格中是否可单击和聚焦。你们应该能够看到触地时的涟漪

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:padding="20dp"
android:layout_width="match_parent"
android:clickable="true"
android:focusable="true"
android:layout_height="wrap_content"> ....
。。。。


更新2

您的线性布局没有可接触区域。这就是为什么我们不能触发单击方法,因为该按钮填充根。我们无法接触根元素。因此,您应该在该状态下使用button.setClickListener。

在适配器类中(两个类) 您可以在整个itemview上设置
OnClickListener
,而应该在
myTextView上设置
OnClickListener

那就好像

myTextView = itemView.findViewById(R.id.info_text);
            myTextView.setOnClickListener(this);

你的代码看起来不错。需要检查根视图是否可单击。请发送单元格的xml,以将其替换为LinearLayoutCompat。可能是错误或其他原因。因此,文本视图会触发click事件?文本视图会触发click事件,但由于某些原因,它不适用于
LinearLayout
。它现在适用于
LinearLayout
,但不适用于
按钮本身。请检查我的答案。这不是因为可点击和可犯规。这是因为您在整个项目视图上设置了click listener,而不是在文本视图上设置了click listener
public class MainActivity extends Activity implements MyRecyclerViewAdapterGL.ItemClickListener, MyRecyclerViewAdapterLL.ItemClickListener {

    boolean themeState;
    MyRecyclerViewAdapterGL adapterGL;
    MyRecyclerViewAdapterLL adapterLL;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        boolean isScreenSmall = getResources().getBoolean(R.bool.is_screen_small);

        setContentView(R.layout.activity_main);

        String[] dataArray = {"Item A", "Item B", "Item C", "Item D" ,"Item E" ,"Item F"};

        if(isScreenSmall){
            // ItemDecoration for small devices
            RecyclerView recyclerViewLL = findViewById(R.id.recyclerView_list);
            recyclerViewLL.setLayoutManager(new LinearLayoutManager(this));
            adapterLL = new MyRecyclerViewAdapterLL(this, dataArray);
            adapterLL.setClickListener(this);
            recyclerViewLL.addItemDecoration(new DividerItemDecoration(this, LinearLayout.VERTICAL));
            recyclerViewLL.setAdapter(adapterLL);
        }
        else{
            // ItemDecoration for large devices
            RecyclerView recyclerViewGL = findViewById(R.id.recyclerView_list);
            int numberOfColumns = 2;
            recyclerViewGL.setLayoutManager(new GridLayoutManager(this, numberOfColumns));
            adapterGL = new MyRecyclerViewAdapterGL(this, dataArray);
            adapterGL.setClickListener(this);
            recyclerViewGL.setAdapter(adapterGL);
        }
    }

    @Override
    public void onItemClick(View view, int position) {
        if (position == 0) {
            Toast.makeText(MainActivity.this, "Item A was clicked", LENGTH_SHORT).show();
        } else if (position == 1) {
            Toast.makeText(MainActivity.this, "Item B was clicked", LENGTH_SHORT).show();
        } else if (position == 2) {
            Toast.makeText(MainActivity.this, "Item C was clicked", LENGTH_SHORT).show();
        }
    }
}
public class MyRecyclerViewAdapterLL extends RecyclerView.Adapter<MyRecyclerViewAdapterLL.ViewHolder> {

    private String[] mData;
    private LayoutInflater mInflater;
    private MyRecyclerViewAdapterLL.ItemClickListener mClickListener;

    MyRecyclerViewAdapterLL(Context context, String[] data) {
        this.mInflater = LayoutInflater.from(context);
        this.mData = data;
    }

    @Override
    @NonNull
    public MyRecyclerViewAdapterLL.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.recyclerview_item_textview, parent, false);
        return new MyRecyclerViewAdapterLL.ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyRecyclerViewAdapterLL.ViewHolder holder, int position) {
        holder.myTextView.setText(mData[position]);
    }

    @Override
    public int getItemCount() {
        return mData.length;
    }


    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView myTextView;

        ViewHolder(View itemView) {
            super(itemView);
            myTextView = itemView.findViewById(R.id.item_text);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
        }
    }

    String getItem(int id) {
        return mData[id];
    }

    void setClickListener(MyRecyclerViewAdapterLL.ItemClickListener itemClickListener) {
        this.mClickListener = itemClickListener;
    }

    public interface ItemClickListener {
        void onItemClick(View view, int position);
    }
}
public class MyRecyclerViewAdapterGL extends RecyclerView.Adapter<MyRecyclerViewAdapterGL.ViewHolder> {

    private String[] mData;
    private LayoutInflater mInflater;
    private ItemClickListener mClickListener;

    MyRecyclerViewAdapterGL(Context context, String[] data) {
        this.mInflater = LayoutInflater.from(context);
        this.mData = data;
    }

    @Override
    @NonNull
    public MyRecyclerViewAdapterGL.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.recyclerview_item_gridcell, parent, false);
        return new MyRecyclerViewAdapterGL.ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.myTextView.setText(mData[position]);
    }

    @Override
    public int getItemCount() {
        return mData.length;
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView myTextView;

        ViewHolder(View itemView) {
            super(itemView);
            myTextView = itemView.findViewById(R.id.info_text);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
        }
    }

    String getItem(int id) {
        return mData[id];
    }

    void setClickListener(MyRecyclerViewAdapterGL.ItemClickListener itemClickListener) {
        this.mClickListener = itemClickListener;
    }

    // parent activity will implement this method to respond to click events
    public interface ItemClickListener {
        void onItemClick(View view, int position);
    }
}
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:padding="20dp"
android:layout_width="match_parent"
android:clickable="true"
android:focusable="true"
android:layout_height="wrap_content"> ....
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/item_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:focusable="true"
android:background="?android:attr/selectableItemBackground"
/>
myTextView = itemView.findViewById(R.id.info_text);
            myTextView.setOnClickListener(this);