android - 这是在回收器 View 中显示解析对象数据的方式是否正确?

标签 android object parse-platform android-recyclerview

有人向我推荐了两种不同的方法,这让我很困惑。

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/

相关文章:

javascript - 两次 httpRequest 后解析、saveAll 失败(云代码作业)

ios - 无法获取 PFUser 字段

安卓通知: GCM or Service

javascript - 从所需的对象文字中访问 `this`?

css - 如何为动态宽度网页嵌入使用可变宽度/高度的 YouTube 视频?

Javascript - 如何按 3 种不同的属性类型对对象数组进行排序? (字符串、整数、 bool 值)

java - Android 自今天起 30 天

Android Sqlite 如果不存在则插入

android - android 和 ios 移动设备需要什么屏幕尺寸?

ios - 如何在表格 View 中添加三个表格 View 单元格作为 subview ?