我有一个ListView,我在其中动态添加行项目。每行都没有孩子。现在我在这些孩子上设置点击监听器,并在其中要求我保持这些子项最终,它可以正常使用它们可以这样做,因为我在每个点击监听器上创建一个类。
这里是免费的最终复选框。
isFree.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
// TODO Auto-generated method stub
if (isFree.isChecked()){...}
}
});
但是我不认为这是一个很好的编程实践,我想使用一些功能,它应该检测哪个孩子被点击,然后我应该能够使用getParent访问它的行,然后使用getChildAt(索引)访问它的兄弟项目 所以,我用过这个:
isFree.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
// TODO Auto-generated method stub
CheckBox tv=(CheckBox) getCurrentFocus();
TableRow row = (TableRow)tv.getParent();
TextView tv1=(TextView) row.getChildAt(5);
if (tv.isChecked()){...}
}
});
但是当我使用它时,在聚焦的项目上,实际上会返回列表视图,但我希望该行中有焦点项目。
答案 0 :(得分:0)
你可以使用onItemClickListener来查看listview的哪个子节点,但是如果你想对有一些复选框或其他可点击视图的行执行某些操作,并且你想对这些点击执行某些操作那么我认为你有在这些视图上使用点击侦听器。
但是如果你想点击那些单独的视图获得listitem行,你可以使用视图类的setTag方法来存储索引,然后在你的点击监听器上获取该索引的行项。
public view getView(int position, View convertView, ..) {
....
....
....
// your code
convertView.setTag(position);
return convertView;
}
isFree.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
// TODO Auto-generated method stub
if (arg0.isChecked()){
int index = arg0.getTag();
View v = listview.getItemAtPosition(index);
// or get the adapter get data list from it and then index it.
}
}
});
注意:我没有在oncheckedchange方法中使用最终免费。
答案 1 :(得分:0)
在setOnCheckedChangeListener
方法上,第一个参数是CompoundButton
,它是CheckBox
的超类。所以,实际上,arg0是你的复选框。用它来检索父列表项并制作你的东西。
isFree.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
// TODO Auto-generated method stub
TableRow row = (TableRow)arg0.getParent();
TextView tv1=(TextView) row.getChildAt(5);
if (arg0.isChecked()){...}
}
});