我的库存应用中遇到了一个问题。我正在尝试从Parse检索库存项目列表。这不是世界上最难做到的事情。在这一点上,当我在Parse.com中清楚地看到我请求的类中有数据时,我不知道为什么数据会变回空。有任何想法吗? (注意:我能够毫无问题地将数据添加到数据库中...它只是在检索中。)
MainActivity:
public class MainActivity extends AppCompatActivity {
private ImageView mAddButton;
private ImageView mBackButton;
private Inventory mInventory;
private RecyclerView mRecyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAddButton = (ImageView) findViewById(R.id.addItemButton);
mBackButton = (ImageView) findViewById(R.id.backButton);
mBackButton.setVisibility(View.INVISIBLE);
mInventory = new Inventory();
ParseUser user = ParseUser.getCurrentUser();
if (user == null) {
navToLogin();
} else {
Toast.makeText(MainActivity.this, "Welcome!", Toast.LENGTH_SHORT).show();
getInventoryFromParse();
Toast.makeText(MainActivity.this, mInventory.toString(), Toast.LENGTH_LONG).show();
}
mAddButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addItem();
}
});
}
private void updateView() {
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
InventoryListAdapter adapter = new InventoryListAdapter(this, mInventory.getItemList());
mRecyclerView.setAdapter(adapter);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(layoutManager);
}
private void addItem() {
Intent intent = new Intent(MainActivity.this, AddItemActivity.class);
startActivityForResult(intent, 1);
}
private void navToLogin() {
Intent intent = new Intent(this, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case (1):
updateView();
}
}
}
public void getInventoryFromParse() {
ParseQuery<ParseObject> query = ParseQuery.getQuery("Item");
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> objects, ParseException e) {
if (e == null) {
mInventory.setItemList(objects);
} else {
Toast.makeText(MainActivity.this, "There was an error.", Toast.LENGTH_LONG).show();
}
}
});
}
}
库存类:
public class Inventory {
private List<ParseObject> mItemList;
public Inventory() {
mItemList = new ArrayList<>();
}
public List<ParseObject> getItemList() {
return mItemList;
}
public void setItemList(List<ParseObject> itemList) {
mItemList = itemList;
}
public void addItem(ParseObject item) {
mItemList.add(item);
}
@Override
public String toString() {
return "Inventory{" +
"mItemList=" + mItemList +
'}';
}
}
答案 0 :(得分:1)
查询创建一个在后台运行的新线程,然后您的主线程继续运行,退出该函数,并且当您打印出库存时查询仍未完成。当主线程将mInventory打印到字符串时,尚未调用setInventory。
这就是您的代码无效的原因。
至于解决方案,我不确定Android开发工具包是如何工作的,但我的建议是让你的代码分开,就像让getInventoryFromParse有一个返回类型,并在查询中调用return打回来。我不确定是否会因为主线程到达函数结束而抛出错误...如果这不起作用,则必须重写代码,以便在项目之后需要发生的任何事情取回发生在回调中。