Фрагмент реализации AsyncTask и Listview в android


Вот мой Java-код

Но это не работает, я не получаю свою ошибку. Snpashot

package info.androidhive.slidingmenu;
import java.util.ArrayList;
import java.util.HashMap;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;   
import android.app.Fragment;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

public class CommunityFragment extends Fragment {


    public CommunityFragment(){}

    // Declare Variables
    JSONObject jsonobject;
    JSONArray jsonarray;
    ListView listview;
    ListViewAdapter adapter;
    ProgressDialog mProgressDialog;
    ArrayList<HashMap<String, String>> arraylist;
    static String RANK = "rank";
    static String COUNTRY = "country";
    static String POPULATION = "population";
    static String FLAG = "flag";


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_community, container, false);

        new DownloadJSON().execute();
        return rootView;
    }
    // DownloadJSON AsyncTask
    private class DownloadJSON extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Create a progressdialog
            mProgressDialog = new ProgressDialog(CommunityFragment.this);
            // Set progressdialog title
            mProgressDialog.setTitle("Student Government App");
            // Set progressdialog message
            mProgressDialog.setMessage("Loading...");
            mProgressDialog.setIndeterminate(false);
            // Show progressdialog
            mProgressDialog.show();
        }

        @Override
        protected Void doInBackground(Void... params) {
            // Create an array
            arraylist = new ArrayList<HashMap<String, String>>();
            // Retrieve JSON Objects from the given URL address
            jsonobject = JSONFunctions
                    .getJSONfromURL("http://app-dlslsg.azurewebsites.net/json/postList.php");

            try {
                // Locate the array name in JSON
                jsonarray = jsonobject.getJSONArray("post");

                for (int i = 0; i < jsonarray.length(); i++) {
                    HashMap<String, String> map = new HashMap<String, String>();
                    jsonobject = jsonarray.getJSONObject(i);
                    // Retrive JSON Objects
                    map.put("rank", jsonobject.getString("id"));
                    map.put("country", jsonobject.getString("body"));
                    map.put("population", jsonobject.getString("stamp"));
                    map.put("flag", jsonobject.getString("image"));
                    // Set the JSON Objects into the array
                    arraylist.add(map);
                    //Log.i("body",COUNTRY);
                }
            } catch (JSONException e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void args) {
            // Locate the listview in listview_main.xml
            listview = (ListView) findViewById(R.id.listview);
            // Pass the results into ListViewAdapter.java
            adapter = new ListViewAdapter(CommunityFragment.this, arraylist);
            // Set the adapter to the ListView
            listview.setAdapter(adapter);
            // Close the progressdialog
            mProgressDialog.dismiss();
        }
    }

}

Я пытался искать по всей сети сегодня, но у меня нет возможности увидеть какие-либо связанные с этим проблемы. Кто-нибудь поможет мне разобраться в этом? я отвечу как можно скорее на эти ответы Заранее спасибо за помощь!

2 3

2 ответа:

Фрагмент-это не Контекст. Вы должны использовать getActivity() там, где вы используете CommunityFragment.this.

Заменить

mProgressDialog = new ProgressDialog(CommunityFragment.this);

С

mProgressDialog = new ProgressDialog(getActivity());

И

adapter = new ListViewAdapter(CommunityFragment.this, arraylist);

С

adapter = new ListViewAdapter(getActivity(), arraylist);

Оке, так что есть несколько ошибок:

  1. конструктор ListViewAdapter требует действия (или контекста), но вы передаете фрагмент. Вы можете использовать Fragment.getActivity() для получения действия для фрагмента, но только если он присоединен.
  2. конструктор ProgressDialog требует объект контекста,но вы снова передаете фрагмент. Фрагмент не расширяет контекст, но класс Activity расширяет. Опять же, вы можете пройти Fragment.getActivity().
  3. наконец, вы пытаетесь вызвать findViewById() форму внутри AsyncTask. Это метод, который доступен только внутри действия, поэтому снова необходимо получить действие и вызвать метод через объект действия.