有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在RecyclerView中使用字符串?

我试图为RecyclerView中的每个项目使用不同的String,但我的程序总是使用我在ArrayList中放置的第一个String,无论我点击哪个项目:

   @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, final int viewType) {
       final View v = LayoutInflater.from(mContext).inflate(R.layout.cardview, null);
        final ContentMain contentMain = mData.get(viewType);

              v.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
              
                        Toast.makeText(v.getContext(), contentMain.getMyContent(),
                                Toast.LENGTH_LONG).show();
                    }
             }    
    
        ViewHolder vHolder = new ViewHolder(v);
        return vHolder;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
        final ContentMain contentMain = mData.get(position);
        holder.myContent= mData.get(position).getMyContent();
}

共 (2) 个答案

  1. # 1 楼答案

    你不应该在onCreateViewHolder中绑定onClickListeneronCreateViewHolder的目的是构造ViewHolder,而不是将信息绑定到它

    onCreateViewHolder中有以下代码:

    final ContentMain contentMain = mData.get(viewType);

    将始终返回第一个元素,因为您的viewType为0。它没有描述职位

    将此代码移动到onBindViewHolder中,如下所示:

      @Override
      public void onBindViewHolder(final ViewHolder holder, final int position) {
            final ContentMain contentMain = mData.get(position);
            holder.myContent= mData.get(position).getMyContent();
    
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                 public void onClick(View v) {
                    Toast.makeText(v.getContext(), contentMain.getMyContent(),Toast.LENGTH_LONG).show();
                 }
            });    
     }
    
  2. # 2 楼答案

    onClick()中获取数据

    您在创建ViewHolder时使用position获取数据。它将给出错误的position,因为recyclerview必须计算布局测量值-

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int position) {
    
        final View v = LayoutInflater.from(mContext).inflate(R.layout.cardview, parent, false); //Avoid inflate layout with null parent
    
    
        v.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                final ContentMain contentMain = mData.get(getAdapterPosition());
                Toast.makeText(v.getContext(), contentMain.getMyContent(), Toast.LENGTH_LONG).show();
            }
        }    
    
        ViewHolder vHolder = new ViewHolder(v);
        return vHolder;
    }
    

    编辑:

    可能您应该在ViewHolder中定义单击侦听器-

    public static ViewHolder extends RecyclerView.ViewHolder {
        public ViewHolder(View v) {
            v.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    // Do you stuffs here...
                }
            }
        }
    }