【问题标题】:Get child view inside onItemClickListener在 onItemClickListener 中获取子视图
【发布时间】:2014-08-22 09:25:52
【问题描述】:

我遇到了关于 onItemClickListener 的问题。 我有一个列表视图,其中包含一个复选框,我想点击完整的行。 当我单击一行时,应选中或取消选中复选框取决于条件。

现在的问题是我无法在 onItemClickListener 中获取复选框视图,以便我可以执行进一步的操作。

请检查以下代码:

适配器getView():

public View getView(final int position, View convertView, ViewGroup parent) {

    final ViewHolder vHolder;

    if (convertView == null) {

        vHolder = new ViewHolder();

        convertView = inflater.inflate(R.layout.row_comparelist, null);

        vHolder.chkSelected = (CheckBox) convertView
                .findViewById(R.id.cbRow);
        vHolder.chkSelected.setId(position);

        convertView.setTag(vHolder);
        vHolder.chkSelected.setTag(listObjects.get(position));

    } else {
        vHolder = (ViewHolder) convertView.getTag();

        vHolder.chkSelected.setTag(listObjects
                .get(position));

    }

    vHolder.chkSelected.setChecked(listObjects.get(position).getSelected());
    return convertView;
}

Activity onItemClick:

@Override
public void onItemClick(AdapterView<?> adapter, View view, int pos, long arg3) {
    // TODO Auto-generated method stub
    CheckBox cb = (CheckBox) view.findViewById(R.id.cbRow);
}

在上面的代码中它总是返回空值。

还有什么解决办法?

编辑: 我知道我可以通过设置 OnCheckedChangeListener 或 onClickListener 在适配器内部执行此操作,但由于其他条件我无法执行此操作。所以请提出一个只能与 onItemClickListener 一起使用的解决方案。

【问题讨论】:

    标签: android android-listview adapter


    【解决方案1】:

    您为 onClick 编写的代码完全正确,但从该行返回 null 的来源是:

    vHolder.chkSelected.setId(position);
    

    您正在将项目的R.id.cbRow 的值更改为position 的值! 因此,当您尝试通过 R.id.cbRow 的值检索视图时,它必须返回 null。

    【讨论】:

      【解决方案2】:

      在 getview() 函数中使用它。在适配器类中..

      vHolder.chkSelected.setOnClickListener(this);
      

      并在getview()方法后为复选框添加点击监听

          @Override
          public void onClick(View view) {
              try {
                  CheckBox cb = (CheckBox) view;
                  int id = cb.getId();
                   // do your code here..
      
              } catch (Exception e) {
                  // TODO: handle exception
                  e.printStackTrace();
              }
          }
      

      编码愉快!!

      【讨论】:

      • 感谢您的回复,但我不想在适配器内设置监听器。我需要在 onItemClick 里面做,因为有一些条件。有没有可以使用 onItemClick 的解决方案?
      • 使用 onItemclick 监听器无法获取任何视图的 id。
      • 我想获取视图而不是 id。
      • 在 listitemclick() 监听器上试试这个 CheckBox cb = (CheckBox) YourListViewObject.getChildAt(pos).findViewById(R.id.cbRow);
      • 同样的结果。返回 null。
      【解决方案3】:

      只需在 getView 方法中获取复选框所在的主布局 ID,然后单击该布局即可更改复选框的选择。 例如。 你有 XML

      <LinearLayout
        android:id="@linear_layout"
        android:layout_width....  >
        <CheckBox
         android:id="@checkBox"     
         android:layout_width.../>
      </LinearLayout>
      

      现在在 getView 中

       LinearLayout linLay = findViewById(R.id.linear_layout);
       CheckBox checkBox = findViewById(R.id.checkBox);
      

      linlay.setOnClickListener(new OnClick...{
      
      checkBox.setChecked(!checkBox.isChecked());
      
      });
      

      也检查this

      【讨论】:

      • 查看答案末尾的链接。
      • 我没有使用 ListActivity。
      • 您也可以在 onItemClick(AdapterView> adapter, View view, int pos, long arg3){} 中使用它。您只需要查看。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多