Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

Android Build a Blog Reader Android App Adapting Data for Display in a List Filling Our String Array and Creating the Adapter

Stas Novsky
Stas Novsky
3,119 Points

App is crushing. What I did wrong with App?

My App still showing "No items to display", after i set up Adapter btw I'm working in Android Studio not Eclipse. Now it's showing Bummer Unforttunally BlogReader has stopped

New Data from LogCat

02-07 16:34:11.384    2368-2386/com.novsky.zefir.blogreader E/MainListActivity﹕ exception caught:
    org.json.JSONException: Unterminated string at character 3244 of {"status":"ok","count":10,"count_total":1949,"pages":195,"posts":[{"id":24680,"url":"http:\/\/blog.teamtreehouse.com\/create-sticky-navigation","title":"How to Create a Sticky Navigation","date":"2015-02-05 14:44:13","author":"Guil Hernandez","thumbnail":"http:\/\/blog.teamtreehouse.com\/wp-content\/uploads\/2015\/01\/sticky-150x150.jpg"},{"id":24690,"url":"http:\/\/blog.teamtreehouse.com\/hooks-wordpress-actions-filters-examples","title":"WordPress Hooks: Actions, Filters, and Examples","date":"2015-02-04 09:57:04","author":"Zac Gordon","thumbnail":"http:\/\/blog.teamtreehouse.com\/wp-content\/uploads\/2015\/01\/hooks-in-wordpress-150x150.png"},{"id":24712,"url":"http:\/\/blog.teamtreehouse.com\/font-families-hamburger-menus-flux-treehouse-show-episode-126","title":"Font Families, Hamburger Menus, Flux | The Treehouse Show | Episode 126","date":"2015-02-03 11:35:10","author":"Chris Zabriskie","thumbnail":"http:\/\/blog.teamtreehouse.com\/wp-content\/uploads\/2015\/02\/Scre���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
02-07 16:34:11.431    2368-2368/com.novsky.zefir.blogreader E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.novsky.zefir.blogreader, PID: 2368
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
            at com.novsky.zefir.blogreader.MainListActivity.updateDisplayForError(MainListActivity.java:120)
            at com.novsky.zefir.blogreader.MainListActivity.handleBlogResponse(MainListActivity.java:86)
            at com.novsky.zefir.blogreader.MainListActivity.access$100(MainListActivity.java:33)
            at com.novsky.zefir.blogreader.MainListActivity$GetBlogPostTask.onPostExecute(MainListActivity.java:165)
            at com.novsky.zefir.blogreader.MainListActivity$GetBlogPostTask.onPostExecute(MainListActivity.java:123)
            at android.os.AsyncTask.finish(AsyncTask.java:632)
            at android.os.AsyncTask.access$600(AsyncTask.java:177)
            at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

My Java file

MainListActivity.java
package com.novsky.zefir.blogreader;

import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.Html;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ProgressBar;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;


public class MainListActivity extends ListActivity {


    public static final int NUMBER_OF_POSTS = 20;
    public static final String TAG = MainListActivity.class.getSimpleName();
    protected JSONObject mBlogData;
    protected ProgressBar mProgressBar;

    private final String KEY_TITLE = "title";
    private final String KEY_AUTHOR = "autor";



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_list);

        mProgressBar = (ProgressBar)findViewById(R.id.progressBar);

        if (isNetworkAvaliable()) {
            mProgressBar.setVisibility(View.VISIBLE);
            GetBlogPostTask getBlogPostTask = new GetBlogPostTask();
            getBlogPostTask.execute();
        } else {

            Toast.makeText(this, getString(R.string.network_unavaliable_message), Toast.LENGTH_LONG).show();
        }
    }



    private boolean isNetworkAvaliable() {
        ConnectivityManager manager = (ConnectivityManager)
                getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = manager.getActiveNetworkInfo();
        boolean isAvaliable = false;
        if(networkInfo !=null && networkInfo.isConnected()){
            isAvaliable = true;
        }
        return isAvaliable;
    }

    private void handleBlogResponse() {
        mProgressBar.setVisibility(View.INVISIBLE);

        if(mBlogData == null){
            updateDisplayForError();

        }else {
            try {
                JSONArray jsonPosts = mBlogData.getJSONArray("posts");
                ArrayList<HashMap<String, String>> blogPosts =
                        new ArrayList<HashMap<String, String>>();
                for (int i = 0; i < jsonPosts.length(); i++) {
                    JSONObject post = jsonPosts.getJSONObject(i);
                    String title = post.getString(KEY_TITLE);
                    title = Html.fromHtml(title).toString();
                    String author = post.getString(KEY_AUTHOR);
                    author = Html.fromHtml(author).toString();

                    HashMap<String, String> blogPost = new HashMap<String, String>();
                    blogPost.put(KEY_TITLE, title);
                    blogPost.put(KEY_AUTHOR, author);

                    blogPosts.add(blogPost);
                }
               String[] keys = {KEY_TITLE, KEY_AUTHOR};
                int[] ids = {android.R.id.text1, android.R.id.text2};
                SimpleAdapter adapter = new SimpleAdapter(this, blogPosts,
                        android.R.layout.simple_list_item_2, keys, ids);
                setListAdapter(adapter);

            } catch (JSONException e) {
                Log.e(TAG, "Exception caugth!", e);
            }

        }

    }

    private void updateDisplayForError() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(getString(R.string.error_title));
        builder.setMessage(getString(R.string.error_message));
        builder.setPositiveButton(android.R.string.ok, null);
        AlertDialog dialog = builder.create();
        dialog.show();


        TextView emptyTextView = (TextView) getListView().getEmptyView();
        emptyTextView.setText(getString(R.string.no_items));
    }

    private class GetBlogPostTask extends AsyncTask<Object, Void, JSONObject>{

        int responseCode = -1;
        JSONObject jsonResponse = null;


        @Override
        protected JSONObject doInBackground(Object... params) {
            try {
                URL blogFeedUrl = new URL("http://blog.teamtreehouse.com/api/get_recent_summary/?count=" + NUMBER_OF_POSTS);
                HttpURLConnection connection = (HttpURLConnection) blogFeedUrl.openConnection();
                connection.connect();

                responseCode = connection.getResponseCode();
                if (responseCode == HttpURLConnection.HTTP_OK){
                    InputStream inputStream = connection.getInputStream();
                    Reader reader = new InputStreamReader(inputStream);
                    int contentLength = connection.getContentLength();
                    char[] charArray = new char[contentLength];
                    reader.read(charArray);
                    String responseData = new String(charArray);


                    jsonResponse = new JSONObject(responseData);

                } else {
                    Log.i(TAG, "Unsuccessful HTTP response CODE: " + responseCode);
                }
            } catch (MalformedURLException e) {
                Log.e(TAG, "exception caught: ", e);
            } catch (IOException e) {
                Log.e(TAG, "exception caught: ", e);
            } catch (Exception e){
                Log.e(TAG, "exception caught: ", e);
            }

            return jsonResponse;
        }

        @Override
        protected void onPostExecute(JSONObject result){
                mBlogData = result;
                handleBlogResponse();
        }
    }
}

5 Answers

Eric Michaud
Eric Michaud
6,547 Points

The issue is here...

        TextView emptyTextView = (TextView) getListView().getEmptyView();
        emptyTextView.setText(getString(R.string.no_items));

It is because getListView().getEmptyView() is returning null. Make sure that in your activity_main_list.xml layout you have a TextView with android:id="@android:id/empty"

Stas Novsky
Stas Novsky
3,119 Points

it was that, but I have a new problem now)

Stas Novsky
Stas Novsky
3,119 Points

Now It's saying There was an Error getting data from the Blog. I think the problem is in Data from Blog. I was searching for solution and found something about problem with Blog Data and "&" symbol.

02-08 22:48:18.617    3627-3627/? E/memtrack﹕ Couldn't load memtrack module (No such file or directory)
02-08 22:48:18.618    3627-3627/? E/android.os.Debug﹕ failed to load memtrack module: -2
02-08 22:48:41.289      153-153/? E/EGL_emulation﹕ tid 153: eglCreateSyncKHR(1181): error 0x3004 (EGL_BAD_ATTRIBUTE)
02-08 22:48:52.103    3648-3648/? E/memtrack﹕ Couldn't load memtrack module (No such file or directory)
02-08 22:48:52.103    3648-3648/? E/android.os.Debug﹕ failed to load memtrack module: -2
02-08 22:48:52.814    3543-3661/com.novsky.zefir.blogreader E/MainListActivity﹕ exception caught:
    org.json.JSONException: Unterminated string at character 3244 of {"status":"ok","count":10,"count_total":1949,"pages":195,"posts":[{"id":24680,"url":"http:\/\/blog.teamtreehouse.com\/create-sticky-navigation","title":"How to Create a Sticky Navigation","date":"2015-02-05 14:44:13","author":"Guil Hernandez","thumbnail":"http:\/\/blog.teamtreehouse.com\/wp-content\/uploads\/2015\/01\/sticky-150x150.jpg"},{"id":24690,"url":"http:\/\/blog.teamtreehouse.com\/hooks-wordpress-actions-filters-examples","title":"WordPress Hooks: Actions, Filters, and Examples","date":"2015-02-04 09:57:04","author":"Zac Gordon","thumbnail":"http:\/\/blog.teamtreehouse.com\/wp-content\/uploads\/2015\/01\/hooks-in-wordpress-150x150.png"},{"id":24712,"url":"http:\/\/blog.teamtreehouse.com\/font-families-hamburger-menus-flux-treehouse-show-episode-126","title":"Font Families, Hamburger Menus, Flux | The Treehouse Show | Episode 126","date":"2015-02-03 11:35:10","author":"Chris Zabriskie","thumbnail":"http:\/\/blog.teamtreehouse.com\/wp-content\/uploads\/2015\/02\/Screenshot-2015-02-03-11.34.26-150x150.png"},{"id":24706,"url":"http:\/\/blog.teamtreehouse.com\/nested-routes-laravel-4","title":"Nested Routes in Laravel 4","date":"2015-02-03 11:27:04","author":"Hampton Paulk","thumbnail":"http:\/\/blog.teamtreehouse.com\/wp-content\/uploads\/2015\/02\/Screenshot-2015-02-03-11.26.04-150x150.png"},{"id":24693,"url":"http:\/\/blog.teamtreehouse.com\/add-navigation-drawer-android","title":"How to Add a Navigation Drawer in Android","date":"2015-02-02 14:54:34","author":"Ben Jakuben","thumbnail":"http:\/\/blog.teamtreehouse.com\/wp-content\/uploads\/2015��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

what means these symbols "�"?

Eric Michaud
Eric Michaud
6,547 Points

Try replacing your doInBackground method with the one Ben posted in this thread: https://teamtreehouse.com/forum/trying-to-retrieve-data-from-my-own-blog-help

Stas Novsky
Stas Novsky
3,119 Points
02-09 22:40:45.079    4194-4256/com.novsky.zefir.blogreader E/MainListActivity﹕ exception caught:
    org.json.JSONException: Unterminated string at character 3244 of {"status":"ok","count":10,"count_total":1949,"pages":195,"posts":[{"id":24680,"url":"http:\/\/blog.teamtreehouse.com\/create-sticky-navigation","title":"How to Create a Sticky Navigation","date":"2015-02-05 14:44:13","author":"Guil Hernandez","thumbnail":"http:\/\/blog.teamtreehouse.com\/wp-content\/uploads\/2015\/01\/sticky-150x150.jpg"},{"id":24690,"url":"http:\/\/blog.teamtreehouse.com\/hooks-wordpress-actions-filters-examples","title":"WordPress Hooks: Actions, Filters, and Examples","date":"2015-02-04 09:57:04","author":"Zac Gordon","thumbnail":"http:\/\/blog.teamtreehouse.com\/wp-content\/uploads\/2015\/01\/hooks-in-wordpress-150x150.png"},{"id":24712,"url":"http:\/\/blog.teamtreehouse.com\/font-families-hamburger-menus-flux-treehouse-show-episode-126","title":"Font Families, Hamburger Menus, Flux | The Treehouse Show | Episode 126","date":"2015-02-03 11:35:10","author":"Chris Zabriskie","thumbnail":"http:\/\/blog.teamtreehouse.com\/wp-content\/uploads\/2015\/02\/Screen�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

the same diamonds after replacing Ben's code

Eric Michaud
Eric Michaud
6,547 Points

Okay, undo what I said before, and go back to the thread. Look for the guy who posted an answer under Ben's and do what he says.