setListAdapter没有显示

时间:2014-11-16 11:09:56

标签: android android-listfragment arrays android-runonuithread

我正在尝试将一组获取结果显示为列表。每当我尝试使用虚拟数据时,它都会正确显示,但当我将其更改为从服务器检索到的数据时,没有任何反应。我没有任何错误,因此非常令人困惑

import java.util.ArrayList;

import org.json.JSONArray;
import org.json.JSONException;

import android.app.ListFragment;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;

public class BlogFragment extends ListFragment {

    String[] countries = new String[] {
        "India",
        "Pakistan",
        "Sri Lanka",
        "China",
        "Bangladesh",
        "Nepal",
        "Afghanistan",
        "North Korea",
        "South Korea",
        "Japan"
    };

    String [] titles ={};
    ArrayAdapter<String> adapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        /** Creating an array adapter to store the list of countries **/
        new AsyncFetchData().execute();
        adapter = new ArrayAdapter<String>(inflater.getContext(), android.R.layout.simple_list_item_1,titles);

        return super.onCreateView(inflater, container, savedInstanceState);
    }

    private class AsyncFetchData extends AsyncTask
    {

        @Override
        protected Object doInBackground(Object... arg0) {


            JSONArray a = new JSONArray();
            ArrayList<String> aList = new ArrayList<String>();
            a = ServerAPI.getData();
            for (int i = 0; i < a.length(); i++) {
                String title = null;
                String content = null;
                try {
                    title = a.getJSONObject(i).getString("title");
                    content = a.getJSONObject(i).getString("content");
                    aList.add(title);
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println(title);
//              System.out.println(content);
            }
            titles = aList.toArray(new String[aList.size()]);
            /** Setting the list adapter for the ListFragment */


            return null;
        }

        protected void onPostExecute(Object result) {
        // TODO Auto-generated method stub
        ArrayAdapter aa = new ArrayAdapter(getActivity().getBaseContext(), android.R.layout.simple_list_item_1, titles);
        aa.notifyDataSetChanged();  
        setListAdapter(aa); 
    }
    }
}

字符串数组countriesrunOnUiThread方法中正确显示,而标题则没有。我检查置于标题字符串数组中的数据,它是否有效。 知道为什么会这样吗?

3 个答案:

答案 0 :(得分:0)

问题是:

您的适配器已使用旧数据集初始化。因此,您正在更新基础数据,但适配器仍保留旧数据。

您需要使用新数据更新适配器。

为此,

致电

adapter.notifyDatasetChanged(); 

之前

setListAdapter(adapter);
  

notifyDataSetChanged:   通知附加的观察者基础数据已经存在   已更改,任何反映数据集的视图都应自行刷新。

答案 1 :(得分:0)

首先为新标题创建一个新适配器,然后设置该适配器。

答案 2 :(得分:0)

我在代码中看到的一些奇怪的东西:

  1. onCreateView 中,您启动新的 AsyncFetchData()。execute()。如果想要下载当前列表项的数据可能很有用,对于整个列表,它是以其他方式制作的(不在onCreateView中)

  2. 我希望onCreateView能够创建一个新视图而不是调用 super.onCreateView 来访问视图元素(并用下载的数据填充它们)

  3. ListFragment用法的标准模式是:

    public class MyListFragment extends ListFragment {
    
      @Override
      public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
            "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
            "Linux", "OS/2" };
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
            android.R.layout.simple_list_item_1, values);
        setListAdapter(adapter);
      }
    
    }
    

    如果要使用 AsyncTask 中的下载数据更新列表,则应更新适配器引用的数组中的数据,而无需重新创建适配器本身。在UI线程上准备好新数据后立即调用 adapter.notifyDataChanged()(就像你想要做的那样,但通常是在 AsyncTask.postExecute()这是专为此案例设计的。

    我猜你在下载之前没有任何数据要显示。然后你不需要显示空列表,可能是某种进度条。它可能是 TextView “请稍候,下载...”下载完成后,您将用 ListView (或片段)替换TextView,可能是动画。通过这种方式,ListView将立即创建,您无需关心其异步下载。

    ADDED:关于进度条 - 最好使用标准的:

    ProgressDialog progress = new ProgressDialog(this);
    progress.setMessage("Please wait, downloading...");
    progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    progress.setIndeterminate(true);
    

    AsyncTask.onPreExecute()是个好地方。不要忘记在 onPostExecute()

    中将其关闭