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 trialEdward Poon
9,313 PointsListItemLink won't open
I created the Intent and everything but when I click the link item, it doesn't open up the browser window to the link.
package com.teamtreehouse.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.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.text.Html; import android.util.Log; import android.view.MenuItem; import android.view.View; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast;
import com.treamtreehouse.blogreader.R;
public class MainListActivity extends ListActivity {
//protected String[] mBlogPostTitles;
public static final int NUMBER_OF_POSTS = 32;
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();
}
/*Posts the array elements in the strings.xml onto the list*/
//Resources resources = getResources();
//mBlogPostTitles = resources.getStringArray(R.array.android_names);
//ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mBlogPostTitles);
//setListAdapter(adapter);
//Toast.makeText(this, getString(R.string.no_items), Toast.LENGTH_LONG).show();
}
protected void OnListItemClick(ListView l, View v, int position, long id){
super.onListItemClick(l, v, position, id);
JSONArray jsonPosts;
try {
jsonPosts = mBlogData.getJSONArray("posts");
JSONObject jsonPost = jsonPosts.getJSONObject(position);
String blogUrl = jsonPost.getString("url");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(blogUrl));
startActivity(intent);
} catch (JSONException e) {
logException(e);
}
}
private void logException(JSONException e) {
Log.e(TAG, "Exception caught!:", e);
}
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 onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
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>>();
//mBlogPostTitles = new String[jsonPosts.length()];
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);
//mBlogPostTitles[i] = title;
}
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_expandable_list_item_2, keys, ids);
//ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mBlogPostTitles);
setListAdapter(adapter);
} catch (JSONException e) {
// TODO Auto-generated catch block
logException(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));
}
//First parameter is the types passed into the GetBlogPost Tasks
//Second parameter is the type of progress units if we don't care put Void
//Third parameter is the return type of the GetBlogPostTask
private class GetBlogPostsTask extends AsyncTask<Object, Void, JSONObject>{
//Runs in another thread that's not the main thread.
//Objects... means that we can put 0 or more arguments into it.
@Override
protected JSONObject doInBackground(Object... params) {
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);
// String status = jsonResponse.getString("status");
//
// JSONArray jsonPosts = jsonResponse.getJSONArray("posts");
//
// for(int i = 0; i < jsonPosts.length(); i++){
// JSONObject jsonPost = jsonPosts.getJSONObject(i);
// String title = jsonPost.getString("title");
// Log.v(TAG, "Post " + i + ": " + title);
// }
}
else{
Log.i(TAG, "Unsuccessful HTTP Response Code " + responseCode);
}
Log.i("TAG", "Code " + responseCode);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
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;
}
//on post execute runs on the main thread
@Override
protected void onPostExecute(JSONObject result){
mBlogData = result;
handleBlogResponse();
}
}
}
1 Answer
Shawn Anderton
24,124 Pointsyou need to change this line
Intent intent = new Intent(Intent.ACTION_VIEW); to
Intent intent = new Intent(this, BlogWebViewActivity.class);
in your OnListItemClick method.
Edward Poon
9,313 PointsEdward Poon
9,313 PointsThanks for the input but in that specific video, he didn't use the BlogWebActivity.