我的适配器需要一个上下文才能将资源应用于视图,因此在实例化它时,我可能会在我的活动中执行以下操作:
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 类并根据它更新适配器即可。
考虑到您正在使用myArrayItemsList的Item对象。
因此,您的列表应如下所示:
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,但不建议使用这些静态数据,因为这些数据可能会在内存中垃圾回收。