刷新ListFragment中的数据

时间:2014-01-22 19:25:47

标签: android android-listview android-listfragment

我想从php获取数据,然后在listview中显示。但我不知道不会告诉listview更新我为php获取的数据。我试着使用notifyDataSetChanged();,但我确实知道它应放在哪里。

public class List_View extends ListFragment{
    private String result;
    private ListView listView;
    private ArrayList<String> items = new ArrayList<String>();
    final String uri = "http://localhost/userinfo.php";

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View rootView = inflater.inflate(R.layout.list, container, false);
        setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, items));
        return rootView;
    }

    class sendPostRunnable implements Runnable{
        @Override
        public void run(){
            result = sendPostDataToInternet();
            String temp = "Not result.";

            try {
                JSONTokener jsonTokener = new JSONTokener(result); 
                JSONObject jsonObject = (JSONObject) jsonTokener.nextValue(); 
                JSONArray jarray = jsonObject.getJSONArray("response");
                for (int i = 0; i < jarray.length(); i++) { 
                    temp = "";
                    JSONObject jobject = jarray.getJSONObject(i); 
                    temp += "name: "+jobject.getString("name")+"\n"; 
                    temp += "email: "+jobject.getString("email"); 
                    items.add(temp);
                    temp = "";

                } 
                if(jarray.length() < 1){
                    items.add(temp);
                }
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


        }
    }

    private String sendPostDataToInternet(){

        HttpPost httpRequest = new HttpPost(uri);
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("uid", "u1"));
        try{

            httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
            HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest);

            if (httpResponse.getStatusLine().getStatusCode() == 200){
                String strResult = EntityUtils.toString(httpResponse.getEntity());
                return strResult;
            }
        } catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
}

1 个答案:

答案 0 :(得分:0)

您应该在单独的线程中收集其他集合中的所有到达数据(列表适配器中使用的除外),然后立即替换列表集合源,而不是应该调用notifyDataSetChanged()

        public class List_View extends ListFragment{
            private String result;
            private ListView listView;
    protected List newData;
    protected ArrayAdapter listAdapter;
            private ArrayList<String> items = new ArrayList<String>();
            final String uri = "http://localhost/userinfo.php";

            public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
                View rootView = inflater.inflate(R.layout.list, container, false);
    listAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, items);
                setListAdapter(listAdapter );
                return rootView;
            }

            class sendPostRunnable implements Runnable{
                @Override
                public void run(){
                    result = sendPostDataToInternet();
                    String temp = "Not result.";

// a new collection to fill from response
newData = new ArrayList<String>();
                    try {
                        JSONTokener jsonTokener = new JSONTokener(result); 
                        JSONObject jsonObject = (JSONObject) jsonTokener.nextValue(); 
                        JSONArray jarray = jsonObject.getJSONArray("response");
                        for (int i = 0; i < jarray.length(); i++) { 
                            temp = "";
                            JSONObject jobject = jarray.getJSONObject(i); 
                            temp += "name: "+jobject.getString("name")+"\n"; 
                            temp += "email: "+jobject.getString("email"); 
    //here you should create a corresponding object from JSON
    // and add it to newData List
                            newData .add(temp);
                            temp = "";

                        } 
                        if(jarray.length() < 1){
                            items.add(temp);
                        }
    // here you will have a newData List filled so you should
    // replace or add data from this List to ListView's used
    items.add(newData);
    listAdapter.notifyDataSetChanged();
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }


                }
            }

            private String sendPostDataToInternet(){

                HttpPost httpRequest = new HttpPost(uri);
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("uid", "u1"));
                try{

                    httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
                    HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest);

                    if (httpResponse.getStatusLine().getStatusCode() == 200){
                        String strResult = EntityUtils.toString(httpResponse.getEntity());
                        return strResult;
                    }
                } catch (Exception e){
                    e.printStackTrace();
                }
                return null;
            }
        }