Asynctask中的基本适配器无法正常工作

时间:2014-11-10 11:48:48

标签: java android facebook android-asynctask

我正在为我的项目使用facebook app,并且我从图API中获取了json。我有一个带有hashMap的自定义listView,但是当我运行时,列表不会填充,但没有任何错误。请帮帮我。

以下是代码:

public class PageFeedHome extends Fragment {

ArrayList<HashMap<String, String>> feedList;
private static final String TAG_ID = "id";
private static final String TAG_NAME = "name";
private static final String TAG_MESSAGE = "message";
private String feedMessage;
ListView listView;

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    final View view = inflater.inflate(R.layout.feed_home_activity,
            container, false);

    listView = (ListView) view.findViewById(R.id.feed_lv);
    feedList = new ArrayList<HashMap<String, String>>();

    new LoadPosts().execute();

    BaseAdapter adapter = new SimpleAdapter(getActivity(), feedList,
    R.layout.feed_item_view, new String[] { TAG_MESSAGE, TAG_NAME,
    TAG_ID }, new int[] { R.id.message, R.id.author,
    R.id.id_tv });

     listView.setAdapter(adapter);
     adapter.notifyDataSetChanged();

    return view;
}

private class LoadPosts extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub

        Session.openActiveSession(getActivity(), true,
                new Session.StatusCallback() {

                    // callback when session changes state
                    @Override
                    public void call(Session session, SessionState state,
                            Exception exception) {
                        if (session.isOpened()) {

                            new Request(session, "/163340583656/feed",
                                    null, HttpMethod.GET,
                                    new Request.Callback() {
                                        public void onCompleted(
                                                Response response) {
                                            /* handle the result */
                                            Log.i("PostFeedResponse", response.toString());
                                            try {
                                                GraphObject graphObj = response
                                                        .getGraphObject();
                                                JSONObject json = graphObj
                                                        .getInnerJSONObject();
                                                JSONArray jArray = json
                                                        .getJSONArray("data");
                                                for (int i = 0; i < jArray.length(); i++) {
                                                    JSONObject currObj = jArray.getJSONObject(i);
                                                    final String feedId = currObj.getString("id");
                                                    if (currObj.has("message")) {
                                                        feedMessage = currObj.getString("message");
                                                    } else if (currObj.has("story")) {
                                                        feedMessage = currObj.getString("story");
                                                    } else {
                                                        feedMessage = "Posted a something";
                                                    }
                                                    JSONObject fromObj = currObj.getJSONObject("from");
                                                    String from = fromObj.getString("name");

                                                    HashMap<String, String> feed = new HashMap<String, String>();
                                                    feed.put(TAG_ID, feedId);
                                                    feed.put(TAG_MESSAGE, feedMessage);
                                                    feed.put(TAG_NAME, from);

                                                    feedList.add(feed);
                                                }
                                            } catch (JSONException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                            }
                                        }
                                    }).executeAsync();

                        }
                    }
                });

        return null;
    }

}

}

2 个答案:

答案 0 :(得分:1)

移动此代码:

BaseAdapter adapter = new SimpleAdapter(getActivity(), feedList,
R.layout.feed_item_view, new String[] { TAG_MESSAGE, TAG_NAME,
TAG_ID }, new int[] { R.id.message, R.id.author,
R.id.id_tv }); //initialize adapter

 listView.setAdapter(adapter); //set adapter
 adapter.notifyDataSetChanged();

AsyncTask's onPostExecute以确保feedList已插入onBackground

或者如果您希望初始化adapter并将适配器设置为onCreate中的listview,只需将adapter.notifyDataSetChanged();移至onPostExecute即可。如果您多次调用AsyncTask,建议您这样做,因为需要多次初始化和设置适配器。 (参见我在代码中的评论)

答案 1 :(得分:1)

ArrayList<HashMap<String, String>> feedList;
private static final String TAG_ID = "id";
private static final String TAG_NAME = "name";
private static final String TAG_MESSAGE = "message";
private String feedMessage;
ListView listView;
BaseAdapter adapter;

public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.feed_home_activity,
        container, false);

listView = (ListView) view.findViewById(R.id.feed_lv);
feedList = new ArrayList<HashMap<String, String>>();
BaseAdapter adapter = new SimpleAdapter(getActivity(), feedList,
R.layout.feed_item_view, new String[] { TAG_MESSAGE, TAG_NAME,
TAG_ID }, new int[] { R.id.message, R.id.author,
R.id.id_tv });

 listView.setAdapter(adapter);

 new LoadPosts().execute();




 return view;
 }

  private class LoadPosts extends AsyncTask<String, Void, String> {

@Override
protected String doInBackground(String... params) {
    // TODO Auto-generated method stub

    Session.openActiveSession(getActivity(), true,
            new Session.StatusCallback() {

                // callback when session changes state
                @Override
                public void call(Session session, SessionState state,
                        Exception exception) {
                    if (session.isOpened()) {

                        new Request(session, "/163340583656/feed",
                                null, HttpMethod.GET,
                                new Request.Callback() {
                                    public void onCompleted(
                                            Response response) {
                                        /* handle the result */
                                        Log.i("PostFeedResponse", response.toString());
                                        try {
                                            GraphObject graphObj = response
                                                    .getGraphObject();
                                            JSONObject json = graphObj
                                                    .getInnerJSONObject();
                                            JSONArray jArray = json
                                                    .getJSONArray("data");
                                            for (int i = 0; i < jArray.length(); i++) {
                                                JSONObject currObj = jArray.getJSONObject(i);
                                                final String feedId = currObj.getString("id");
                                                if (currObj.has("message")) {
                                                    feedMessage = currObj.getString("message");
                                                } else if (currObj.has("story")) {
                                                    feedMessage = currObj.getString("story");
                                                } else {
                                                    feedMessage = "Posted a something";
                                                }
                                                JSONObject fromObj = currObj.getJSONObject("from");
                                                String from = fromObj.getString("name");

                                                HashMap<String, String> feed = new HashMap<String, String>();
                                                feed.put(TAG_ID, feedId);
                                                feed.put(TAG_MESSAGE, feedMessage);
                                                feed.put(TAG_NAME, from);

                                                feedList.add(feed);
                                            }
                                        } catch (JSONException e) {
                                            // TODO Auto-generated catch block
                                            e.printStackTrace();
                                        }
                                    }
                                }).executeAsync();

                    }
                }
            });

     return null;

   }
   @Override
    protected void onPostExecute(Void result) 
    {
        super.onPostExecute(result);
       Toast.makeText(getApplicationContext(), ""+feedList.size(), Toast.LENGTH_LONG).show();
        adapter.notifyDataSetChanged();
    }

  }
  }