我的应用程序中有一个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}}现在看起来如何,使用上面的代码。
谢谢!
答案 0 :(得分:3)
这段代码的问题在于,当我调用setVisibility()时 仅更改第一项上拖动视图的可见性 列表视图和所有其他行上的dragview仍然是隐藏的。
这种行为是正常的,因为您尝试使用View
从行中更改findViewById()
的可见性,该方法将返回{的第一次次出现{1}}来自布局的id。第一次出现将位于列表的第一个可见行中(无论如何View
方法将不起作用,因为您可能会看到findViewById
行中的视图都具有相同的IDS)。
如何在此处显示所有行上的所有dragViews 情况?
正确的方法是让ListView
的适配器知道它当前处于哪种状态( inEditMode )并显示/隐藏ListView
方法中的拖动句柄基于此。完成此操作后,您需要在getView
中更新onContextItemSelected
状态变量并在适配器上调用inEditMode
方法。