Java 如何从ParseUser表中获取用户列表,并在ANDROID的列表视图中显示该列表
我试图从ParseUser表中获取所有用户的名字列表,但由于错误而崩溃:在主线程上做了大量工作。当我尝试从其他ParseObject获取时,它可以工作,但它不适用于ParseUser表。下面是我的代码 MainActivity.javaJava 如何从ParseUser表中获取用户列表,并在ANDROID的列表视图中显示该列表,java,android,xml,android-studio,Java,Android,Xml,Android Studio,我试图从ParseUser表中获取所有用户的名字列表,但由于错误而崩溃:在主线程上做了大量工作。当我尝试从其他ParseObject获取时,它可以工作,但它不适用于ParseUser表。下面是我的代码 MainActivity.java public class MainActivity extends ActionBarActivity { // Declare Variables ListView listview; List<ParseUser>
public class MainActivity extends ActionBarActivity {
// Declare Variables
ListView listview;
List<ParseUser> ob;
ProgressDialog mProgressDialog;
ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Parse.initialize(this, APP, SECRET);
new RemoteDataTask().execute();
}
// RemoteDataTask AsyncTask
private class RemoteDataTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// Create a progressdialog
mProgressDialog = new ProgressDialog(MainActivity.this);
// Set progressdialog title
mProgressDialog.setTitle("loading all donors");
// Set progressdialog message
mProgressDialog.setMessage("Loading...");
mProgressDialog.setIndeterminate(false);
// Show progressdialog
mProgressDialog.show();
}
// RemoteDataTask AsyncTask
@Override
protected Void doInBackground(Void... params) {
// Locate the class table named "Country" in Parse.com
ParseQuery<ParseUser> query = ParseUser.getQuery();
try {
ob = query.find();
} catch (com.parse.ParseException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
listview = (ListView) findViewById(R.id.listview);
// Pass the results into an ArrayAdapter
adapter = new ArrayAdapter<String>(MainActivity.this,
R.layout.listview_item);
// Retrieve object "name" from Parse.com database
for (ParseObject User : ob) {
adapter.add((String) User.get("firstName"));
}
// Binds the Adapter to the ListView
listview.setAdapter(adapter);
// Close the progressdialog
mProgressDialog.dismiss();
// Capture button clicks on ListView items
}
}
}
公共类MainActivity扩展了ActionBarActivity{
//声明变量
列表视图列表视图;
列表ob;
进程对话框;
阵列适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
初始化(这个,应用,秘密);
新建RemoteDataTask().execute();
}
//远程数据任务异步任务
私有类RemoteDataTask扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
//创建一个progressdialog
mProgressDialog=新建ProgressDialog(MainActivity.this);
//设置进程对话框标题
setTitle(“加载所有捐赠者”);
//设置进程对话框消息
设置消息(“加载…”);
mProgressDialog.setUndeterminate(false);
//显示进度对话框
mProgressDialog.show();
}
//远程数据任务异步任务
@凌驾
受保护的Void doInBackground(Void…参数){
//在Parse.com中找到名为“Country”的类表
ParseQuery=ParseUser.getQuery();
试一试{
ob=query.find();
}catch(com.parse.parsee){
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
listview=(listview)findViewById(R.id.listview);
//将结果传递到ArrayAdapter
适配器=新阵列适配器(MainActivity.this,
R.布局。列表视图(项目);
//从Parse.com数据库检索对象“name”
for(ParseObject用户:ob){
adapter.add((String)User.get(“firstName”);
}
//将适配器绑定到ListView
setAdapter(适配器);
//关闭progressdialog
mProgressDialog.disclose();
//在ListView项目上单击捕获按钮
}
}
}
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#de99ac"
tools:context="com.nyu.blife_app.MainActivity">
<ListView
android:id="@+id/listview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
listview_item.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5sp"
android:textSize="25sp" >
</TextView>
我在ParseUser表中添加了其他字段(firstName、lastName)和其他一些字段。。我只需要从ParseUser表中获取所有的名字。如果有人能在这方面指导我,那将非常有帮助。试着打电话给我
新的Runnable(){
无效运行(){
新建RemoteDataTask().execute();
}
}.run()
而不是
新建RemoteDataTask().execute() 我认为你的方法有点缺陷,但可能是因为你链接的教程有点旧。我认为有更好的方法 首先,您的
ProgressDialog
可能应该替换为ProgressBar
(请参阅上的Android教程)
其次,我认为您应该真正使用ParseQueryAdapter
,让Parse为您处理一切。关于这一点有一个简单的解释,但我将简要解释:
public class MainActivity extends ActionBarActivity {
// Declare Variables
ListView listview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Parse.initialize(this, APP, SECRET);
listView = (ListView)findVIewById(R.id.listview);
UsersAdapter adapter = new UsersAdapter(this, new ParseQueryAdapter.QueryFactory<ParseUser>() {
@Override
public ParseQuery<ParseUser> create() {
ParseQuery<ParseUser> query = ParseUser.getQuery();
return query;
}
});
adapter.addOnQueryLoadListener(new ParseQueryAdapter.OnQueryLoadListener<Message>() {
@Override
public void onLoading() {
// show progress bar
}
@Override
public void onLoaded(List<ParseUser> list, Exception e) {
// close progress bar
}
});
listview.setAdapter(adapter);
}
因此,您可以像往常一样创建列表视图
,但需要向其中添加一个特殊的适配器,该适配器(1)使用您提供的查询解析您想要的内容,(2)将这些结果添加到列表视图
——您需要为getItemView
提供一个实现
您可能想在
onqueryladdlistener
中使用ProgressBar
执行某些操作,为什么要使用异步任务?解析对象和查询对于许多操作都有异步方法。例如query.findInBackground(FindCallback)
。我遵循了本教程,我认为它有点旧,也不太好。您最好在Parse中使用内置异步方法,以及专门为ListView
s编写的适配器。我已经尝试用您的解决方案替换它,现在它没有崩溃,但我猜它甚至没有执行,因为即使进度条也没有显示是的,您是对的。您需要运行runnable。请参阅我的编辑。
public class UsersAdapter extends ParseQueryAdapter<ParseUser> {
public UsersAdapter(Context context, QueryFactory<ParseUser> queryFactory) {
super(context, queryFactory);
}
@Override
public View getItemView(final ParseUser user, View v, ViewGroup parent) {
// build your views
}
}