ArrayLists
以下のコードで宣言されている 3 つの要素に要素を追加したいのですが、変数のスコープに関連するいくつかの問題があるようです。免責事項:私は Java に非常に慣れていないため、非常にばかげたことをしている可能性があります。また、 Parse Android APIを使用していることにも注意してください。(解決しようとしている問題をより強調するために、コードにいくつかのコメントを追加しました)。ありがとう!
public class MatchesActivity extends Activity implements OnItemClickListener {
ArrayList<String> titles = new ArrayList<String>();
ArrayList<String> descriptions = new ArrayList<String>();
ArrayList<Bitmap> images = new ArrayList<Bitmap>();
String school;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.matches_layout);
ParseQuery query = new ParseQuery("Profile");
query.whereEqualTo("userName", ParseUser.getCurrentUser().getUsername().toString());
query.getFirstInBackground(new GetCallback() {
public void done(ParseObject obj, ParseException e) {
if (e == null) {
school = obj.getString("school");
ParseQuery query2 = new ParseQuery("Profile");
query2.whereEqualTo("school", school);
query2.findInBackground(new FindCallback() {
public void done(List<ParseObject> scoreList, ParseException e) {
if (e == null) {
// scoreList.size() == 3 here
for (int i = 0; i < scoreList.size(); i++){
titles.add(scoreList.get(i).getString("fullName"));
descriptions.add(scoreList.get(i).getString("sentence"));
ParseFile profileImg = (ParseFile) scoreList.get(i).get("pic");
try {
profileImg.getDataInBackground(new GetDataCallback() {
public void done(byte[] data, ParseException e) {
if (e == null) {
Bitmap bMap = BitmapFactory.decodeByteArray(data, 0,data.length);
images.add(bMap);
} else {
Toast.makeText(getApplicationContext(),"Error: " + e.getMessage(),Toast.LENGTH_SHORT).show();
}
// AT THIS POINT THE ARRAYLIST "IMAGES" IS BEING ASSIGNED VALUES
}
});
} catch (NullPointerException npe) {
images.add(BitmapFactory.decodeResource(getResources(), R.drawable.ic_prof));
}
}
// HERE, THE SIZE OF TITLES AND DESCRIPTION IS 3, HOWEVER, IMAGES HAS NO ELEMENTS (WHEN I EXPECTED IT TO HAVE 3)
} else {
Toast.makeText(getApplicationContext(),"Error: " + e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
});
} else {
Toast.makeText(getApplicationContext(),"Error: " + e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
});
// ALL LISTS ARE EMPTY AT THIS POINT (BUT I WOULD LIKE TO USE THEM HERE)
}
問題の解決: Yogendra Singhとtwaddington
によって提起されたように、getDataInBackground
メソッドはセカンダリ スレッドとして実行されており、そこで情報を取得する必要があるコード内の特定の場所に到達する前に終了する機会がありませんでした。最終的なタスクは、Parse データベースから取得した情報で listView を動的に埋めることだったので、ここでのヒントに従って、getDataInBackground
. それはうまくいきました!助けてくれてありがとう。