onItemLongClick 时在所有列表元素上显示一个复选框
Show a checkbox on all list elements when onItemLongClick
我有一个示例 listView 应用程序。我的行布局如下:
<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;
}
});
使用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
到您的适配器 class 并使用默认 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
class 以将 ListView
更新为 checkbox
可见状态。
public void showCheckbox()
{
isLongPressed = true;
notifyDataSetChanged(); // Required for update
}
4. 从 onItemLongClick
:
调用 showCheckbox()
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;
}
});
希望对你有所帮助~
更改此行:
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"/>
问题出在您获得支票簿的那一行。调用 findViewById 将搜索层次结构中具有该 id 的第一个项目,在本例中是 ListView 的第一个元素。在这种情况下,您应该将其更改为 view.findViewById,因为该变量是被单击的行。
CheckBox checkBox = (CheckBox) view.findViewById(R.id.check);
虽然这会奏效,但并不完全正确,尤其是当 ListView 中有更多元素时。如果您每次需要绑定一个项目时都创建一个新视图,那么您将失去 CheckBox 的可见性。如果您正在重用视图,则 CheckBox 可能对其他行可见。
因此,最好的方法是在适配器中执行此操作。只需制作一个自定义适配器并在您想要更改视图时调用 notifyDataSetChanged() 即可。
我有一个示例 listView 应用程序。我的行布局如下:
<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;
}
});
使用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
到您的适配器 class 并使用默认 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
class 以将 ListView
更新为 checkbox
可见状态。
public void showCheckbox()
{
isLongPressed = true;
notifyDataSetChanged(); // Required for update
}
4. 从 onItemLongClick
:
showCheckbox()
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;
}
});
希望对你有所帮助~
更改此行:
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"/>
问题出在您获得支票簿的那一行。调用 findViewById 将搜索层次结构中具有该 id 的第一个项目,在本例中是 ListView 的第一个元素。在这种情况下,您应该将其更改为 view.findViewById,因为该变量是被单击的行。
CheckBox checkBox = (CheckBox) view.findViewById(R.id.check);
虽然这会奏效,但并不完全正确,尤其是当 ListView 中有更多元素时。如果您每次需要绑定一个项目时都创建一个新视图,那么您将失去 CheckBox 的可见性。如果您正在重用视图,则 CheckBox 可能对其他行可见。 因此,最好的方法是在适配器中执行此操作。只需制作一个自定义适配器并在您想要更改视图时调用 notifyDataSetChanged() 即可。