android java如何在嵌套类中重写ParseUser的toString
在Android中,我试图使用android java如何在嵌套类中重写ParseUser的toString,java,android,parse-platform,overriding,extends,Java,Android,Parse Platform,Overriding,Extends,在Android中,我试图使用 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.Lis
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();
}
}
}
导入android.os.Bundle;
导入android.app.Fragment;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.ListView;
导入com.parse.FindCallback;
导入com.parse.ParseException;
导入com.parse.ParseQuery;
导入com.parse.ParseUser;
导入java.util.List;
/**
*一个简单的{@link Fragment}子类。
*/
公共类ExampleFragment扩展了片段{
公共示例片段(){
//必需的空公共构造函数
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
最终视图根视图=充气机。充气(R.layout.fragment_示例,容器,false);
最终ListView ListView=(ListView)rootView.findViewById(R.id.exampleListView);
ParseQuery=User.getQuery();
findInBackground(新的FindCallback(){
公共void done(列出对象,parsee异常){
如果(e==null){
//查询成功。
setAdapter(新的ArrayAdapter(rootView.getContext(),android.R.layout.simple_list_item_1,objects));
用于(用户:对象){
Log.i(“AppInfo”,“Added”+user.toString());
}
}否则{
//出了点问题。
}
}
});
返回rootView;
}
公共类用户扩展ParseUser{
@凌驾
公共字符串toString(){
Log.i(“AppInfo”,“Username:+getUsername());
返回getUsername();
}
}
}
看起来很简单。我把它嵌套在我的fragment类中,它因此崩溃了
java.lang.ClassCastException:com.parse.ParseUser不能强制转换为com.mycompany.myproject.ExampleFragment$User
但是当我将它移动到它自己的子类中(在android studio的explorer视图中,它有自己的条目)时,它工作得非常好
它嵌套在我的片段类中不起作用有什么原因吗?仅仅为了重写一个函数而创建自己的子类似乎有点不必要
更新:如果删除for循环部分,它不会出错,但在listview返回com.parse时,它仍然不会调用重写的toString()。ParseUser@etcetcetc.确保你已经做了这两件事 1.在Parse.initialize之前注册类
ParseObject.registerSubclass(User.class);
2.使用注释指定映射到waht类的类
@ParseClassName("_User")
public class User extends ParseUser {
...
}
这是参考资料。
MyFragment.User可以强制转换为ParseUser,但相反的不能。每个用户都始终是一个用户。。。但并非所有ParseUser都是用户。。。这就是演员失败的原因。。。也许,在您的片段中,您将变量定义为“ParseUser”。但是,您应该将其用作“User”…请共享定义User/ParseUser objectPost相关类的代码行。将代码张贴到实际出现错误的地方。我肯定你弄错了,不应该是这样的谢谢。已更新完整的代码示例。基本上,我所做的就是在CreateView中将ParseUser替换为User,并添加了类位以覆盖toString()。我怀疑它可能是嵌套类和嵌套在片段类中的组合。也许跟生命周期或是银行有关。我刚刚使用ParseUser.registerSubclass(ExampleFragment.User.class)尝试了这一点;因为我的名字在另一部分。我现在收到一个错误:java.lang.RuntimeException:无法创建应用程序com.android.tools.fd.runtime.bootstrap应用程序:java.lang.IllegalArgumentException:无法注册未实现默认构造函数的类型!是否添加了此注释@ParseClassName(“_User”)您好,是的,我添加了@ParseClassName(_User”),但问题仍然相同。请尝试将您的用户类移动到User.java避免嵌套类。在用@ParseClassName注释的类中,您必须添加一个没有参数含义的默认构造函数:public User(){}