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() 即可。