有人向我推荐了两种不同的方法,这让我很困惑。
ParseQuery<ParseUser>query=ParseUser.getQuery();
query.include("addressPointer");
query.getInBackground(currentUser.getObjectId(), new GetCallback<ParseUser>() {
@Override
public void done(ParseUser parseUser, ParseException e) {
if (e==null){
List<ParseAddress> list=parseUser.getList("addressPointer");
if (list!=null){
for (ParseAddress address:list){
//Load data and add to mAdapter. This is where Im confused
}
mAdapter.notifyDataSetChanged();
}else {
Log.d(TAG, "address are 0");
Toast.makeText(MyAddress.this, "You have no addresses saved", Toast.LENGTH_LONG).show();
}
}else {Log.d(TAG, "error "+e.getMessage());}}});
所以据我所知,我有两个选择,一个是定义一个名为 AppAddress() 的对象,我可以在其中从该对象加载数据,然后像这样将其添加到适配器
//In onCreate
List<AppAddress> mAddressList=null;
//In the for loop.
AppAddress mAddress=new AppAddress();
mAddress.setName(address.getName());
mAddress.setCity(address.getCity());
mAddress.setPinCode(address.getPinCode());
mAddress.setPhoneNumber(address.getNumber());
mAddress.setAddress(address.getAddress());
mAddressList.add(mAddress);
或者我忘记了名为 AppAddress 的自定义对象类,并使用我已经定义并用于从“地址”对象获取数据的名为 ParseAddress 的子类。在那种情况下代码将是这样的
List<ParseAddress> mList=null;
//In the for loop
mList=new ArrayList<>();
mList.add(address);
在这两种情况下,我的 recyclerView 将从 public MyAddressAdapter(Context context, List<AppAddress> list)
变为至 public MyAddressAdapter(Context context, List<ParseAddress> list)
然后我在 onBindViewHolder() 函数中填写数据。我可以同时执行这两项操作,但假设 recyclerView 将具有用于“编辑”和“删除”这些“地址”类对象的按钮,哪一个会更好。
编辑:所以我想我会坚持使用第一种方法。到目前为止,我正在定义 getter 和 setter 并通过这种方式移动数据。
ParseObject--> AppAddress --> RecyclerView行--> 用户编辑和更改AppAddress实体中的数据--> 更新关联的解析对象。这是我将要使用的流程。为了最后一步的工作,我需要为原始 ParseObject (ParseAddress) 设置 setter 和 getter 是否正确?
编辑 编辑:这两种方法都可以工作,但第一种方法在未来允许更大的灵 active ,因为 App Address 对象现在甚至可以是一个或多个解析对象的组合,或者具有与之关联的单独属性。感谢 Andrey Elizarov。除了数据之外,我还传递了 Parse Object 的对象 ID 并使用 createWithNoData("Address", "objectId)
重新创建对象最佳答案
只要您使用原始对象的深拷贝,就不变性而言,这两种方式都是正确的。 但是为了分担责任,我会选择第一个。但如果是简单的双线项目,第二条就足够了。
更新: 一般来说,第二种方法意味着您的业务对象(在本例中为 ParseAddress)将永远不会改变。它将无限期地保持相同的领域和方法。就像 100 年后)但在现实世界中, future 总是有重构的可能性。
从概念上讲,您有两个不同的实体。一个存储在 Parse 中,另一个用于操作,在您的案例中显示在 RecycleView 中。
问问你自己——如果有必要在这个类中添加一个方便有用的方法,我将如何进行?我真的需要 ParseAddress 的所有原始字段吗?这些字段应该以这种方式输入和格式化吗?
这样的区分也会使代码更简洁、更易读。另一方面,创建对象的操作并不昂贵。
您甚至可以制作隐式地进行深层复制的构造函数。
AppAddress ad = new AppAddress(parseAddress);
并根据需要在 AppAddress 中添加/删除 setters/getters。多酷啊 %)
编辑: 根据您的目标,您可以创建访问器或坚持使用构造函数。如果不是由某些框架强制,我个人不会公开对象的内部状态,如果不需要,也不会提供 setter 。 还有很多 setter 很容易忘记一些东西。构造函数允许您在一个地方按字面构造)对象。
使用 AppAddress 类的一个小(?)优点是您可以将所有验证和字符串格式化逻辑封装在其中。我的意思是自从您使用地址以来就会有这样的逻辑。 但是,如果这两个类将重复功能,则更容易消除中间的 AppAddress 并在明天必须添加一些 ParseAddress 不应该具有的行为时将解耦留到明天。
更新: 如果您觉得有帮助,请随时采纳答案)
关于android - 这是在回收器 View 中显示解析对象数据的方式是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32552894/