1

我的应用程序中有一个 ListView,在用户请求后,它可以通过在每个列表视图行的开头拖动图像视图来重新排列。我在一个小窗口中向用户展示列表视图,为了最大化空间,我将拖动视图的可见性设置为 GONE,并计划仅在用户选择需要编辑列表的菜单项时将其设置为可见项目。

这是行项目的布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:attr/activatedBackgroundIndicator"
android:orientation="horizontal" >

<ImageView
    android:id="@id/drag_handle"
    android:layout_width="32dp"
    android:layout_height="32dp"
    android:layout_margin="8dp"
    android:visibility="gone"
    android:src="@drawable/ic_drag_dots_holo_dark" />

<View
    android:layout_width="1dp"
    android:layout_height="match_parent"
    android:layout_marginBottom="16dp"
    android:layout_marginTop="16dp"
    android:background="?android:attr/dividerVertical" />

    <TextView
        android:id="@+id/drag_n_drop_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="8dp"
        android:paddingRight="8dp"
        android:maxLines="1"
        android:minHeight="24dp"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="?android:attr/textColorPrimary" />
</LinearLayout>

这是菜单选择的代码:

    @Override
public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.menu_edit_playlist:
        if (inEditMode) {
            //If we are already showing the drag view, hide it. 
            inEditMode = false;                             
            findViewById(R.id.drag_handle).setVisibility(View.GONE);
        }
        else {
            //If the drag view is hidden, make it visible. 
            inEditMode = true;
            findViewById(R.id.drag_handle).setVisibility(View.VISIBLE);
        }                       
        return true;
    default:
        return super.onContextItemSelected(item);
    }
}

这段代码的问题在于,当我调用setVisibility()它时,它只会更改列表视图第一个项目上拖动视图的可见性,而所有其他行上的拖动视图仍然隐藏。

在这种情况下,我该怎么做才能使所有行上的所有 dragViews 可见?

编辑 这是我希望它在按下编辑后的样子的图像这是它现在的样子,上面的代码。

谢谢!

4

1 回答 1

3

这段代码的问题在于,当我调用 setVisibility() 时,它只会更改列表视图第一项上的拖动视图的可见性,而所有其他行上的拖动视图仍然隐藏。

这种行为是正常的,因为您尝试View使用 , 方法从一行更改 a 的可见性,该findViewById()方法将返回布局中具有该 ID的 a 的第一次出现。View第一次出现将位于列表的第一个可见行中(无论如何该findViewById方法将不起作用,因为您可能会看到ListView' 行中的视图都将具有相同的 ID)。

在这种情况下,我该怎么做才能使所有行上的所有 dragViews 可见?

正确的方法是让适配器ListView知道它当前处于哪个状态(inEditModegetView ),并在此基础上在方法中显示/隐藏拖动句柄。完成此操作后,您要做的onContextItemSelected就是更新inEditMode状态变量并调用notifyDataSetChanged()适配器上的方法。

于 2013-02-14T12:40:51.597 回答