【问题标题】:RecyclerView onClickListener [duplicate]RecyclerView onClickListener [重复]
【发布时间】:2016-11-05 20:23:45
【问题描述】:

所以在进行了 5 个月的网络开发后,我需要重新使用 android,但我注意到我的一些旧代码不再工作了。我有一个带有数据适配器的 RecyclerView,但项目的 onClickListener 没有响应任何内容。这是我的代码的样子:

public class ProjectAdapter extends RecyclerView.Adapter<ProjectAdapter.ViewHolder> {
    private List<Project> itemsData;

    OnItemClickListener mItemClickListener;

    public ProjectAdapter(List<Project> itemsData) {
        this.itemsData = itemsData;
    }

    // Create new views (invoked by the layout manager)
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent,
                                                   int viewType) {
        // create a new views
        View itemLayoutView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_layout, parent, false);

        // create ViewHolder
        ViewHolder vh = new ViewHolder(itemLayoutView);
        return vh;
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int position) {


        viewHolder.txtViewId.setText(String.valueOf(itemsData.get(position).getId()));
        viewHolder.txtViewName.setText(itemsData.get(position).getName());


    }

    // inner class to hold a reference to each item of RecyclerView
    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        public TextView txtViewName, txtViewId;

        public ViewHolder(View itemLayoutView) {
            super(itemLayoutView);
            txtViewName = (TextView) itemLayoutView.findViewById(R.id.item_name);
            txtViewId = (TextView) itemLayoutView.findViewById(R.id.item_id);

        }

        @Override
        public void onClick(View v) {
            System.out.println("onClick");
            TextView tv = (TextView) v.findViewById(R.id.item_name);
            String id = tv.getText().toString();
            mItemClickListener.onItemClick(v, getAdapterPosition(), id); //OnItemClickListener mItemClickListener;
        }
    }

    public interface OnItemClickListener {
        public void onItemClick(View view, int position, String id);
    }

    public void SetOnItemClickListener(final OnItemClickListener mItemClickListener) {
        this.mItemClickListener = mItemClickListener;
    }

    // Return the size of your itemsData (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return itemsData.size();
    }
}

ProjectsActivity.java

projectAdapter.SetOnItemClickListener(new ProjectAdapter.OnItemClickListener() {
    @Override
    public void onItemClick(View v, int position, String id) {
        System.out.println("onItemClick" + id);
        ActionActivity(id);
    }
});

列表显示,点击不起作用,甚至没有日志到控制台。 有人知道我做错了什么吗?我使用 SDK v23 作为编译 sdk 版本。我的最低 SDK 版本是 v19。

【问题讨论】:

  • 更好。而不是让 ViewHolder 实现 View.OnClickListener... 使用您在适配器中已经拥有的那个。 mItemClickListener。将其公开,以便您可以从活动初始化,然后从那里处理它(活动)......我认为这更像是 ListView 的 itemOnclickListener...... :)。

标签: android android-recyclerview onclicklistener


【解决方案1】:

找到这样的视图后添加点击:

public ViewHolder(View itemLayoutView) {
            super(itemLayoutView);
            txtViewName = (TextView) itemLayoutView.findViewById(R.id.item_name);
            txtViewId = (TextView) itemLayoutView.findViewById(R.id.item_id);
           // here 
           itemLayoutView.setOnClickListener(this);
        }

【讨论】:

  • 哦......我的......我怎么会错过这个。太感谢了。我已经尝试将确切的代码添加到我的 onCreateViewHolder 中。太愚蠢了,我没有将它添加到 ViewHolder。
  • 需要等待1分钟才能接受^^
  • 这可能有效,但不是正确的方法。跟着这个。 stackoverflow.com/a/26196831/1137730
【解决方案2】:

第 1 步:更改构造函数

 public ProjectAdapter(List<Project> itemsData,OnItemClickListener itemClickListener) {
        this.itemsData = itemsData;
        onItemClickListener = itemClickListener;
    }

第二步:引用接口

 public MyViewHolder(View itemView) {
            super(itemView);
            itemView.setOnClickListener(this);    
}

第 3 步:将侦听器从 Activity 或 Fragment 分配给适配器

MyAdapter myAdapter = new MyAdapter (list, this);

【讨论】:

    【解决方案3】:

    将项目点击侦听器设置为回收站视图行:

    public ViewHolder(View itemLayoutView) {
            super(itemLayoutView);
            itemLayoutView.setOnClickListener(new OnClickListener() {
                  @Override
                  public void onClick(View v) {
                       TextView tv = (TextView) v.findViewById(R.id.item_name);
                       String id = tv.getText().toString();
                       mItemClickListener.onItemClick(getLayoutPosition(), v, id);
                  }
            });
            txtViewName = (TextView) itemLayoutView.findViewById(R.id.item_name);
            txtViewId = (TextView) itemLayoutView.findViewById(R.id.item_id);
    
        }
    

    【讨论】:

      【解决方案4】:

      您没有将ClickListener 设置为textView 或任何东西。 View 应该调用什么 onClick

      【讨论】:

        猜你喜欢
        • 2016-03-31
        • 1970-01-01
        • 1970-01-01
        • 2021-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 1970-01-01
        相关资源
        最近更新 更多