使用活动属性时的 Android 适配器最佳做法



我的适配器需要一个上下文才能将资源应用于视图,因此在实例化它时,我可能会在我的活动中执行以下操作:

myAdapter = new MyAdapter(this);

由于我的适配器也需要来自活动的数据,因此我可能会这样做:

myAdapter = new MyAdapter(myItemsArrayList,this);

由于我的适配器可能还需要知道选择了 ArrayList 中的哪些项目,因此我也可能传递该列表:

myAdapter = new MyAdapter(myArrayItemsList,mySelectedItemsArrayList,this);

由于可能还有其他状态(例如,是否在人员列表中显示照片(,构造函数调用开始变得相当冗长:

myAdapter = new MyAdapter(myArrayItemsList,mySelectedItemsArrayList,myPreference1,myPreference2,this);

鉴于此适配器的唯一使用位置是来自特定活动,仅将活动中的这些属性公开,以便我可以通过已传递的活动(例如myActivity.myArrayItemsList(访问它们会有多糟糕?

非常感谢您的任何建议!

鉴于此适配器的唯一使用位置是来自特定活动,那么仅公开活动中的这些属性,以便我可以通过已传递的活动(例如myActivity.myArrayItemsList(访问它们会有多糟糕?

这是一个糟糕的代码和不良行为。你的代码将紧密耦合。通常,你会在下一个项目中借用相同的行为。

可以通过将 State 对象传递给适配器来简化它,而不是将每个状态传递给构造函数。创建 State 类,如下所示:

public class State {
List<String> selectedItems;
boolean displayPeople;
}

然后,您可以创建一个简单的构造函数,如下所示:

State state = new State();
state.selectedItems = mSelectedItems;
state.displayPeople = true;
myAdapter = new MyAdapter(items, state, this);

因此,每当需要更新新状态时,只需将其添加到 State 类并根据它更新适配器即可。

考虑到您正在使用myArrayItemsListItem对象。

因此,您的列表应如下所示:

ArrayList<Item> myArrayItemsList = new ArrayList();

然后,您想在列表中添加选定的项目,您可以向Item对象添加一个布尔值,例如:

public class Item {
private String itemName;
private boolean selected = false;
public Item(){}
public String getItemName() {
return itemName;
}
public void setItemName(String itemName) {
this.itemName= itemName;
}
public boolean isSelected () {
return selected;
}
public void setSelected(boolean selected) {
this.selected= selected;
}

}

如果选择了该项目,只需在适配器中检查您的项目列表即可。

因此,您的适配器只会传递两个参数:

MyAdapter myAdapter = new MyAdapter(myArrayItemsList, this);

但话又说回来,你只想在适配器中传递一个参数,你可以将 ArrayList 设置为静态

public static ArrayList<Item> myArrayItemsList = new ArrayList();

并仅将此适配器传递给您的适配器

MyAdapter myAdapter = new MyAdapter(this);

在适配器中使用了静态 ArrayList,但不建议使用这些静态数据,因为这些数据可能会在内存中垃圾回收。

最新更新