简体   繁体   中英

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM