【问题标题】:android java How to override toString of ParseUser in nested classandroid java如何在嵌套类中覆盖ParseUser的toString
【发布时间】:2016-05-11 16:49:43
【问题描述】:

在 Android 中,我试图覆盖 ParseUser 的 toString() 以在我的列表视图中使用,使用

import android.os.Bundle;
import android.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.parse.FindCallback;
import com.parse.ParseException;
import com.parse.ParseQuery;
import com.parse.ParseUser;

import java.util.List;


/**
 * A simple {@link Fragment} subclass.
 */
public class ExampleFragment extends Fragment {
    public ExampleFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        final View rootView = inflater.inflate(R.layout.fragment_example, container, false);

        final ListView listView = (ListView) rootView.findViewById(R.id.exampleListView);

        ParseQuery query = User.getQuery();

        query.findInBackground(new FindCallback<User>() {
            public void done(List<User> objects, ParseException e) {
                if (e == null) {
                    // The query was successful.
                    listView.setAdapter(new ArrayAdapter<User>(rootView.getContext(), android.R.layout.simple_list_item_1, objects));

                    for (User user : objects) {

                        Log.i("AppInfo", "Added " + user.toString());
                    }

                } else {
                    // Something went wrong.
                }
            }
        });
        return rootView;
    }

    public class User extends ParseUser {
        @Override
        public String toString() {
            Log.i("AppInfo", "Username: " + getUsername());
            return getUsername();
        }
    }
}

看起来很简单。我有这个嵌套在我的片段类中,它崩溃了

java.lang.ClassCastException: com.parse.ParseUser 无法转换为 com.mycompany.myproject.ExampleFragment$User

但是当我将它移动到它自己的子类中(它在 android studio 的资源管理器视图中获得自己的条目)时,它可以完美地工作。

嵌套在我的片段类中是否有原因?创建自己的子类只是为了覆盖一个函数似乎有点不必要。

更新:如果我删除 for 循环部分,它不会出错,但它仍然不会调用我覆盖的 toString(),因为列表视图返回 com.parse.ParseUser@etcetc。

【问题讨论】:

  • MyFragment.User 可以强制转换为 ParseUser 但反之则不行。每个用户始终是 ParseUser ......但并非所有 ParseUser 都是用户......这就是演员失败的原因......可能,在您的片段中,您将变量定义为“ParseUser”。但是,您应该将其用作“用户”...
  • 请分享您定义 User/ParseUser 对象的代码行
  • 发布相关课程的朋友。将代码发布到您实际遇到该错误的地方。我确定你错了,不应该是这样的
  • 谢谢。已更新完整的代码示例。基本上我所做的一切都是在 CreateView 中用 User 替换 ParseUser 的位置,并添加了类位以覆盖 toString()。
  • 我怀疑它可能是嵌套类以及嵌套在片段类中的组合。也许与生命周期或其他东西有关

标签: java android parse-platform overriding extends


【解决方案1】:

确保你已经做了这两件事

1.在Parse.initialize之前注册类

ParseObject.registerSubclass(User.class);

2.使用注解指定类映射到waht Class

@ParseClassName("_User")
public class User extends ParseUser {
    ...
}

这里是参考。 https://parse.com/docs/android/guide#objects-subclassing-parseobject

【讨论】:

  • 谢谢。我刚刚尝试过使用 ParseUser.registerSubclass(ExampleFragment.User.class);因为我的初始化在另一部分。我现在收到一个错误:java.lang.RuntimeException:无法创建应用程序 com.android.tools.fd.runtime.BootstrapApplication:java.lang.IllegalArgumentException:无法注册不实现默认构造函数的类型!
  • 你添加了这个注解吗? @ParseClassName("_User")
  • 嗨,是的,我添加了@ParseClassName("_User") 仍然是同样的问题
  • 也许尝试将您的 User 类移动到 User.java 避免嵌套类。
  • 在使用@ParseClassName 注解的类中,您必须添加一个没有参数含义的默认构造函数:public User(){}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
相关资源
最近更新 更多