Android:更改所有列表视图行中项目的可见性

时间:2013-02-13 20:26:25

标签: android android-listview visibility android-imageview

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

以下是行项目的布局:

<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()时,它仅更改列表视图中第一项的拖动视图的可见性,并且所有其他行上的拖动视图保持隐藏状态。

在这种情况下,如何在所有行上显示所有dragView?

修改 这是image按下编辑后我希望它看起来的image,这里是{{3}}现在看起来如何,使用上面的代码。

谢谢!

1 个答案:

答案 0 :(得分:3)

  

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

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

  

如何在此处显示所有行上的所有dragViews   情况?

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