我有一个示例listView appliaction。我的行布局如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/Row">
<TextView
android:id="@+id/label"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="4" />
<CheckBox
android:id="@+id/check"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text=""
android:visibility="invisible"/>
将复选框默认设置为在所有列表项上都不可见,但是当我发生onItemLongClick事件时,我想显示它(在所有列表项上)。我尝试在onItemLongClick中将复选框设置为可见,如:
list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, "Long Click", Toast.LENGTH_SHORT).show();
CheckBox checkBox = (CheckBox) findViewById(R.id.check);
checkBox.setChecked(true);
checkBox.setVisibility(View.VISIBLE);
return true;
}
});
但是没有成功,复选框仅出现在第一个列表项上。 任何建议赞赏
更新 - 这对我有用:
list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, "Long Click", Toast.LENGTH_SHORT).show();
for(int index=0; index<parent.getChildCount(); ++index) {
View nextChild = (parent.getChildAt(index));
CheckBox checkBox = (CheckBox) nextChild.findViewById(R.id.check);
checkBox.setVisibility(View.VISIBLE);
}
CheckBox checkBox = (CheckBox) view.findViewById(R.id.check);
checkBox.setChecked(true);
return true;
}
});
答案 0 :(得分:1)
更改此行:
CheckBox checkBox = (CheckBox) findViewById(R.id.check);
对此:
CheckBox checkBox = (CheckBox) view.findViewById(R.id.check);
在这种情况下,您只是找到一个视图,而没有指定ListView
中的位置。
要在每行中显示空Checkbox
,您必须修改visibility
并将check
属性设置为false:
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="visible"
android:checked="false"/>
答案 1 :(得分:0)
使用view.findViewById(R.id.check)
代替findViewById(R.id.check)
。
试试这个:
list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, "Long Click", Toast.LENGTH_SHORT).show();
CheckBox checkBox = (CheckBox) view.findViewById(R.id.check);
checkBox.setChecked(true);
checkBox.setVisibility(View.VISIBLE);
return true;
}
});
要在所有其他行上显示空复选框:
1。在适配器类中添加额外的boolean
变量isLongPressed
,并使用适配器false
中的默认constructor
值进行初始化。
2。在您的适配器getView()
/ onBindViewHolder()
方法中添加如下条件:
CheckBox checkBox = (CheckBox) view.findViewById(R.id.check);
if(isLongPressed)
{
checkBox.setVisibility(View.VISIBLE);
} else {
checkBox.setVisibility(View.GONE);
}
3。在您的showCheckbox()
课程中添加方法adapter
,以ListView
checkbox
可见状态更新public void showCheckbox()
{
isLongPressed = true;
notifyDataSetChanged(); // Required for update
}
。
showCheckbox()
4。从onItemLongClick
致电list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, "Long Click", Toast.LENGTH_SHORT).show();
your_adapter.showCheckbox();
return true;
}
});
:
void int find(int[] values, int at, int value) {
if (values.Length >= at || at < 0) {
return -1;
} else if (values[at] == value) {
return at;
}
return find(values, at+1, value);
}
希望这会有所帮助〜
答案 2 :(得分:0)
问题出现在您获得checkbok的行上。调用findViewById将使用该id搜索层次结构中的第一个项目,在这种情况下,它是ListView的第一个元素。在这种情况下,您应该将其更改为view.findViewById,因为该变量是单击的行。
CheckBox checkBox = (CheckBox) view.findViewById(R.id.check);
虽然它会起作用,但它并不完全正确,特别是如果ListView中有更多元素。如果每次需要绑定项目时都要创建新视图,那么您将失去CheckBox的可见性。如果您正在重用视图,则CheckBox可能对其他行可见。 因此,最好的方法是在适配器中执行此操作。只需创建一个自定义适配器,并在想要更改视图时调用notifyDataSetChanged()。