NullPointerException come out into onPostExecute Method [duplicate] - java

This question already has answers here:
What is a NullPointerException, and how do I fix it?
(12 answers)
Closed 6 years ago.
public class MainFragment extends Fragment {
//private poster_adapter movieInfos;
private ArrayAdapter<MovieInfo> movieInfos;
private String LOG_TAG = MainFragment.class.getSimpleName();
public MainFragment() {
}
#Override
public void onStart() {
super.onStart();
FetchMovieInfo update = new FetchMovieInfo();
update.execute();
Log.d(LOG_TAG, Thread.currentThread().getStackTrace()[2].getMethodName());
}
#Nullable
#Override
public View onCreateView(LayoutInflater inflater, #Nullable ViewGroup container, #Nullable Bundle savedInstanceState) {
Log.d(LOG_TAG, Thread.currentThread().getStackTrace()[2].getMethodName());
/*movieInfos = new ArrayAdapter<String>(
getActivity(),
R.layout.poster_item_layout,
R.id.poster_item,
new ArrayList<String>()
);*/
View rootView = inflater.inflate(R.layout.activity_main_fragment, container, false);
// Log.d(LOG_TAG,movieInfos[]);
//infoAdapter = new poster_adapter(getActivity(), Arrays.asList(movieInfos));
GridView gridView = (GridView) rootView.findViewById(R.id.gridview);
gridView.setAdapter(movieInfos);
return rootView;
}
public class FetchMovieInfo extends AsyncTask<Void, Void, String[]> {
String LOG_TAG = MainActivity.class.getSimpleName();
private String[] getMovieInfoFromJSON(String moviesInfoJSONStr) throws JSONException {
Log.d(LOG_TAG, Thread.currentThread().getStackTrace()[2].getMethodName().toString());
JSONObject moviesInfoJSON = new JSONObject(moviesInfoJSONStr);
JSONArray movieInfoJSON = moviesInfoJSON.getJSONArray("results");
String[] poster_urls = new String[movieInfoJSON.length()];
for (int i = 0; i < movieInfoJSON.length(); i++) {
JSONObject movieInfo = movieInfoJSON.getJSONObject(i);
poster_urls[i] = movieInfo.getString("poster_path");
}
return poster_urls;
}
#Override
protected String[] doInBackground(Void... params) {
Log.d(LOG_TAG, Thread.currentThread().getStackTrace()[2].getMethodName().toString());
HttpURLConnection httpURLConnection = null;
BufferedReader reader = null;
String movieInfoStr = null;
try {
final String BASE_URL = "http://api.themoviedb.org/3/movie/popular?";
final String API_KEY_PARAM = "api_key";
Uri builtUri = Uri.parse(BASE_URL).buildUpon()
.appendQueryParameter(API_KEY_PARAM, BuildConfig.OPEN_MOVIE_INFO_API_KEY)
.build();
URL url = new URL(builtUri.toString());
httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("GET");
httpURLConnection.connect();
InputStream inputStream = httpURLConnection.getInputStream();
StringBuffer buffer = new StringBuffer();
if (inputStream == null) {
return null;
}
reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line + "\n");
}
if (buffer.length() == 0) {
return null;
}
movieInfoStr = buffer.toString();
} catch (IOException e) {
Log.e(LOG_TAG, "Error" + e);
return null;
} finally {
if (httpURLConnection != null)
httpURLConnection.disconnect();
if (reader != null) {
try {
reader.close();
} catch (final IOException e) {
Log.e(LOG_TAG, "Error" + e);
}
}
}
try {
return getMovieInfoFromJSON(movieInfoStr);
} catch (JSONException e) {
Log.e(LOG_TAG, e.getMessage(), e);
e.printStackTrace();
}
return null;
}
#Override
protected void onPostExecute(String[] results) {
Log.d(LOG_TAG, Thread.currentThread().getStackTrace()[2].getMethodName().toString());
if (results != null) {
movieInfos.clear();
for (String movieInfo : results) {
movieInfos.add(new MovieInfo(movieInfo));
}
}
}
}
}
Here is code.
When i was debugging,NullPointerException will come out as soon as i step into onPostExecute method.
I want to put some path string into my movie info adapter.
And when i was debugging,it will stop at some other libraries instead of code i wrote.

Your ArrayAdapter movieInfos was not instantiated. So when it ran to the line
movieInfos.clear();
NullPointerException wolud come out.

In your method onCreateView,you comment these code out:
/*movieInfos = new ArrayAdapter<String>(
getActivity(),
R.layout.poster_item_layout,
R.id.poster_item,
new ArrayList<String>()
);*/
So the movieInfos is a null object,never instantiated.Please cancel commenting these code out,you should instance movieInfos before your use it.

Related

why ListView does not filled while I am using AsyncTask?

I am writing an app that uses Google book search API , what the app suppose to do is to display a list of books based on a search query that i provide within the app's code as a String, i use an AsyncTask inner class to handle the background work (making HTTP request , JSON formatting ...etc), I also have book costume adapter and book class to get the data from , my problem is the app dose not display any book in the list view .
here's my code:
My Activity:
public class MainActivity extends AppCompatActivity {
final static String bookUrl = "https://www.googleapis.com/books/v1/volumes?q=android&maxResults=6";
private BookAdapter bookAdapter;
private ArrayList<Book> books;
private ListView list;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list = (ListView) findViewById(R.id.list);
new BookAsynck().execute(bookUrl);
}
private class BookAsynck extends AsyncTask<String, Void, ArrayList<Book>> {
#Override
protected ArrayList<Book> doInBackground(String... strings) {
books = Utils.fetchBookData(bookUrl);
return books;
}
#Override
protected void onPostExecute(ArrayList<Book> books) {
bookAdapter = new BookAdapter(MainActivity.this, books);
list.setAdapter(bookAdapter);
}
}
}
My Util class :
public class Utils {
public static final String LOG_TAG = Utils.class.getSimpleName();
public static ArrayList<Book> fetchBookData(String requestUrl) {
ArrayList<Book> bookList = new ArrayList<>();
URL url = CreateURl(requestUrl);
String json = null;
try {
json = makeHttpRequest(url);
} catch (IOException e) {
Log.e(LOG_TAG, "Error closing input stream", e);
}
bookList = extractBookData(json);
return bookList;
}
public static URL CreateURl(String stringUrl) {
URL url = null;
try {
url = new URL(stringUrl);
} catch (MalformedURLException e) {
Log.e(LOG_TAG, "Error with creating URL ", e);
}
return url;
}
//make http request and return a string containing the response
public static String makeHttpRequest(URL url) throws IOException {
String jsonResponse = "";
//if the url is null return empty string
if (url == null) {
return jsonResponse;
}
HttpURLConnection urlcon = null;
InputStream inputstream = null;
try {
urlcon = (HttpURLConnection) url.openConnection();
urlcon.setRequestMethod("GET");
urlcon.setReadTimeout(1000 /*milleseconds*/);
urlcon.setConnectTimeout(1500 /*milleseconds*/);
urlcon.connect();
//if the request wass Successul (code 200)
// get the input stream and decode it
if (urlcon.getResponseCode() == 200) {
inputstream = urlcon.getInputStream();
jsonResponse = readFromStream(inputstream);
} else {
Log.e(LOG_TAG, "Error response code " + urlcon.getResponseCode());
}
} catch (IOException e) {
Log.e(LOG_TAG, "Problem retrieving the book JSON results", e);
} finally {
if (urlcon != null) {
urlcon.disconnect();
}
if (inputstream != null) {
inputstream.close();
}
}
return jsonResponse;
}
//decode the inputstream into string that conatin the Jsresponse from the Server
private static String readFromStream(InputStream inputStream) throws IOException {
StringBuilder output = new StringBuilder();
if (inputStream != null) {
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, Charset.forName("UTF-8"));
BufferedReader reader = new BufferedReader(inputStreamReader);
String line = reader.readLine();
while (line != null) {
output.append(line);
line = reader.readLine();
}
}
return output.toString();
}
public static ArrayList<Book> extractBookData(String json) {
ArrayList<Book> booklist = new ArrayList<>();
if (TextUtils.isEmpty(json)) {
return null;
}
try {
JSONObject base = new JSONObject(json);
JSONArray itemsArray = base.optJSONArray("items");
for (int i = 0; i < itemsArray.length(); i++) {
JSONObject first = itemsArray.getJSONObject(i);
JSONObject volume = new JSONObject("volumeInfo");
String title = volume.getString("title");
JSONArray authorsArray = volume.getJSONArray("authors");
String author = authorsArray.getString(0);
Book b = new Book(title, author);
booklist.add(b);
}
} catch (JSONException e) {
Log.e(LOG_TAG, "Problem parsing the book JSON results", e);
}
return booklist;
}
}
My Book Adapter:
public class BookAdapter extends ArrayAdapter<Book> {
public BookAdapter(Context c, ArrayList<Book> book) {
super(c, 0, book);
}
#NonNull
#Override
public View getView(int position, #Nullable View convertView, #NonNull ViewGroup parent) {
View list = convertView;
if (list == null) {
list = LayoutInflater.from(getContext()).inflate(R.layout.item, parent, false);
}
Book b = getItem(position);
TextView titleTextView = (TextView) list.findViewById(R.id.title);
titleTextView.setText(b.getName());
TextView author = (TextView) list.findViewById(R.id.author);
author.setText(b.getAuthor());
return list;
}
}
It looks like you missed calling your asynctask inside activity
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list = (ListView) findViewById(R.id.list);
new BookAsynck().execute(bookUrl);
}
Welcome to stackoverflow !!
Beginning at Android 9, requests without encryption will not work, that means HttpsURLConnection will work but HttpURLConnection will not.
Then the URL you try to connect must have a https:// access or you should include this in your manifest
android:usesCleartextTraffic="true"
Change the below line from onCreate()
ListView list = (ListView) findViewById(R.id.list);
to
list = (ListView) findViewById(R.id.list);

android api json array within array parsing java

I'm making a simple news app for my class and i'm using an api from The Guardian to populate my feed. I had it all working with the article Title, Date, and URL, but upon adding the Section and Author name I cant seem to get it to populate the feed. The device is saying No News Found and the log is saying "Error response code: 429"
Any help/criticism is greatly appreciated!
Activity
public class NewsActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<List<News>> {
private static final String LOG_TAG = NewsActivity.class.getName();
private static final String GUARDIAN_REQUEST_URL =
"http://content.guardianapis.com/search?section=games&order-by=newest&api-key=test&show-tags=contributor";
private static final int NEWS_LOADER_ID = 1;
private NewsAdapter mAdapter;
private TextView mEmptyStateTextView;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.news_activity);
ListView newsListView = (ListView) findViewById(R.id.list);
mEmptyStateTextView = (TextView) findViewById(R.id.empty_view);
newsListView.setEmptyView(mEmptyStateTextView);
mAdapter = new NewsAdapter(this, new ArrayList<News>());
newsListView.setAdapter(mAdapter);
newsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
News currentNews = mAdapter.getItem(position);
Uri newsUri = Uri.parse(currentNews.getUrl());
Intent websiteIntent = new Intent(Intent.ACTION_VIEW, newsUri);
startActivity(websiteIntent);
}
});
ConnectivityManager connMgr = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
LoaderManager loaderManager = getLoaderManager();
loaderManager.initLoader(NEWS_LOADER_ID, null, this);
} else {
View loadingIndicator = findViewById(R.id.loading_indicator);
loadingIndicator.setVisibility(View.GONE);
mEmptyStateTextView.setText(R.string.no_internet_connection);
}
}
#Override
public Loader<List<News>> onCreateLoader(int i, Bundle bundle) {
return new NewsLoader(this, GUARDIAN_REQUEST_URL);
}
#Override
public void onLoadFinished(Loader<List<News>> loader, List<News> news) {
View loadingIndicator = findViewById(R.id.loading_indicator);
loadingIndicator.setVisibility(View.GONE);
mEmptyStateTextView.setText(R.string.no_news);
if (news != null && !news.isEmpty()) {
mAdapter.addAll(news);
updateUi(news);
}
}
private void updateUi(List<News> news) {
}
#Override
public void onLoaderReset(Loader<List<News>> loader) {
mAdapter.clear();
}
}
Adapter
public class NewsAdapter extends ArrayAdapter<News> {
public NewsAdapter(Context context, List<News> news) {
super(context, 0, news);
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
View listItemView = convertView;
if (listItemView == null) {
listItemView = LayoutInflater.from(getContext()).inflate(
R.layout.news_list_item, parent, false);
}
News currentNews = getItem(position);
TextView titleView = (TextView) listItemView.findViewById(R.id.title);
String title = currentNews.getTitle();
titleView.setText(title);
TextView dateView = (TextView) listItemView.findViewById(R.id.date);
String dateToString = String.valueOf(currentNews.getDate());
String date = dateToString.substring(0, 10);
dateView.setText(date);
TextView authorView = (TextView) listItemView.findViewById(R.id.firstname);
String authorFirstName = currentNews.getAuthorFirstName();
authorView.setText(authorFirstName);
TextView lastNameView = (TextView) listItemView.findViewById(R.id.lastname);
String authorLastName = currentNews.getAuthorLastName();
lastNameView.setText(authorLastName);
TextView sectionView = (TextView) listItemView.findViewById(R.id.section);
String section = currentNews.getSection();
sectionView.setText(section);
return listItemView;
}
}
QueryUtils
public class QueryUtils {
private static final String LOG_TAG = QueryUtils.class.getSimpleName();
private QueryUtils() {
}
public static List<News> fetchNewsData(String requestUrl) {
// Create URL object
URL url = createUrl(requestUrl);
// Perform HTTP request to the URL and receive a JSON response back
String jsonResponse = null;
try {
jsonResponse = makeHttpRequest(url);
} catch (IOException e) {
Log.e(LOG_TAG, "Problem making the HTTP request.", e);
}
List<News> newss = extractResultFromJson(jsonResponse);
return newss;
}
private static URL createUrl(String stringUrl) {
URL url = null;
try {
url = new URL(stringUrl);
} catch (MalformedURLException e) {
Log.e(LOG_TAG, "Problem building the URL ", e);
}
return url;
}
private static String makeHttpRequest(URL url) throws IOException {
String jsonResponse = "";
// If the URL is null, then return early.
if (url == null) {
return jsonResponse;
}
HttpURLConnection urlConnection = null;
InputStream inputStream = null;
try {
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setReadTimeout(10000 /* milliseconds */);
urlConnection.setConnectTimeout(15000 /* milliseconds */);
urlConnection.setRequestMethod("GET");
urlConnection.connect();
// If the request was successful (response code 200),
// then read the input stream and parse the response.
if (urlConnection.getResponseCode() == 200) {
inputStream = urlConnection.getInputStream();
jsonResponse = readFromStream(inputStream);
} else {
Log.e(LOG_TAG, "Error response code: " + urlConnection.getResponseCode());
}
} catch (IOException e) {
Log.e(LOG_TAG, "Problem retrieving the news JSON results.", e);
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
if (inputStream != null) {
inputStream.close();
}
}
return jsonResponse;
}
private static String readFromStream(InputStream inputStream) throws IOException {
StringBuilder output = new StringBuilder();
if (inputStream != null) {
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, Charset.forName("UTF-8"));
BufferedReader reader = new BufferedReader(inputStreamReader);
String line = reader.readLine();
while (line != null) {
output.append(line);
line = reader.readLine();
}
}
return output.toString();
}
private static List<News> extractResultFromJson(String newsJSON) {
if (TextUtils.isEmpty(newsJSON)) {
return null;
}
List<News> newss = new ArrayList<>();
try {
JSONObject baseJsonResponse = new JSONObject(newsJSON);
JSONObject mainResponse = baseJsonResponse.getJSONObject("response");
JSONArray newsArray = mainResponse.getJSONArray("results");
for (int i = 0; i < newsArray.length(); i++) {
JSONObject currentNews = newsArray.getJSONObject(i);
String title = currentNews.getString("webTitle");
String date = currentNews.getString("webPublicationDate");
String url = currentNews.getString("webUrl");
String section = currentNews.getString("sectionName");
JSONArray tagsArray = currentNews.getJSONArray("tags");
for (int j = 0; j < tagsArray.length(); j++) {
JSONObject currentTag = tagsArray.getJSONObject(j);
String authorFirstName = currentTag.getString("firstName");
String authorLastName = currentTag.getString("lastName");
News news = new News(title, date, url, authorFirstName, authorLastName, section);
newss.add(news);
}
}
} catch (JSONException e) {
Log.e("QueryUtils", "Problem parsing the news JSON results", e);
}
return newss;
}
}

Trying to get response from server, but it only displays "Toast Server not responding"

I am trying to get response from server but it only display me toast server not supported.i don't understand what is going on here. i have assigned the api to a static variable that i declare in another class.
Code:
public class SpeakersFrag extends Fragment {
private List<SpeakersBean> dataset;
// private Context context;
private ProgressDialog progressDialog;
SessionContoller sessionContoller;
RecyclerView recyclerView;
public SpeakerAdapter speakerAdapter;
Context context;
#Nullable
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View myview=inflater.inflate(R.layout.speakers,null);
this.context=getActivity(); //cmt ctx
this.sessionContoller=new SessionContoller(this.context);
RecyclerView recyclerView = (RecyclerView) myview.findViewById(R.id.Recycler_viewrest);
// List<String> dataSet=new ArrayList<>();
recyclerView.setHasFixedSize(true);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this.context);
recyclerView.setLayoutManager(linearLayoutManager);
//linearLayoutManager.setOrientation;
recyclerView.setLayoutManager(linearLayoutManager);
if (AppStatus.getInstance(this.context).isOnline(this.context)) {
new GetSpeakerList().execute(new Void[0]);
} else if (this.sessionContoller.getSpeakerData() != null) {
setData(this.sessionContoller.getSpeakerData());
} else {
Dialog.noInternetAlertBox(this.context);
}
// new GetSpeakerList().execute(new Void[0]);
recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this.context,new Listener()));
return myview;
}
class Listener implements RecyclerItemClickListener.ClickListener{
#Override
public void onItemClick(View view, int i) {
SpeakersBean speakersBean=SpeakersFrag.this.getSpeakerAdapter().getItem(i);
Intent in=new Intent(SpeakersFrag.this.context,SpeakerDetail.class);
in.putExtra("speaker", speakersBean);
startActivity(in);
}
}
class GetSpeakerList extends AsyncTask<Void, Void,String> {
ProgressDialog pd;
#Override
protected void onPreExecute() {
// pd = new ProgressDialog(getActivity()).show(getActivity(), "", "Loading...");
SpeakersFrag.this.progressDialog = new ProgressDialog(SpeakersFrag.this.context);
SpeakersFrag.this.progressDialog.setMessage("Loading...");
SpeakersFrag.this.progressDialog.setCancelable(false);
SpeakersFrag.this.progressDialog.show();
}
#Override
protected String doInBackground(Void... params) {
return SpeakersFrag.this.performPostCallback(Constants.Webservice.SPEAKER_API);
}
#Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
if (!result.equals(BuildConfig.FLAVOR))
{
try
{
JSONObject jsonObject = new JSONObject(result); // set ` *emphasized text*`status code to continue the webservice as define in constants
if (jsonObject.getString("status_code").equals("100") && jsonObject.getString("message").equalsIgnoreCase("Success"))
{
System.out.println("Speaker data with Json and gson Parsing");
sessionContoller = new SessionContoller(getContext());
JSONArray jsonArray = jsonObject.getJSONArray("items"); //items
SpeakersFrag.this.dataset = (List) new Gson().fromJson(jsonArray.toString()
, new TypeToken<List<SpeakersBean>>() {}.getType());
SpeakersFrag.this.speakerAdapter = new SpeakerAdapter(SpeakersFrag.this.context, SpeakersFrag.this.dataset);
SpeakersFrag.this.recyclerView.setAdapter(SpeakersFrag.this.speakerAdapter);
SpeakersFrag.this.sessionContoller.setSpeakerData(jsonArray.toString());
}
} catch (JSONException e)
{
Log.e("SpeakerFragment", e.toString(), e);
// e.printStackTrace();
}
}
else if (SpeakersFrag.this.sessionContoller.getSpeakerData() != null) {
SpeakersFrag.this.setData(SpeakersFrag.this.sessionContoller.getSpeakerData());
}else{
Toast.makeText(getActivity(),Constants.SERVER_ERROR,Toast.LENGTH_LONG).show();
}
SpeakersFrag.dismissDialog(SpeakersFrag.this.progressDialog);
}
}
private void setData(String speakerData){
JSONException e;
try {
JSONArray jsonSpeaker = new JSONArray(speakerData);
JSONArray jarray;
{
try {
this.dataset = (List) new Gson().fromJson(jsonSpeaker.toString(), new TypeToken<TypeToken<List<SpeakersBean>>>(){}.getType());
this.speakerAdapter = new SpeakerAdapter(SpeakersFrag.this.context, SpeakersFrag.this.dataset);
this.recyclerView.setAdapter(this.speakerAdapter); //add speakerfrag
jarray=jsonSpeaker;
// ().getType());
} catch (Exception e1) {
jarray = jsonSpeaker;
e1.printStackTrace();
}
}
}catch (JSONException e3) {
e=e3;
e.printStackTrace();
}
}
public String performPostCallback(String requestURL)
{
String response=BuildConfig.FLAVOR;
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
try {
//send post data request
HttpURLConnection connection=(HttpURLConnection) new URL(requestURL).openConnection();
connection.setReadTimeout(15000);
connection.setConnectTimeout(15000);
connection.setRequestMethod("POST");
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setReadTimeout(15000);
OutputStream outputStream=connection.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8")); //UTF-8 encode the string into utf format
outputStream.flush(); //flushes the output stream and forces to any buffered device to be written out
outputStream.close(); //close pd
if (connection.getResponseCode() != ItemTouchHelper.Callback.DEFAULT_DRAG_ANIMATION_DURATION) {
return BuildConfig.FLAVOR;
}
//Read the server response
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
while (true) {
String line = br.readLine(); //read server response
if (line == null) {
return response;
}
response = response + line; //Append response
System.out.println("Response request====>>>>>"+response); //response from server
}
} catch (Exception e) {
Log.e("SpeakerFragment", e.toString(), e);
return response;
}
}
public SpeakerAdapter getSpeakerAdapter(){
return this.speakerAdapter;
}
public static void dismissDialog(ProgressDialog pd) {
if (pd != null) {
try {
if (pd.isShowing()) {
pd.dismiss();
}
} catch (Exception e)
{
e.printStackTrace();
} catch (Throwable th){
th.printStackTrace();
}
}
}
----------
}
Blockquote
I think its from the server side error....
Toast.makeText(getActivity(),Constants.SERVER_ERROR,Toast.LENGTH_LONG).show();
This code is working,thats why its showing that error

Results not showing in the ListView Android

I've been working on an android app ... I am stuck at a point ... after getting the JSON data from the internet I am having trouble to show it in the ListView ... Below is my code ...
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();
}
}
}
From the above code you can see that i am getting that data through doInBackground method of AsyncTask ... Data is coming through perfectly as I can see through the logcat ... The issue is somewhere in this method which I can't seem to figure out ..
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);
}
}
}
The above method is called in onPostExecute I mean if i print to logcat within this method I can see the results being printed but when I try to show those results in the onCreateView method results don't show up not even in the logcat ... Any help will be appreciated ... Thanks
Change your code as following:
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);
}
}
}
Use same array list in both update and initialize so globally declare a single array list and update it in updateList() method,
Try like this,
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 even you can use in onPostExecute
#Override
protected void onPostExecute(JSONObject result) {
super.onPostExecute(result);
mBlogData = result;
updateList();
titleAdapter.notifyDataSetChanged();//here
}
find the listview : ListView listView = (ListView) rootView.findViewById(R.id.listview_name); before calling
GetBlogPost getBlogPost = new GetBlogPost();
getBlogPost.execute();
and put this line listView.setAdapter(titleAdapter); in your onPostExecute method.

Android listview not getting populated with data

I am new to Android Studio and have a simple android view i am working on. A button click makes a call to the foursquare API and get backresults for starbucks around my location that I parse and am trying to set to the adapter for the listbox on the same view. If i put a breakpoint in the OnPostExecute() I see the mFoursquare adapter that I set for the listview has two json string results in the mFoursquareAdapter , I even call the
mFoursquareAdapter.notifyDataSetChanged();
in it but the view does not get refreshed with the results. I have posted the code below. Can anyone please point out what I am doing wrong or need to change since I already have the results and need to get this done...Your help and feedback very much appreciated! thanks
public class FoursquareInfoFragment extends android.app.Fragment {
private ArrayAdapter<String> mFoursquareAdapter;
public FoursquareInfoFragment() {
}
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Dummy data for the ListView. Here's the sample weekly forecast
String[] data = {
"Sample Foursquare Data",
};
List<String> foursquareList = new ArrayList<String>(Arrays.asList(data));
mFoursquareAdapter = new ArrayAdapter<String>(
getActivity(), // the current context ie the activity
R.layout.fragment_my, // the name of the layout Id
R.id.textViewFoursquare, // the Id of the TextView to populate
foursquareList);
View rootView = inflater.inflate(R.layout.fragment_my, container, false);
//View resultsView = inflater.inflate(R.layout.results, container, false);
View resultsView = inflater.inflate(R.layout.fragment_my, container, false);
ListView listView = (ListView) resultsView.findViewById(R.id.listview_FoursquareInfo);
listView.setAdapter(mFoursquareAdapter);
Button btnGetFoursquareData = (Button) rootView.findViewById(R.id.btnFoursquare);
btnGetFoursquareData.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
FetchFoursquareDataTask fetch = new FetchFoursquareDataTask();
fetch.execute("Starbucks");
}
});
return rootView;
}
public class FetchFoursquareDataTask extends AsyncTask<String, Void, String[]> {
private final String LOG_TAG = FetchFoursquareDataTask.class.getSimpleName();
#Override
protected void onPostExecute(String[] result) {
if (result != null) {
mFoursquareAdapter.clear();
for (String ItemStr : result) {
mFoursquareAdapter.add(ItemStr);
}
mFoursquareAdapter.notifyDataSetChanged();
}
}
#Override
protected String[] doInBackground(String... params) {
// If there's no venue category, theres nothing to look up. Verify the size of the params.
if (params.length == 0) {
return null;
}
// These two need to be declared outside the try/catch
// so that they can be closed in the finally block.
HttpURLConnection urlConnection = null;
BufferedReader reader = null;
// Will contain the raw JSON response as a string.
String foursquareJsonStr = null;
try {
// Build Foursquare URI with Parameters
final String FOURSQUARE_BASE_URL =
"https://api.foursquare.com/v2/venues/search";
final String client_id = "client_id";
final String client_secret = "client_secret";
final String v = "20130815";
final String near = "Dunwoody, Ga";
final String query = "Starbucks";
final String limit = "2";
Uri builtUri = Uri.parse(FOURSQUARE_BASE_URL).buildUpon()
.appendQueryParameter("client_id", client_id)
.appendQueryParameter("client_secret", client_secret)
.appendQueryParameter("v", v)
.appendQueryParameter("near", near)
.appendQueryParameter("query", query)
.appendQueryParameter("limit", limit)
.build();
URL url = new URL(builtUri.toString());
// Create the request to Foursquare, and open the connection
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();
// Read the input stream into a String
InputStream inputStream = urlConnection.getInputStream();
StringBuffer buffer = new StringBuffer();
if (inputStream == null) {
// Nothing to do.
return null;
}
reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line + "\n");
}
if (buffer.length() == 0) {
// Stream was empty. No point in parsing.
foursquareJsonStr = null;
return null;
}
foursquareJsonStr = buffer.toString();
Log.v(LOG_TAG, "Foursquare JSON String: " + foursquareJsonStr);
} catch (IOException e) {
Log.e(LOG_TAG, "Error ", e);
// If the code didn't successfully get the fpursquare data, there's no point in attempting
// to parse it.
return null;
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
if (reader != null) {
try {
reader.close();
} catch (final IOException e) {
Log.e("PlaceholderFragment", "Error closing stream", e);
}
}
}
String[] list = new String[]{"", ""};
try {
JSONObject foursquareJson = new JSONObject(foursquareJsonStr);
JSONObject responseObject = (JSONObject) foursquareJson.get("response");
JSONArray foursquareArray = responseObject.getJSONArray("venues");
list = new String[foursquareArray.length()];
for (int i = 0; i < foursquareArray.length(); i++) {
list[i] = foursquareArray.get(i).toString();
}
return list;
} catch (JSONException e) {
Log.e(LOG_TAG, e.getMessage(), e);
e.printStackTrace();
} finally {
Log.e(LOG_TAG, "ba");
return list;
}
}
}
}
This
mFoursquareAdapter.add(ItemStr);
Should be
foursquareList.add(ItemStr)
And you'll need to declare foursquareList properly (as a field).
You should also declare your Adapter as a field variable as well, just in case you need to reference it later

Categories

Resources