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

Cleaning Up Our Presentation. ProgressBar

Hello, i have an error on my android app that i cannot seem to solve. After i include the progress bar and the code needed to display the progress bar my android app still shows "No items to display!" in the background as the progressbar spins in the front. My data still displays after it loads and the progress bar goes invisible. But how do i get a blank screen with just the progress bar loading like ben does in his video. Thanks again for the help.

3 Answers

Ben Jakuben
STAFF
Ben Jakuben
Treehouse Teacher

Paste in the code you are trying and we will try to help you troubleshoot. :)

Alrighty here it goes! This is all the code in the MainLIstActivity file. Im not sure if you need my xml codes? Thanks in advance Ben ! :)

package com.Arkman.blogreader;

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;

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

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.View;
import android.widget.ProgressBar;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

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 = "author";

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

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

        if(isNetworkAvailable()){
            mProgressBar.setVisibility(View.VISIBLE);
            GetBlogPostsTask getBlogPostsTask = new GetBlogPostsTask();
            getBlogPostsTask.execute();
        }
        else{
            Toast.makeText(this, "Network is Unavailable!", Toast.LENGTH_LONG).show();
        }
        //Toast.makeText(this, getString(R.string.no_items), Toast.LENGTH_LONG).show();

    }

    private boolean isNetworkAvailable() {

        ConnectivityManager manager = ((ConnectivityManager) 
                getSystemService(Context.CONNECTIVITY_SERVICE));
        NetworkInfo networkInfo = manager.getActiveNetworkInfo();

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main_list, menu);
        return true;
    }



    public 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 Caught!", 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 GetBlogPostsTask extends AsyncTask<Object, Void, JSONObject>{

        @Override
        protected JSONObject doInBackground(Object... arg0) {
            int responseCode= -1;
            JSONObject jsonResponse = null;

        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, "Unsecessful 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();
        }
    }



}
Ben Jakuben
Ben Jakuben
Treehouse Teacher

Did you happen to clear out the text for the empty TextView in activity_main_list.xml? Here's mine:

    <TextView
        android:id="@android:id/empty"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" />

Then the text gets set on an error with these lines (which you do have):

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

Wow it's so crazy how one line can make a difference! Indeed it was this line

 android:text="@string/no_items"

Thanks again Ben! Have a great day. :)