android - 刷新列表 fragment 时尚未创建内容 View

标签 android android-fragments

解决方案: 这是一个有 2 个不同的 WinnersFragment 实例的情况,导致 lv = getListView() 在刷新时为 null。

我的 fragment ListView 在加载时工作正常。但是,当我调用 public static void InitTask(String searchState) 时。我在 lv = getListView() 处得到尚未创建的内容 View 。

我的目标是用新的 json 刷新 ListView 。

我试过在执行前调用 getlistView,我试过使用新的 inittask。
我相信这与创建 WinnersFragment 的新实例有关,但我不确定。

我找到了这个 "Content view not yet Created" on Android Fragments但是虽然我知道它会影响主线程,但我不明白如何实现解决方案以查看这是否是我的问题。

 public class WinnersFragment extends ListFragment {
private static String URL = "http://www.xxx.com/RichardsTesting/winners.json";

Context context;
Winners_List_Adapter adapter;
static View v;
ListView lv;
ArrayList<String> alFName;
private ProgressDialog pd;
private static final String TAG_ID = "id";
private static final String TAG_FNAME = "fname";
private static final String TAG_STATE = "state";
private static final String TAG_CODE = "code";
private static final String TAG_AMOUNT = "amount";

ArrayList<HashMap<String, String>> winnersList;

JSONArray winners = null;

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

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

    v = inflater.inflate(R.layout.winners_list, container, false);
    context = getActivity().getApplicationContext();
    new InitTask().execute();

    return v;
}

@Override
public void onDestroy() {
    lv.setAdapter(null);
    super.onDestroy();
}

protected class InitTask extends AsyncTask<Context, Integer, String> {
    @Override
    protected void onPreExecute() {
        pd = new ProgressDialog(v.getContext());
        pd.setTitle("Updating...");
        pd.setMessage("Please wait.");
        pd.setCancelable(false);
        pd.setIndeterminate(true);
        pd.show();
    }

    @Override
    protected String doInBackground(Context... params) {
        // Hashmap for ListView
        winnersList = new ArrayList<HashMap<String, String>>();

        // Creating JSON Parser instance
        JSONParser jParser = new JSONParser();

        // getting JSON string from URL
        String json = jParser.getJSONFromUrl(URL);
        try {
            JSONArray json1 = new JSONArray(json);

            // looping through All Contacts
            for (int i = 0; i < json.length(); i++) {
                JSONObject c = json1.getJSONObject(i);

                // Storing each json item in variable
                String id = c.getString(TAG_ID);
                String fName = c.getString(TAG_FNAME);
                String state = c.getString(TAG_STATE);
                String code = c.getString(TAG_CODE);
                String amount = c.getString(TAG_AMOUNT);

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

                // adding each child node to HashMap key => value
                map.put(TAG_ID, id);
                map.put(TAG_FNAME, fName);
                map.put(TAG_STATE, state);
                map.put(TAG_CODE, code);
                map.put(TAG_AMOUNT, amount);

                // adding HashList to ArrayList
                winnersList.add(map);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return "COMPLETE!";
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        // selecting single ListView item
        lv = getListView();
        if (pd != null) {
            pd.dismiss();
        }
        setListWinners();
    }
}

public void setListWinners() {
    adapter = new Winners_List_Adapter(this.getActivity(), winnersList);
    lv.setAdapter(adapter);
}

public static void InitTask(String searchState) {
    if (searchState !=null) {
    URL = URL+"?state="+searchState;
    WinnersFragment search = new WinnersFragment();
    search.new InitTask().execute();
    }
}
}

日志

12-04 13:01:48.156: E/AndroidRuntime(1367): FATAL EXCEPTION: main
12-04 13:01:48.156: E/AndroidRuntime(1367): java.lang.IllegalStateException: Content view not yet created
12-04 13:01:48.156: E/AndroidRuntime(1367):     at android.support.v4.app.ListFragment.ensureList(ListFragment.java:328)
12-04 13:01:48.156: E/AndroidRuntime(1367):     at android.support.v4.app.ListFragment.getListView(ListFragment.java:222)
12-04 13:01:48.156: E/AndroidRuntime(1367):     at com.xxx.xxx.WinnersFragment$InitTask.onPostExecute(WinnersFragment.java:123)
12-04 13:01:48.156: E/AndroidRuntime(1367):     at com.xxx.xxx.WinnersFragment$InitTask.onPostExecute(WinnersFragment.java:1)
12-04 13:01:48.156: E/AndroidRuntime(1367):     at android.os.AsyncTask.finish(AsyncTask.java:631)
12-04 13:01:48.156: E/AndroidRuntime(1367):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
12-04 13:01:48.156: E/AndroidRuntime(1367):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
12-04 13:01:48.156: E/AndroidRuntime(1367):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-04 13:01:48.156: E/AndroidRuntime(1367):     at android.os.Looper.loop(Looper.java:137)
12-04 13:01:48.156: E/AndroidRuntime(1367):     at android.app.ActivityThread.main(ActivityThread.java:4898)
12-04 13:01:48.156: E/AndroidRuntime(1367):     at java.lang.reflect.Method.invokeNative(Native Method)
12-04 13:01:48.156: E/AndroidRuntime(1367):     at java.lang.reflect.Method.invoke(Method.java:511)
12-04 13:01:48.156: E/AndroidRuntime(1367):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008)
12-04 13:01:48.156: E/AndroidRuntime(1367):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)
12-04 13:01:48.156: E/AndroidRuntime(1367):     at dalvik.system.NativeStart.main(Native Method)

xml

  <ListView
    android:id="@id/android:list"
    android:layout_width="match_parent"
    android:layout_height="0dip"
    android:layout_weight="1"
    android:drawSelectorOnTop="false" />

调用 fragment 代码

public class TabsFragmentActivity extends FragmentActivity implements
    FragmentTabHost.OnTabChangeListener, OnClickListener {
      blablabla
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.btnDismiss:
        getSupportFragmentManager().popBackStackImmediate();
        break;
    case R.id.ibSearch:
        LayoutInflater inflater = LayoutInflater.from(this);
        final View textenter = inflater.inflate(R.layout.winners_list, null);
        final EditText userinput = (EditText) textenter
                .findViewById(R.id.etSearchState);
        String searchState = userinput.toString();
        WinnersFragment.InitTask(searchState);
        break;  
    }
}

最佳答案

尝试在 onActivityCreated() 方法中执行后台任务。

Fragment Lifecycle

关于android - 刷新列表 fragment 时尚未创建内容 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20382940/

相关文章:

android - 让我的 GPS 传感器停止时遇到一些问题

android泄漏窗口强制关闭

android - 当用户从另一个 Activity 中单击 "Back"时开始新 Activity

java - 在 VIewPager (Android) 中的两个 fragment 之间传递数据 (NullPointerException)

javascript - 以编程方式打开 <select> 选择器

Android为RecyclerView LayoutManager设置setReverseLayout

java - 在 ListFragment 的适配器显示的列表之前添加自定义布局

java - Android - 从 fragment 调用函数

android - 如何制作一个深度 fragment 以在屏幕上使用喷气背包导航和 BottomNavigationView 占据整个屏幕?

java - 单击项目时在 ListView 中使用 Intent 打开不同的 fragment