0

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 Singhtwaddington によって提起されたように、getDataInBackgroundメソッドはセカンダリ スレッドとして実行されており、そこで情報を取得する必要があるコード内の特定の場所に到達する前に終了する機会がありませんでした。最終的なタスクは、Parse データベースから取得した情報で listView を動的に埋めることだったので、ここでのヒントに従って、getDataInBackground. それはうまくいきました!助けてくれてありがとう。

4

1 に答える 1

1

リストをとして宣言しましたClass member attributes。これらの属性には、クラスの非静的メソッド内で直接アクセスできます。メソッドでそれらを使用することでうまくやっていますonCreate

1つの注意事項:変数をとして定義することをお勧めしますprivate

変数のスコープを相関させている他の問題があるかもしれません。何か問題があると思われる場合は、観察されている特定の問題を共有してください。

編集:疑われるように、この問題は、リストがバックグラウンドで入力されているという事実が原因です。その時までに、それは(サイズを印刷するために)最後の行に到達します。リストがまだ入力されていない可能性があります。

注意: A GetCallback is used to run code after a ParseQuery is used to fetch a ParseObject in a background thread.これは、GetCallBackがバックグラウンドで実行されていることを意味します(非同期モード)。

于 2012-11-05T01:34:30.660 に答える