【问题标题】:onClick event on ViewHolder does work inside GridViewViewHolder 上的 onClick 事件在 GridView 中确实有效
【发布时间】:2016-10-26 09:57:23
【问题描述】:

我的RecyclerView 有一个CardView,我的CardView 包含一个GridView 和其他一些TextViews

public MyCardViewHolder(View view) {
    super(view);
    this.view=view;
    gridView = (GridView) view.findViewById(R.id.gridView);
    nickNameTextView =(TextView) view.findViewById(R.id.card_nickname_textView);

    ...
}   

我在ViewHolder 上设置了OnClickListener,但是当我在GridView 内部单击时,单击事件永远不会被触发。这是OnClickListener的代码:

view.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ...
    });
}

感谢您的帮助。

【问题讨论】:

  • 你能把“this.view=view;”去掉吗我在这段代码中没有发现问题
  • "view" 代表整个视图持有者。因为我想在整个视图持有者上添加一个 onclick 事件,所以我将侦听器设置在“视图”上。所以我无法删除它。
  • 试试这个 gridView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ... }); }
  • 这是解决方法之一。但是你知道为什么父 onclick 监听器不能在它的子视图组上工作吗?
  • 子视图可以使用像 if (view instanceof Textview) 这样的 instanceof 对象

标签: android onclicklistener android-viewholder


【解决方案1】:

按照以下代码,您可以轻松地使用任何元素进行点击事件:)

public class HomeRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener {


    private List<String> mItemList;

    RecyclerView mRecyclerView;

    Context context;
    HomeItemViewHolder mHomeItemholder;

    public HomeRecyclerAdapter(List<String> itemList) {
        mItemList = itemList;
    }


    public class HomeItemViewHolder extends RecyclerView.ViewHolder {

        ImageView mImage;


        public HomeItemViewHolder(View parent) {
            super(parent);

            mImage = (ImageView) parent.findViewById(R.id.Image); 

        }

    }

    public HomeRecyclerAdapter(List<String> itemList, Context context, RecyclerView mRecyclerView) {
        this.mItemList = itemList;
        this.context = context;
        this.mRecyclerView = mRecyclerView;


    }


    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Context context = parent.getContext();

        final View view = LayoutInflater.from(context).inflate(R.layout.item_home, parent, false);


        return new HomeItemViewHolder(view);

    }


    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) {

        mHomeItemholder = (HomeItemholder) viewHolder;         


        mHomeItemholder.mImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //Handle your code
            }
        });

    }       



    public int getBasicItemCount() {
        return mItemList == null ? 0 : mItemList.size();
    }


    @Override
    public int getItemCount() {
        return getBasicItemCount(); // header

    } 


}

【讨论】:

  • 我可以通过在整个视图及其子网格视图上设置点击事件来解决这个问题。但我真的很想知道为什么内部视图组不响应其父级的点击事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 2021-04-15
  • 1970-01-01
  • 2018-03-10
  • 2015-06-02
  • 2023-03-25
  • 1970-01-01
相关资源
最近更新 更多