在onItemClickListener中获取子视图

时间:2014-08-22 09:25:53

标签: android android-listview adapter

我遇到了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;
}

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

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

其他解决方案是什么?

编辑: 我知道我可以通过设置OnCheckedChangeListener或onClickListener在Adapter内部完成它,但由于其他条件,我无法做到这一点。所以请建议一个只能与onItemClickListener一起使用的解决方案。

3 个答案:

答案 0 :(得分:2)

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

vHolder.chkSelected.setId(position);

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

答案 1 :(得分:1)

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

快乐编码!!

答案 2 :(得分:0)

只需获取checkBox在getView方法中的主布局ID,然后单击该布局就会更改checkBox的选择。 例如。 你有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