在onItemLongClick上显示所有列表元素的复选框

时间:2017-04-27 14:39:57

标签: android listview android-checkbox

我有一个示例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;
        }
    });

3 个答案:

答案 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()。