0
嗯,我在我的庫存應用中遇到了一個問題。我正在嘗試從Parse中檢索庫存物品清單。這不是世界上最難做的事情。在這一點上,當我在Parse.com中清楚地看到我所請求的課程中有數據時,我不知道爲什麼數據會回到空白處。有任何想法嗎? (注意:我可以在沒有問題的情況下將項目添加到數據庫中......只是在檢索中)。從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();
}
}
});
}
}
Inventory類:
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 +
'}';
}
}
不得不採用第二種解決方案。謝天謝地,這不是太多的工作。將updateView()方法放在getInventoryFromParse()方法內,並且它都可以正常執行。謝謝您的幫助! – Wilson
沒問題。對於所有的同步方法調用,解析可能會非常棘手。我喜歡JavaScript的承諾。我下載了一個iOS庫,允許您撥打類似於承諾的電話,但我還沒有使用它。我敢打賭,Android有一些類似的東西。 Promises基本上允許你將對方的同步函數調用相互連接起來,以確保下一個函數在前一個函數完成之後才能被調用。非常方便。如果你寫了很多你自己的雲代碼,你應該使用它們。 –
我龔不得不看看。可以讓生活變得更容易。再次感謝傑克! – Wilson