1

フラグメントをベースにしたアプリを開発しています。これらのフラグメントのコンテンツの多くは、を利用してデータベースから収集されますAsyncTask。そのため、「データの取得」クラスを外部化して、再利用できるようにしようとしています。私の断片は次のとおりです。

public class LocalFragment extends SherlockListFragment {

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);

        LoadDataFromURL url_data = new LoadDataFromURL();
        url_data.setContext(getSherlockActivity());
        url_data.setURL("http://url.com/get_data/");
        url_data.execute();

    }

} 

LoadDataFromURLのクラスは次のとおりです。

class LoadDataFromURL extends AsyncTask<String, String, String>{

    String our_url;
    ListActivity our_context;
    private ProgressDialog pDialog;
    JSONParser jParser = new JSONParser();
    JSONArray results = null;
    List<PubListDetails> pubs = new ArrayList<PubListDetails>();
    Handler mHandler;

    public void setContext(ListActivity context){
        our_context = context;
    }

    public void setURL(String url){
        our_url = url;
    }

    ArrayList<HashMap<String, String>> productsList = new ArrayList<HashMap<String, String>>();

    @Override
    protected void onPreExecute() {

        // TODO Auto-generated method stub
        super.onPreExecute();

        mHandler = new Handler();

        pDialog = new ProgressDialog(our_context);
        pDialog.setMessage("Loading pubs please wait..");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    @Override
    protected String doInBackground(String... args) {
        // TODO Auto-generated method stub

        List<NameValuePair> params = new ArrayList<NameValuePair>();

        JSONArray json = jParser.makeHttpRequest(our_url, "GET", params);


        Log.d("All Products: ", json.toString());


        try {
            int success = json.length();

            if (success != 0){
                results = json;

                pubs.clear();


                for (int i = 0; i <results.length(); i++){
                    JSONObject c = results.getJSONObject(i);

                    String id = c.getString("id");
                    String name = c.getString("name");
                    String town = c.getString("town");
                    String county = c.getString("county");

                    //HashMap<String, String> map = new HashMap<String, String>();


                    pubs.add(new PubListDetails(id,name,town,county));
                    //map.put(TAG_PID, id);
                    //map.put(TAG_NAME, name);

                    //productsList.add(map);
                }
                }else{
                    Intent i = new Intent(our_context,MainMenu.class);

                    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    our_context.startActivity(i);
                }
            } catch (JSONException e){
                e.printStackTrace();
                }

        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        Toast.makeText(our_context, "ff", Toast.LENGTH_SHORT).show();
        // TODO Auto-generated method stub
        pDialog.dismiss();

our_context.runOnUiThread(new Runnable(){

    @Override
    public void run() {
        // TODO Auto-generated method stub
        ListAdapter adapter = new PubListAdapter(our_context, pubs);
        our_context.setListAdapter(adapter);
    }});

    }   

}

getSherlockActivityを渡さないことに基づいてエラーが発生します。ListActivityこれにsetListAdapterはが必要です。

これとは別に、私は概念的に要点を見逃しているとますます感じており、これは私が望むことを達成するための理想的な方法ではありません。

誰かがフラグメントからAsyncTaskデータを収集してデータを取り込む外部を呼び出す方法をアドバイスできListViewますか?

4

1 に答える 1

2

まず、SherlockListFragmentあなたのビジネスがではないようにデータを設定したいと思いますActivity

これとは別に、私は概念的に要点を見逃しているとますます感じており、これは私が望むことを達成するための理想的な方法ではありません。

誰かがフラグメントから、データを収集してリストビューにデータを入力する外部AsyncTaskを呼び出す方法をアドバイスできますか?

コールバックインターフェイスを実装するだけです。

public interface OnLoadDataListener {
      public onLoadComplete(List<PubListDetails> data);
}

フラグメントクラスにこのインターフェイスを実装させます。

public class LocalFragment extends SherlockListFragment implements OnLoadDataListener {

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {    
        super.onActivityCreated(savedInstanceState);
        LoadDataFromURL url_data = new LoadDataFromURL();
        url_data.setContext(getSherlockActivity());
        url_data.setURL("http://url.com/get_data/");
        url_data.setListener(this); // you could unite the setContext() method in the listener registration
        url_data.execute();
    }

    @Override
    public void onLoadComplete(List<PubListDetails> data) {
         ListAdapter adapter = new PubListAdapter(getSherlockActivity(), pubs);
         our_context.setListAdapter(adapter);
    }
}

そしてあなたの中でAsyncTask

private OnLoadDataListener mListener

public void setListener(OnLoadDataListener listener){
    mListener = listener;
}

そしてonPostExecute、データをリスナーに送信します。

@Override
protected void onPostExecute(String result) {
    Toast.makeText(our_context, "ff", Toast.LENGTH_SHORT).show();
    // TODO Auto-generated method stub
    pDialog.dismiss();
    if (mListener != null) {
        mListener.onLoadComplete(pubs);
    }
}
于 2012-11-20T15:14:17.820 に答える