【问题标题】:How to fetch the list of users from ParseUser table and show the it in list view in andorid如何从 ParseUser 表中获取用户列表并在 andorid 的列表视图中显示它
【发布时间】:2015-07-04 09:52:04
【问题描述】:

我试图从 ParseUser 表中获取所有用户的名字列表,但它因错误而崩溃:在主线程上做很多工作。当我尝试从其他 ParseObjects 获取时它有效,但它不适用于 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

         }
      }
 }

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 表中添加了其他字段(名字、姓氏)等等。我只需要从 ParseUser 表中获取所有名字。如果有人指导我这将非常有帮助。

【问题讨论】:

  • 你为什么使用AsyncTask?解析对象和查询具有许多操作的异步方法。
  • 例如query.findInBackground(FindCallback)
  • 我已经按照这个教程androidbegin.com/tutorial/…
  • 我觉得有点老了,不太好。你最好使用 Parse 中的内置异步方法和专门为ListViews 编写的适配器。

标签: java android xml android-studio


【解决方案1】:

我认为您的方法有点缺陷,但这可能是因为您链接的教程有点旧。我认为有更好的方法。

首先,您的ProgressDialog 可能应该替换为ProgressBar(请参阅Progress & Activity 上的Android 教程)。

其次,我认为您真的应该使用ParseQueryAdapter 并让 Parse 为您处理一切。这上面有个official tutorial,不过我会简单解释一下:

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

UsersAdapter 定义为

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

所以你像往常一样创建你的ListView,但是你向它添加一个特殊的适配器,(1) 使用你提供的查询查询 Parse 你想要的东西,(2) 将这些结果添加到ListView -您需要向getItemView 提供一个实现。

您可能想对OnQueryLoadListener 中的ProgressBar 做一些事情。

【讨论】:

    【解决方案2】:

    尝试调用 新的可运行(){ 无效运行(){ 新的 RemoteDataTask().execute(); } }.run();

    而不是 new RemoteDataTask().execute();

    【讨论】:

    • 我试过用你的解决方案替换,现在它没有崩溃,但我猜它甚至没有执行,因为甚至没有显示进度条
    • 是的,你是对的 Yash。您需要运行可运行文件。查看我的编辑。
    猜你喜欢
    • 2017-05-10
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多