Java 如何从ParseUser表中获取用户列表,并在ANDROID的列表视图中显示该列表

Java 如何从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>

我试图从ParseUser表中获取所有用户的名字列表,但由于错误而崩溃:在主线程上做了大量工作。当我尝试从其他ParseObject获取时,它可以工作,但它不适用于ParseUser表。下面是我的代码

MainActivity.java

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
    }
}