结果未显示在ListView Android中

时间:2016-02-18 08:56:14

标签: java android listview

我一直在研究一个Android应用程序......我陷入困境......从互联网上获取JSON数据后,我无法在ListView中显示它...是我的代码...

public class MainListActivityFragment extends Fragment {
    protected String[] mBlogPostTitles;
    protected JSONObject mBlogData;
    public static final String LOG_TAG = MainListActivityFragment.class.getSimpleName();
    public static ArrayAdapter<String> titleAdapter;



    public MainListActivityFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main_list, container, false);

        if(isNetworkAvailable()) {
            GetBlogPost getBlogPost = new GetBlogPost();
            getBlogPost.execute();
        } else {
            Toast.makeText(getContext(),"No Network Available", Toast.LENGTH_LONG).show();
        }


        List<String> blogTitles = new ArrayList<>(Arrays.asList(mBlogPostTitles));
        titleAdapter = new ArrayAdapter<>(
                getActivity(),
                R.layout.name_lst_view,
                R.id.name_list_view_textview,
                blogTitles
        );

        ListView listView = (ListView) rootView.findViewById(R.id.listview_name);
        listView.setAdapter(titleAdapter);

        return rootView;

    }

    private boolean isNetworkAvailable() {
        ConnectivityManager manager = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = manager.getActiveNetworkInfo();

        boolean isAvailable = false;
        if (networkInfo != null && networkInfo.isConnected()){
            isAvailable = true;
        }
        return isAvailable;
    }


    private void updateList() {
        if(mBlogData == null){
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setTitle("Oopps");
            builder.setMessage("There was an error accessing the blog ...");
            builder.setPositiveButton(android.R.string.ok, null);
            AlertDialog dialog = builder.create();
            dialog.show();


        }else {
            try {
                JSONArray jsonPosts = mBlogData.getJSONArray("posts");

                mBlogPostTitles = new String[jsonPosts.length()];
                for (int i = 0; i < jsonPosts.length(); i++){
                    JSONObject post = jsonPosts.getJSONObject(i);
                    String title = post.getString("title");
                    title = Html.fromHtml(title).toString();
                    mBlogPostTitles[i] = title;


                }


            } catch (JSONException e) {
                Log.e(LOG_TAG,"Exception Caught: ",e);
            }
        }
    }

    public class GetBlogPost extends AsyncTask<Object, Void, JSONObject> {
        public final int NUMBER_OF_POSTS = 5;

        int responseCode = -1;
        JSONObject jsonResponse = null;

        @Override
        protected JSONObject doInBackground(Object... params) {


            try {
                URL blogFeedUrl = new URL("http://www.example.com/api/get_category_posts/?slug=americancuisines&count="+NUMBER_OF_POSTS);
                HttpURLConnection connection = (HttpURLConnection) blogFeedUrl.openConnection();
                connection.setRequestMethod("GET");
                connection.connect();

                responseCode = connection.getResponseCode();
                if (responseCode == HttpURLConnection.HTTP_OK){
                    InputStream inputStream = connection.getInputStream();
                    StringBuffer buffer = new StringBuffer();
                    if (inputStream == null) {
                        // Nothing to do.
                        return null;
                    }
                    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

                    String line;
                    while ((line = reader.readLine()) != null) {
                        // Since it's JSON, adding a newline isn't necessary (it won't affect parsing)
                        // But it does make debugging a *lot* easier if you print out the completed
                        // buffer for debugging.
                        buffer.append(line + "\n");
                    }

                    if (buffer.length() == 0) {
                        // Stream was empty.  No point in parsing.
                        return null;
                    }
                    String blogDataJsonStr = buffer.toString();

                    jsonResponse = new JSONObject(blogDataJsonStr);

                }else {
                    Log.i(LOG_TAG, "Unsuccessful HTTP Response Code: " + responseCode);
                }
            }
            catch (MalformedURLException e){
                Log.e(LOG_TAG,"Exception Caught: ",e);
            }
            catch (IOException e) {
                Log.e(LOG_TAG, "IO Exception Caught: ",e);
            }
            catch (Exception e) {
                Log.e(LOG_TAG,"Exception Caught: ",e);
            }
            return jsonResponse;
        }

        @Override
        protected void onPostExecute(JSONObject result) {
            super.onPostExecute(result);
            mBlogData = result;
            updateList();

        }
    }

}

从上面的代码中你可以看到我通过doInBackground的{​​{1}}方法得到了这些数据...数据正在通过logcat看到完美...问题是在这个方法的某个地方,我似乎无法弄明白......

AsyncTask

private void updateList() { if(mBlogData == null){ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle("Oopps"); builder.setMessage("There was an error accessing the blog ..."); builder.setPositiveButton(android.R.string.ok, null); AlertDialog dialog = builder.create(); dialog.show(); }else { try { JSONArray jsonPosts = mBlogData.getJSONArray("posts"); mBlogPostTitles = new String[jsonPosts.length()]; for (int i = 0; i < jsonPosts.length(); i++){ JSONObject post = jsonPosts.getJSONObject(i); String title = post.getString("title"); title = Html.fromHtml(title).toString(); mBlogPostTitles[i] = title; } } catch (JSONException e) { Log.e(LOG_TAG,"Exception Caught: ",e); } } } 中调用上述方法我的意思是如果我在此方法中打印到logcat,我可以看到正在打印的结果,但是当我尝试在onPostExecute方法结果中显示结果时t甚至没有出现在logcat中...任何帮助都将不胜感激...谢谢

3 个答案:

答案 0 :(得分:1)

更改您的代码如下:

public class MainListActivityFragment extends Fragment {
    protected String[] mBlogPostTitles;
    protected JSONObject mBlogData;
    public static final String LOG_TAG = MainListActivityFragment.class.getSimpleName();
    public static ArrayAdapter<String> titleAdapter;
    ListView listView;


public MainListActivityFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_main_list, container, false);

    listView = (ListView) rootView.findViewById(R.id.listview_name);


         if(isNetworkAvailable()) {
        GetBlogPost getBlogPost = new GetBlogPost();
        getBlogPost.execute();
    } else {
        Toast.makeText(getContext(),"No Network Available", Toast.LENGTH_LONG).show();
    }


    return rootView;

}

private void updateList() {
    if(mBlogData == null){
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("Oopps");
        builder.setMessage("There was an error accessing the blog ...");
        builder.setPositiveButton(android.R.string.ok, null);
        AlertDialog dialog = builder.create();
        dialog.show();


    }else {
        try {
            JSONArray jsonPosts = mBlogData.getJSONArray("posts");

            mBlogPostTitles = new String[jsonPosts.length()];
            for (int i = 0; i < jsonPosts.length(); i++){
                JSONObject post = jsonPosts.getJSONObject(i);
                String title = post.getString("title");
                title = Html.fromHtml(title).toString();
                mBlogPostTitles[i] = title;


            }


        } catch (JSONException e) {
            Log.e(LOG_TAG,"Exception Caught: ",e);
        }
    }
}

public class GetBlogPost extends AsyncTask<Object, Void, JSONObject> {
    public final int NUMBER_OF_POSTS = 5;

    int responseCode = -1;
    JSONObject jsonResponse = null;

    @Override
    protected JSONObject doInBackground(Object... params) {

        try {
            URL blogFeedUrl = new URL("http://www.example.com/api/get_category_posts/?slug=americancuisines&count="+NUMBER_OF_POSTS);
            HttpURLConnection connection = (HttpURLConnection) blogFeedUrl.openConnection();
            connection.setRequestMethod("GET");
            connection.connect();

            responseCode = connection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK){
                InputStream inputStream = connection.getInputStream();
                StringBuffer buffer = new StringBuffer();
                if (inputStream == null) {
                    // Nothing to do.
                    return null;
                }
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

                String line;
                while ((line = reader.readLine()) != null) {
                    // Since it's JSON, adding a newline isn't necessary (it won't affect parsing)
                    // But it does make debugging a *lot* easier if you print out the completed
                    // buffer for debugging.
                    buffer.append(line + "\n");
                }

                if (buffer.length() == 0) {
                    // Stream was empty.  No point in parsing.
                    return null;
                }
                String blogDataJsonStr = buffer.toString();

                jsonResponse = new JSONObject(blogDataJsonStr);

            }else {
                Log.i(LOG_TAG, "Unsuccessful HTTP Response Code: " + responseCode);
            }
        }
        catch (MalformedURLException e){
            Log.e(LOG_TAG,"Exception Caught: ",e);
        }
        catch (IOException e) {
            Log.e(LOG_TAG, "IO Exception Caught: ",e);
        }
        catch (Exception e) {
            Log.e(LOG_TAG,"Exception Caught: ",e);
        }
        return jsonResponse;
    }

    @Override
    protected void onPostExecute(JSONObject result) {
        super.onPostExecute(result);
        mBlogData = result;
        updateList();

        List<String> blogTitles = new ArrayList<>(Arrays.asList(mBlogPostTitles));
        titleAdapter = new ArrayAdapter<String>(
                getActivity(),
                R.layout.name_list_view,
                R.id.name_list_view_textview,
                blogTitles
        );
        listView.setAdapter(titleAdapter);

    }
}

}

答案 1 :(得分:0)

在更新和初始化中使用相同的数组列表,因此全局声明单个数组列表并在updateList()方法中更新它, 试试这样,

     try {
                JSONArray jsonPosts = mBlogData.getJSONArray("posts");

                mBlogPostTitles = new String[jsonPosts.length()];//remove this and use the 
                                                    //same as you are using in adapter
                for (int i = 0; i < jsonPosts.length(); i++){
                    JSONObject post = jsonPosts.getJSONObject(i);
                    String title = post.getString("title");
                    title = Html.fromHtml(title).toString();
                    mBlogPostTitles[i] = title;
                }
    titleAdapter.notifyDataSetChanged();//here

            } catch (JSONException e) {
                Log.e(LOG_TAG,"Exception Caught: ",e);
            }

OR 即使您可以在onPostExecute

中使用
            @Override
            protected void onPostExecute(JSONObject result) {
                super.onPostExecute(result);
                mBlogData = result;
                updateList();
                 titleAdapter.notifyDataSetChanged();//here
            }

答案 2 :(得分:0)

在致电

之前找到listview:ListView listView = (ListView) rootView.findViewById(R.id.listview_name);
GetBlogPost getBlogPost = new GetBlogPost();
getBlogPost.execute();  

并将此行listView.setAdapter(titleAdapter);放入onPostExecute方法。