【问题标题】:Best way to keep track of an object in a list?跟踪列表中对象的最佳方法?
【发布时间】:2015-01-13 22:48:15
【问题描述】:

所以我有一个对象 Size 看起来像这样:

public class Size {
    private String name;
    private double price;
    private boolean selected;
}

然后我有一个尺寸列表:

private ArrayList<Size> sizes;

现在我想跟踪选择了该列表中的哪个大小。现在我使用选择的布尔属性,不确定这是否是最好或最干净的方法。我提到这一点的原因是当我选择不同的大小时 我必须遍历整个列表并将 selected 更改为 false ,除非它是我想要的那个。我觉得这太复杂了,我想知道是否有更好/更清洁的解决方案。

【问题讨论】:

  • 您可以保留选择项的索引。
  • 您是否一次只选择了一种尺寸?
  • 大概,sizes 是您的一个类中的一个字段。为什么不向该类添加一个private Size selectedSize 字段?
  • 解释如何选择对象。您使用什么样的用户界面来允许选择?还有你的 Size 对象的原始来源是什么?
  • @Claud25 : ListView 扩展 AdapterViewListView 本身的生命周期内保持选定项目的位置,即使选定的项目滚动到屏幕外。即使所选项目不可见,您也可以随时致电getSelectedItemPosition()。这是我为列表项保存所选项目位置的方式(使用SharedPreferences),因此如果用户关闭我的应用程序,我可以在下次使用该应用程序时使用setSelection(int position)自动重新选择项目。

标签: java android oop


【解决方案1】:

Size 类应该是名称和价格的容器(大概)。

使用它来存储选择状态是违反Single Responsibility Principle的。


你可以使用类似下面的东西。

Selectable.java

public class Selectable<E> {

    /**
     * Selects the specified element if it is possible.
     *
     * @param element the element tot be selected.
     * @return true if selection is successful, false otherwise.
     */
    public boolean select(E element);

    /**
     * Returns selected element if any.
     * 
     * @return The selected element if any element is selected.
     * @throws NoSuchElementException if no element is selected.
     */
    public E getSelected() throws NoSuchElementException;
}

SelectableArrayList.java

public class SelectableArrayList<E> extends ArrayList<E> implements Selectable<E> {

    private E selected;    // Can also be implemented using an index.

    public SelectableArrayList() {
        super();
        this.selected = null;
    }

    @Override
    public boolean select(E element) {
        if (super.contains(element)) {
            this.selected = element;
            return true;
        } else {
            return false;
        }
    }

    @Override
    public E getSelected() throws NoSuchElementException {
        if (this.selected == null) {
            throw new NoSuchElementException("No element is selected in the list.");
        } else {
            return this.selected;
        }
    }
}

希望这会有所帮助。
祝你好运。

【讨论】:

  • 试试这个,似乎符合我想要的,我正在寻找类似单一责任原则的东西。
【解决方案2】:

为什么不保留对单独的Size 变量的引用? 像这样的:

public class Size {
    private String name;
    private double price;
    private boolean selected;
}

public class example {
    private Size selectedSize;
    private ArrayList<Size> sizes;

    public example() {
        Size s1 = new Size();
        Size s2 = new Size();
        Size s3 = new Size();

        sizes.add(s1);
        sizes.add(s2);
        sizes.add(s3);

        if (someCondition == true){
            // Select s1
            selectedSize = s1;
        }
    }
}

【讨论】:

  • 我有类似的东西,但我想补充一下我还想跟踪尺寸的问题,所以它被突出显示。所以当 selectedSize 为 s2 时,我想在 ArrayList 中突出显示 s2。
【解决方案3】:

您可以保留选择项的索引。

【讨论】:

    【解决方案4】:

    保留对选定Size 的引用,例如在您拥有private ArrayList&lt;Size&gt; sizes; 的同一类中,并在每次选择另一个Size 时更新该引用。

    【讨论】:

      猜你喜欢
      • 2023-01-17
      • 2021-03-27
      • 2010-10-18
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多