1

アプリケーションのサブセットを実装するために、Fedor の Lazy Load コードを実装しました。Facebook SDK を使用してデータを取得し、ニュースフィードの投稿とカウントなどのコメントをアクティビティに表示しています。また、コメント ボックスを使用して、ニュースフィードの投稿にコメントを投稿することもできます。この機能は問題なく動作します。ただし、ユーザーがコメントをスレッドに投稿した後、リストを更新して、投稿したコメントを表示する必要があります。adapter.notifyDataSetChanged();コメントを投稿した直後に onClick メソッドでを呼び出してみました。ただし、リストビューは更新されません。

ここで間違っている場合は訂正してください。ただし、データを保持するために使用した配列リストが更新されていないことが最善の推測です。これが(私が思うに)コードの関連部分です。さらに必要な場合はお知らせください。

onCreate メソッド: ArrayLists を初期化し、JSONObject と JSONArray を使用してデータをプルします。

arrayUserID = new ArrayList<String>();
arrayProfilePic = new ArrayList<String>();
arrayFromName = new ArrayList<String>();
arrayMessage = new ArrayList<String>();


try {

    JOFeedDetails = new JSONObject(apiResponse);
    JAFeedDetails = JOFeedDetails.getJSONArray("data");


    for (int i = 0; i < JAFeedDetails.length(); i++) {
        json_data = JAFeedDetails.getJSONObject(i);

        // GET THE POST'S FROM USER NAME AND ID
        JSONObject joFromName = new JSONObject();
        joFromName = json_data.optJSONObject("from");

        if (joFromName.has("id"))   {
            String getCommentersID = joFromName.getString("id");
            arrayUserID.add(getCommentersID);
            String fromProfilePic = "https://graph.facebook.com/"+ getCommentersID +"/picture?type=square" + "&access_token=" + Utility.mFacebook.getAccessToken();;
            arrayProfilePic.add(fromProfilePic);
        } else {
            String getCommentersID = "";
            arrayUserID.add(getCommentersID);
        }

        if (joFromName.has("name")) {
            String getCommentersName = joFromName.getString("name");
            arrayFromName.add(getCommentersName);
        } else {
            String getCommentersName = "";
            arrayFromName.add(getCommentersName);
        }

        if (json_data.has("message"))   {
            String getMessage = json_data.getString("message");
            arrayMessage.add(getMessage);
        } else {
            String getMessage = "";
            arrayMessage.add(getMessage);
        }

        // GET THE POST'S TIME STAMP
        if(json_data.has("created_time"))   {

            String dateStr = json_data.optString("created_time");
            SimpleDateFormat formatter = getDateFormat();
            ParsePosition pos = new ParsePosition(0);
            long then = formatter.parse(dateStr, pos).getTime();
            long now = new Date().getTime();

            long seconds = (now - then)/1000;
            long minutes = seconds/60;
            long hours = minutes/60;
            long days = hours/24;

            String friendly = null;
            long num = 0;
            if (days > 0) {
                num = days;
                friendly = days + " day";
            } else if (hours > 0) {
                num = hours;
                friendly = hours + " hour";
            } else if (minutes > 0) {
                num = minutes;
                friendly = minutes + " minute";
            } else {
                num = seconds;
                friendly = seconds + " second";
            }
            if (num > 1) {
                friendly += "s";
            }
            String postTimeStamp = friendly.toUpperCase() + " AGO";
            arrayTimeStamp.add(postTimeStamp);
        } else {
            String postTimeStamp = "";
            arrayTimeStamp.add(postTimeStamp);
        }

        if (json_data.has("likes")) {
            String getCommentLikes = json_data.getString("likes");
            arrayCountLikes.add(getCommentLikes);
        } else {
            String getCommentLikes = "0";
            arrayCountLikes.add(getCommentLikes);
        }
    }

} catch (Exception e) {
}

stringUserID = new String[arrayUserID.size()];
stringUserID = arrayUserID.toArray(stringUserID);

stringProfilePics = new String[arrayProfilePic.size()];
stringProfilePics = arrayProfilePic.toArray(stringProfilePics);

stringFromName = new String[arrayFromName.size()];
stringFromName = arrayFromName.toArray(stringFromName);

stringMessage = new String[arrayMessage.size()];
stringMessage = arrayMessage.toArray(stringMessage);

stringTimeStamp = new String[arrayTimeStamp.size()];
stringTimeStamp = arrayTimeStamp.toArray(stringTimeStamp);

stringCountLikes = new String[arrayCountLikes.size()];
stringCountLikes = arrayCountLikes.toArray(stringCountLikes);

getNewsfeedDetailsHeader();

adapter = new NewsFeedDetailsAdapter(this, stringUserID, stringFromName, stringProfilePics, 
        stringMessage, stringTimeStamp, stringCountLikes);

list.setAdapter(adapter);

そして、コメントが投稿された onClick イベント:

public OnClickListener listener = new OnClickListener() {

        @Override
        public void onClick(View v) {
            try {
                Bundle parameters = new Bundle();
                parameters.putString("message", txtCommentBox.getText().toString());
                parameters.putString("description", getString(R.string.app_desc));
                parameters.putString("caption", getString(R.string.app_name));

                Utility.mFacebook.request(fetchedThreadID + "/comments", parameters, "POST");

                adapter.notifyDataSetChanged();

                InputMethodManager inputManager = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
                inputManager.hideSoftInputFromWindow(txtCommentBox.getWindowToken(), 0);
                txtCommentBox.setText("");
            } catch (Exception e) {
            }
        }
    };

この長い投稿を辛抱していただき、本当にありがとうございます。しかし、流れを理解するのに役立つかもしれないと本当に思います。ここの誰かがこの問題を解決するのを手伝ってくれることを願っています.

4

1 に答える 1

0

ArrayLists が更新されないという同様の問題に一度遭遇しました。

adapter.notifyDataSetChanged() の前に Arraylist で .clear() を呼び出してみてください。これはうまくいきました。幸運を!

于 2012-05-29T23:24:35.910 に答える