listFragment中的空listView

时间:2014-05-08 07:27:44

标签: android listview android-listfragment

我有一个列表片段。当我运行应用程序时,我看到一个空的listView。 我不知道问题是什么。也许我应该使用图书馆?

public class MyEmployeFragment extends ListFragment {

    private static final String ATTRIBUTE_ID = "p_id";
    private static final String ATTRIBUTE_NAME = "p_name";
    private static final String ATTRIBUTE_LAST_NAME = "p_last_name";
    ArrayList<spr_item> ret_data;
    MyTask task;
    SimpleAdapter sAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

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

        task = new MyTask();
        task.execute();

        return inflater.inflate(R.layout.my_employe, null);
    }


    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        ret_data = new ArrayList<spr_item>();

        ArrayList<Map<String, Object>> data = new ArrayList<Map<String, Object>>(
                ret_data.size());
        Map<String, Object> m;
        for (int i = 0; i < ret_data.size(); i++) {
            m = new HashMap<String, Object>();
            m.put(ATTRIBUTE_ID, ret_data.get(i).getId());
            m.put(ATTRIBUTE_NAME, ret_data.get(i).getName());
            m.put(ATTRIBUTE_LAST_NAME, ret_data.get(i).getLastName());
            data.add(m);
        }

        // массив имен атрибутов, из которых будут читаться данные
        String[] from = {ATTRIBUTE_ID, ATTRIBUTE_NAME, ATTRIBUTE_LAST_NAME};
        // массив ID View-компонентов, в которые будут вставлять данные
        int[] to = {R.id.tw_employe_id, R.id.tw_employe_name, R.id.tw_employe_last_name};

        // создаем адаптер
         sAdapter = new SimpleAdapter(getActivity(), data, R.layout.list_item_employee,
                from, to);

            // определяем список и присваиваем ему адаптер
            ListView lvSimple = (ListView) getView().findViewById(android.R.id.list);
            lvSimple.setAdapter(sAdapter);

    }

         class MyTask extends AsyncTask<Void, Void, Void> {

             @Override
             protected void onPreExecute() {
                 super.onPreExecute();

             }

             @Override
             protected Void doInBackground(Void... params) {

                 String s = "5ACACEC6-752B-4EFF-AA50-EEBE58A52113";
                 // String user_guid = myPrefs.getString("guid", "");

                 HttpActivity _http = new HttpActivity("192.168.10.11", "80");
                 _http.set_addr_protocol("/WebSite/P/spr/spr.aspx/");
                 _http.add_param("query", "spr_employee_get");
                 // _http.add_param("p_guid", user_guid.toString().trim());
                 _http.add_param("p_guid", s);
                 _http.send();

                 List<spr_item> tempList = _http.getArrayParamValue();
                 for(int i = 0; i < tempList.size(); i++)
                     ret_data.add(tempList.get(i));

                 //employer_name = _http.getArrayParamValue("p_name");
                 //employer_id = _http.getArrayParamValue("p_id");
                 //employer_last_name = _http.getArrayParamValue("p_last_name");

                 return null;
             }

             protected void onPostExecute(Void result) {
                 super.onPostExecute(result);

                 sAdapter.notifyDataSetChanged();

             }
         }

    }

2 个答案:

答案 0 :(得分:0)

如果上面的代码除了空列表之外,如果任务加载太快,你也可能有空指针异常。这里onCreate首先调用onCreateView next,然后调用onActvityCreated。所以最好在onCreate中初始化适配器,在onCreateView中将适配器设置为listView,并使用getListView()方法在onActvityCreated中设置listView监听器。

除此之外,如果您使用本地数据库检索数据,则需要使用cursorADapter来获取数据

答案 1 :(得分:0)

适配器的数据引用(ArrayList,数组等)往往很容易丢失。在这种情况下,notfiyDataSetChanged()方法将不起作用。如果您坚持使用此方法,我建议您再次检查对适配器源的引用。如果不是这种情况,这就是我在项目中使用的方法。提前发出一个小警告,格式化和括号关闭的执行情况很差,但方法仍然很清晰。

public class MyFragment extends ListFragment {

// For populating the list view.
SomeAdapter adapter;

public MyFragment() {
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    String[] parameters = {"url for request"};
    new GetRequestTask().execute(parameters);

}

// The async task to make the HTTP GET requests.
class GetRequestTask extends AsyncTask<String, String, String>{

    @Override
    protected String doInBackground(String... uri) {
        HttpClient httpclient = new DefaultHttpClient();
        HttpResponse response;
        String responseString = null;
        try {
            response = httpclient.execute(new HttpGet(uri[0]));
            StatusLine statusLine = response.getStatusLine();
            if(statusLine.getStatusCode() == HttpStatus.SC_OK){
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                response.getEntity().writeTo(out);
                out.close();
                responseString = out.toString();
            } else{
                //Closes the connection.
                response.getEntity().getContent().close();
                throw new IOException(statusLine.getReasonPhrase());
            }
        } catch (ClientProtocolException e) {
            Log.e("GetRequestTask", "Client protocol exception.");
            e.printStackTrace();
        } catch (IOException e) {
            Log.e("GetRequestTask", "IO exception.");
            e.printStackTrace();
        }

        return responseString;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
            // Update UI with the new response.
    new UpdateUITask().execute(result);
        }
    }
}

// The async task to update the UI.
class UpdateUITask extends AsyncTask<String, String, ArrayList<Something>>{

    @Override
    protected ArrayList<Something> doInBackground(String... input) {
        ArrayList<Something> someArray = new ArrayList<Something>();
        try{
            // Do some JSON magic to parse the data.
        }
        catch(JSONException je){
            Log.e("UpdateUITask", "JSON parsing error occured.");
            je.printStackTrace();
        }

        return someArray;
    }

    @Override
    protected void onPostExecute(ArrayList<Something> result) {
        super.onPostExecute(result);
        Log.i("UpdateUITask", "Updating UI.");
        adapter = new SomeAdapter(getActivity(), R.layout.some_list_item, restOfTheParameters);
        setListAdapter(adapter);
    }
}


    }
}