0

我正在尝试创建一些条目的列表,从而在 php 服务器上产生查询。我正在使用一个片段,它调用一个AsyncTask名为DescarregarLlistatEntrades. 这个类,基本上是从 php 执行中解析 json 数据,然后我想填充一个 List,但是由于DescarregarLlistatEntrades不是扩展ListActivity,我不能使用方法setListAdapter

这是代码:

片段:

public class MyFragmentB extends Fragment {
private ArrayList<HashMap<String, String>> llistatEntrades;
Context cont=getActivity(); //Recupero el contexte per poder pasar-lo.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View myFragmentView = inflater.inflate(R.layout.llistat_fotos, container, false);

    //hashmap per al llistat de les entrades que hi han al servidor
    llistatEntrades=new ArrayList<HashMap<String, String>>();

    //descarrego totes les imatges en segon plà i omplo el view
    new DescarregarLlistatEntrades(cont, myFragmentView, llistatEntrades).execute();

    //Recupero el el layout de la view per poder fer coses am ella a posteriori.
    ListView lv = (ListView)myFragmentView.findViewById(android.R.id.list);

    return myFragmentView;
}

DescarregarLlistatEntrades:

public class DescarregarLlistatEntrades extends AsyncTask<String, String, String>{
private Context mContext;
private View rootView;
private ArrayList<HashMap<String, String>> llistatEntrades;
private String linkFoto, dataUpload, usuariUpload, comentariUpload;
private ProgressDialog pDialog;
private List<NameValuePair> params = new ArrayList<NameValuePair>();
JSONParser jsonParser = new JSONParser();

private String url_get_entrades = "http://192.168.1.33/testing/recuperaentrades.php"; //passantli per get el id de la setmana 

public DescarregarLlistatEntrades(Context context, View rootView, ArrayList<HashMap<String, String>> llistatEntrades){
    this.mContext=context;
    this.rootView=rootView;
    this.llistatEntrades=llistatEntrades;
}

@Override
protected void onPreExecute() {
    [...]
}

@Override
protected String doInBackground(String... arg0) { 
    params.add(new BasicNameValuePair("setmana", "1"));
    JSONObject json = jsonParser.makeHttpRequest(url_get_entrades, "GET", params);
    JSONArray entradesObj;
    try {
        int success = json.getInt("success");
        //mirem si hi ha success
        if (success==1){
            entradesObj = json.getJSONArray("entrades"); //recupero totes les entrades
            for (int i=0; i<entradesObj.length();i++){
                JSONObject entrada = entradesObj.getJSONObject(i); //recupero cada objecte
                //guardo cada camp de cada entrada a variables:
                this.usuariUpload=entrada.getString("usuariUploader");
                this.linkFoto=entrada.getString("urlFoto");
                this.comentariUpload=entrada.getString("comentariUsuari");
                this.dataUpload=entrada.getString("dataUpload");
                //creo el hashmap dels valors anteriors
                HashMap<String, String> map = new HashMap<String, String>();
                map.put("usuariUpload", this.usuariUpload);
                map.put("linkFoto", this.linkFoto);
                map.put("comentariUpload", this.comentariUpload);
                map.put("dataUpload", this.dataUpload);
                this.llistatEntrades.add(map);
            }
        } else {
            Log.d("debugging","No hi han entrades..");
        }

    } catch (JSONException e) {
        e.printStackTrace();
    } 

    return null;
}

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);
    this.pDialog.dismiss(); //amago el dialog
    // updating UI
    /**
     * Updating parsed JSON data into ListView
     * */
    ListAdapter adapter = new SimpleAdapter(
            this.mContext, this.llistatEntrades,
            R.layout.entrada_llista, new String[] { "usuariUpload",
                    "linkFoto","comentariUpload", "dataUpload"},
            new int[] { R.id.userNameUploader, R.id.titolFoto, R.id.comment, R.id.hora });
    // updating listview
    setListAdapter(adapter); //THIS LINE!!

}

“DescarregarLlistatEntrades 类型的方法 setListAdapter(ListAdapter) 未定义”

使用片段时我应该使用其他方法吗?

请注意,我传递给 AsyncTask 类、Context 和 Inflater。也许我必须通过别的东西?

谢谢你。

4

2 回答 2

3

您应该将实例传递ListView给 asynctask,以便将列表适配器设置为此ListView. 如果您使用普通Fragment- 您可以添加ListView到布局,在onCreateView方法中检索它并传递给异步任务。您也可以使用ListFragment这种方式,您可以ListView通过getViewMethod在片段中使用来获得。rootView或者,如果它是片段布局的根,则只获取列表视图。就像是:

((ListView) rootView.findViewById(R.id.list_view)).setAdapter(adapter);
于 2013-01-05T14:14:33.893 回答
0

最终代码:这是 AsyncTask 类:

public DescarregarLlistatEntrades(Context context, View rootView, ArrayList<HashMap<String, String>> llistatEntrades, ListView lv){
    this.mContext=context;
    this.rootView=rootView;
    this.llistatEntrades=llistatEntrades;
    this.lv=lv;
}

还有片段

public class MyFragmentB extends Fragment {
private ArrayList<HashMap<String, String>> llistatEntrades;
Context cont;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    this.cont=getActivity(); //Recupero el contexte per poder pasar-lo.
    View myFragmentView = inflater.inflate(R.layout.llistat_fotos, container, false);

    //hashmap per al llistat de les entrades que hi han al servidor
    llistatEntrades=new ArrayList<HashMap<String, String>>();
    //Recupero el el layout de la view per poder fer coses am ella a posteriori.
    ListView lv = (ListView)myFragmentView.findViewById(android.R.id.list);

    //descarrego totes les imatges en segon plà i omplo el view
    new DescarregarLlistatEntrades(cont, myFragmentView, llistatEntrades, lv).execute();

    return myFragmentView;
}

像魅力一样工作!!

于 2013-01-05T14:50:08.147 回答