java - 在解析查询中初始化或修改变量

标签 java android parse-server

我创建了一个名为“Roommate”的类,它是使用 ParseUser 变量构造的,我尝试创建一个新的 Roommate 对象并将其添加到我的 Roommate 数组列表中。但是,查询完成后,似乎我所做的任何修改或初始化都被重置了。查询完成后,我的 arrayList 最终为空。有谁知道这是为什么以及我可以做些什么来解决这个问题?

如果这是一个基本问题,我深表歉意。我是一名学生,这是我第一次尝试制作应用程序。感谢所有反馈。

我调用 updateRoommatesArray() 的 ArrayList 和 OnCreate 方法:

// variables
private ArrayList<Roommate> roommates = new ArrayList<>();
AddRoommateRecyclerViewAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_roommates);

    // Set up toolbar
    Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar_roommate);
    setSupportActionBar(myToolbar);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setTitle("Add Roommates");

    // Set up floating action button
    FloatingActionButton fab = findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //show dialog on click
            AddRoommatesDialog addRoommatesDialog = new AddRoommatesDialog();
            addRoommatesDialog.show(getSupportFragmentManager(),"add roommates dialog");
        }
    });

    // Initializes roommateNames with data from Parse
    updateRoommatesArray();
    Toast.makeText(this, Integer.toString(roommates.size()), Toast.LENGTH_SHORT).show();

    // Set up Recycler View
    LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
    RecyclerView recyclerView = findViewById(R.id.rm_recycler);
    recyclerView.setLayoutManager(layoutManager);
    adapter = new AddRoommateRecyclerViewAdapter(this, roommates);
    recyclerView.setAdapter(adapter);

}

updateRoommatesArray 方法:

public void updateRoommatesArray() {
    roommates.clear();
    final ParseUser currentUser = ParseUser.getCurrentUser();
    ParseRelation<ParseUser> relation = currentUser.getRelation("roommates");
    relation.getQuery().findInBackground(new FindCallback<ParseUser>() {
        @Override
        public void done(List<ParseUser> objects, ParseException e) {
            if (e == null && objects.size() > 0) {
                for (ParseUser roommate : objects) {
                    Roommate current_roommate = new Roommate(roommate);
                    roommates.add(current_roommate);
                }
            }
            else {
                Log.i("Query", "Empty or Not Working");
            }
        }
    });
}

室友类:

public class Roommate {

// Member Variables
String objectId;
String username;
String firstName;
String lastName;
String fullName;
ArrayList<Roommate> roommates;


// Constructor
public Roommate(ParseUser user_in) {
    objectId = user_in.getObjectId().toString();
    username = user_in.getUsername().toString();
    firstName = user_in.get("firstName").toString();
    lastName = user_in.get("lastName").toString();
    fullName = firstName + " " + lastName;
    roommates = new ArrayList<>();
}


public String getObjectId() {
    return objectId;
}

public String getUsername() {
    return username;
}

public String getFirstName() {
    return firstName;
}

public String getLastName() {
    return lastName;
}

public String getFullName() {
    return fullName;
}

public ArrayList<Roommate> getRoommates() {
    return roommates;
}
}

最佳答案

问题刚刚出现,因为findInBackground()方法是异步方法调用。不能保证设置 RecyclerAdaptor 的适配器会在终止 findInBackground 的作业后执行。

请注意,您在 updateRoommatesArray 的第一行就清楚地列出了列表。然后你开始一个异步任务。之后主线程想继续它的工作并返回到 onCreate() 方法来设置 ArrayList。它将无限期发生。

从数据库中加载数据,就其本质而言,将花费比在主线程中执行简单代码更长的时间。

所以很可能是 recyclerView.setAdapter(adapter);将在 done() 方法中填充数组之前执行。

为确保适配器将被填充,请将以下代码放入 done 方法中。通过这样做,您将保证正确的代码执行顺序。

Toast.makeText(this, Integer.toString(roommates.size()), Toast.LENGTH_SHORT).show();

    // Set up Recycler View
    LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
    RecyclerView recyclerView = findViewById(R.id.rm_recycler);
    recyclerView.setLayoutManager(layoutManager);
    adapter = new AddRoommateRecyclerViewAdapter(this, roommates);
    recyclerView.setAdapter(adapter);

关于java - 在解析查询中初始化或修改变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51811019/

相关文章:

java - 有没有办法检查一个变量是否在 Java 中定义?

java - 告诉 JAXB 解码 <xs :dateTime> to Date class using annotations

java - 如何获取 Hibernate 的前 5 个元素

android - 开关按钮始终打开

ios - 使用 Swift PFIdResultBlock 错误解析云

创建 ParseObject 时出现 java android i/o Failure Exception

javascript - 创建 Parse.Object 新解析服务器

java - JFrame 的解析问题

java - 当我使用 findViewById 时,将 R.id.[value] 中的 int 作为类构造函数参数传递给 NPE

具有唯一应用程序 ID 的 Android 产品风格