【问题标题】:RecyclerView click event not workingRecyclerView点击事件不起作用
【发布时间】:2018-08-29 15:40:30
【问题描述】:

由于某些原因,尽管项目显示正常,但单击事件对我的 RecyclerView 不起作用。我根据屏幕尺寸使用了 2 种不同的适配器。有谁知道它为什么不起作用以及如何解决?

recyclerview_item_gridcell(适用于大屏幕)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:padding="20dp"
    android:clickable="true"
    android:focusable="true"   
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <Button
        android:id="@+id/info_text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

recyclerview_item_textview(适用于小屏幕)

<?xml version="1.0" encoding="utf-8"?>
<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"
    />

活动类

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

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

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

RecyclerView 适配器类(适用于大屏幕)

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

【问题讨论】:

  • 您的代码看起来不错。需要检查你的根视图是否可点击。请发送您的 xml 单元格

标签: java android xml android-recyclerview android-adapter


【解决方案1】:

在您的适配器类中(两个类) 你在整个 itemview 上设置 OnClickListener 而不是在 myTextView 上设置 OnClickListener

所以它会像

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

【讨论】:

    【解决方案2】:

    检查您的根视图在 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"> ....
    

    <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"
    />
    

    更新 2

    您的线性布局没有可触摸区域。这就是为什么我们无法触发 click 方法的原因,因为该按钮填充了根。我们无法触及根元素。所以你应该在那个状态下使用 button.setClickListener。

    【讨论】:

    • 尝试用LinearLayoutCompat替换。也许它可能是错误或其他什么。
    • 那么为textview触发点击事件?
    • TextView 触发了点击事件,但由于某种原因,LinearLayout 没有触发。
    • 它现在适用于LinearLayout,但不适用于Button 本身
    • 检查我的答案..这不是由于可点击和可访问的。这是因为您在 entier itemview 而不是 textview 上设置了点击侦听器
    猜你喜欢
    • 2016-05-13
    • 2018-06-15
    • 2017-08-22
    • 2012-11-07
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多