【问题标题】:Editable list of items on App preferences?应用偏好上的可编辑项目列表?
【发布时间】:2014-03-08 03:47:16
【问题描述】:

我正在尝试在我的应用首选项中执行类似于 iOS 可编辑 UITableView 的操作。基本上它是一个列表,用户可以在其中添加、删除或重新排序。我确定这是一个常见问题,但我没有找到任何关于如何做到这一点的示例。

现在我正在尝试通过嵌套两个 PreferenceScreens 并在它们之间移动项目来做到这一点:

我将项目存储在两个不同的数组中(“添加”项目和“未添加”项目)并使用addPreference() 动态构建两个屏幕但是我不确定这是否是个好主意,也不知道如何让用户删除和重新排序项目。

如何做到这一点?

【问题讨论】:

    标签: android uitableview listview


    【解决方案1】:

    由于我无法找到重新排序PreferenceScreen 的方法,因此采用了另一种方法。例如,您可以定义一个Activity,并在两个ListViews 内定义。这个想法是在它们两个上使用visibility 属性,所以每次你都可以设置为visible 其中一个和gone 另一个,或者gone 两者如果你需要做类似于您的第一个屏幕截图。

    您需要为它们中的每一个扩展一个ArrayAdapter(或者只有一个ArrayAdapter 并将其用于ListViews,更改布局或初始数据集,或两者兼而有之)。就布局而言,您可以简单地使用LinearLayout 定义一个自定义布局,并在其中定义一个ImageView 和一个TextView,以实现屏幕截图中显示的布局效果,如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#000000"
        android:orientation="horizontal" >
    
        <ImageView
            android:id="@+id/layoutImage"
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:layout_weight="2" 
            android:background="@drawable/..."/>
    
        <TextView
            android:id="@+id/layoutText"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="8"
            android:layout_gravity="left"
            android:numLines="1"
            android:textSize="18sp" />
    </LinearLayout>
    

    定义后,您的自定义ArrayAdapter 的第二个参数是布局,因此您只需将R.id.your_new_layout 引用传递给它,就会使用它创建行。

    对于项目的删除,这很容易实现,因为您可以简单地在自定义适配器的 getView() 方法中定义一个 onClickListener() 并从数据集中删除该项目(您将在 ArrayAdapter 中跟踪) . ListView 具有 notifyDataSetChanged() 方法,可以自动从列表中删除项目,您甚至可以添加动画以使其在视觉上更具吸引力。

    在这种情况下,重新排序选项似乎是最费力的。 ListView 默认情况下将按“自己的顺序”呈现行,这意味着基本上你会看到它未排序。这可以避免在您的ArrayAdapter 上调用.sort() 方法,但是您也不希望这样做,因为您希望允许您的用户以他们的方式重新排序列表,所以我只有两个想法(他们都没有经过测试):

    • 尝试使用 onDragEvent 实现此目的。根据this,您可能能够处理拖动您的ListView 的一行来处理一些事件。通过这种方式,您可能会看到用户将物品放在哪里,并在您的Adapter 中重新排序List 以保持这种状态。

    • 外部库。似乎有一些外部库已经实现了这一点,例如,您可能希望看到this、this 和this。

    这种方法的主要好处是您可以将两个数据集放在同一个 Activity 中,这样您就可以访问两个适配器,并且您可以轻松地将数据从一个实例移动到另一个实例,调用 @ 987654354@ 与View.VISIBLE 或View.GONE 对您需要的ListView,所以它使流程更容易。

    【讨论】:

      【解决方案2】:

      没有直接的方法可以做到这一点。
      但是this 的实现应该是您所需要的,只需稍作调整即可。
      从here下载源代码。

      【讨论】:

        【解决方案3】:

        我建议使用DragSortListView,就像您可以在 Google Play 音乐中找到的那样。

        This implementation 特别好,既易于集成又性能极佳。它应该适合您对重新排序/删除部分的需求。

        【讨论】:

          猜你喜欢
          • 2015-07-17
          • 1970-01-01
          • 2021-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-27
          相关资源
          最近更新 更多