0

私は SO を初めて使用します。よくある質問を読んだことがありますが、この質問が正しいことを願っています。

背景

Facebook SDK を使用してデータを取得し、カスタム リストビューに表示することに成功しました。ただし、初心者として、私は常に物事を遅くし、リストビューは狂ったように遅れています. それを改善するために、SO のこの例を使用して遅延読み込みの実装を開始しました: https://stackoverflow.com/a/3068012/450534

つまずきの石

この例では、@Fedor は URL を文字列配列にハードコーディングしています。ここで、その文字列配列を Facebook クエリ結果 (JSON) から取得したものに置き換えたいと思います。

また、それは従うべき良い例ですか (厳密にはこのシナリオの場合)、それともより良い例がありますか? 遅延読み込みの部分を理解しようとして、2日近く費やしました。しかし、効率的な検索ができていないか、始めたばかりであるという事実のどちらかで困惑しています。

この質問が理にかなっていることを願っています。アドバイスありがとうございます。

乾杯....

Facebook クエリを解析するために JSON を使用して返された画像へのリンクのサンプル。

04-23 01:44:28.505: V/PICTURE LINK URL :(3902): https://s-external.ak.fbcdn.net/safe_image.php?d=AQBZ5-jVGrHA2hpU&w=90&h=90&url=http%3A%2F%2Fblog.mozilla.org%2Ftheden%2Fwp-content%2Fthemes%2FTheDen%2Fimg%2Fbg-header.png

@Fedor が彼の例で URL をハードコーディングした方法のサブセット。

private String[] mStrings={
            "http://a1.twimg.com/profile_images/349012784/android_logo_small_normal.jpg",
            "http://a1.twimg.com/profile_images/841338368/ea-twitter-icon.png",
            "http://a3.twimg.com/profile_images/64827025/android-wallpaper6_2560x160_normal.png",
            "http://a3.twimg.com/profile_images/77641093/AndroidPlanet_normal.png",
            "http://a1.twimg.com/profile_images/850960042/elandroidelibre-logo_300x300_normal.jpg",
            "http://a1.twimg.com/profile_images/655119538/andbook.png",
            "http://a3.twimg.com/profile_images/768060227/ap4u_normal.jpg",
            "http://a1.twimg.com/profile_images/74724754/android_logo_normal.png",
            "http://a3.twimg.com/profile_images/681537837/SmallAvatarx150_normal.png"
    };

編集

新しい編集には多くのスペースが必要でした。したがって、私はそれをペーストビンにリンクしています: http://pastebin.com/HZfCTMy6

facebook API にはバグがあり、ニュース フィードに共有投稿がある場合、"picture" タグが付与されず、"object_id" タグを使用して画像 URL を取得するために別のクエリを作成する必要があります。ペーストビン コードでは、これはif + else if行番号155から始まるコード ブロックに配置されます。

これは非常に長いコードであり、時間を割いて読んでいただければ幸いです。

これに関するヘルプは、本当に、本当に感謝しています。2日以上、解決策が見えません。:-(

4

1 に答える 1

0

そのようなハードコードされた定義がある場合:

class A {
    private String[] strings = { "str1", "str2", ... };

    public A() {
        ...
    }
    ...
}

セッターを追加して(そして文字列配列を動的コレクションに変更して)簡単に壊すことができます:

class A {
    private ArrayList<String> strings;

    public A() {
        this.strings = new ArrayList<String>();
        ...
    }

    public void addString(String str) {
        this.strings.add(str);
    }
    ...
}

値を持つために配列に依存するコードがコンストラクターにある場合は、それを新しいメソッドに移動し、文字列の追加が完了した後に呼び出します。

Facebook からのデータの形式については、json を返すため、必要な正確なデータを簡単に取得できます。必要な URL を抽出してリストに追加するだけです。


編集

これはあなたのコードからのものです:

ArrayList<String> listOfURLS;
....
if (json_data.has("picture"))   {
    for (int j = 0; j < json_data.length(); j++) {
        listOfURLS = new ArrayList<String>();
        listOfURLS.add(changedString);
    }
} else if (json_data.has("object_id")) {
    getPictureURL();
    listOfURLS = new ArrayList<String>();
    listOfURLS.add(finalPictureFromObjectID);
}

これはもちろん、listOfUrlsに 1 つの URL しかないという結果になります。毎回新しいArrayListを作成しますが、そうすべきではありません。次のようになります。

ArrayList<String> listOfURLS;
....
if (json_data.has("picture"))   {
    for (int j = 0; j < json_data.length(); j++) {
        listOfURLS.add(changedString);
    }
} else if (json_data.has("object_id")) {
    getPictureURL();
    listOfURLS.add(finalPictureFromObjectID);
}
于 2012-04-22T20:31:45.133 に答える