返回片段后ListView为空

Posted

技术标签:

【中文标题】返回片段后ListView为空【英文标题】:ListView empty after returning to fragment 【发布时间】:2014-02-06 05:33:38 【问题描述】:

我有一个 FragmentTabHost,它有 5 个选项卡,每个选项卡都有一个片段。其中一个片段包含一个 ListView。如果我将 Activity 推送到堆栈并返回,则 ListView 保持不变。如果我更改选项卡并返回到我的 ListView 片段,则列表为空。我的列表仍然存在,适配器和数据源完全相同,但表格没有绘制。

这是我的 XML

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    tools:context=".Timeline" >


    <ImageView
        android:id="@+id/avatarProfile"
        android:layout_
        android:layout_
        android:scaleType="center"
        android:src="@drawable/background_pattern" />

    <ListView
        android:id="@+id/listView1"
        android:layout_
        android:layout_
        android:clickable="true"
        android:divider="@null"
        android:dividerHeight="0dp" >
    </ListView>

</FrameLayout>

这是我的片段

public class Timeline extends Fragment 

    ListView list;
    Context context;
    int page = 1;
    JSONArray array;    
    TimelineAdapter adapter;
    boolean shouldReload = true;

    public Timeline() 
    

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        context = this.getActivity();
        page = 1;
        array = null;
        getData(page);
    

    public void onResume()

        //((Activity) context).getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.yummmie_title_bar);
        super.onResume();
        if(array != null)
            adapter.notifyDataSetChanged();

        


        //context = this.getActivity();
        //page = 1;
        //array = null;
        //getData(page);

    

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) 
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_timeline, container, false);
    

    public interface OnFragmentInteractionListener 
        // TODO: Update argument type and name
        public void onFragmentInteraction(Uri uri);
    

    public void getData(int page)

        RequestParams params = new RequestParams();

        SharedPreferences pref = context.getSharedPreferences("YUMMMIE",Context.MODE_PRIVATE);


        params.put("idUser", pref.getString("ID_USER", null));
        params.put("token", pref.getString("TOKEN", null));
        params.put("pagina", Integer.toString(page));
        params.put("version", "1");


        MessageObject.post(params, table, "getstream");
    

    //Response handlers para login
        AsyncHttpResponseHandler table = new AsyncHttpResponseHandler()
             @Override
             public void onSuccess(String response)

                 try 
                     JSONArray temp = new JSONArray(response);

                     if(array == null)
                         array = temp;
                         list = (ListView)((Activity) context).findViewById(R.id.listView1);
                         adapter = new TimelineAdapter(context,array);
                         list.setAdapter(adapter);
                         list.setOnScrollListener(scrollListener);
                     else
                         shouldReload = true;

                         if(temp.length() == 0)
                             shouldReload = false;
                         

                         array = concatArray(array,temp);
                         adapter.jsonArray = array;
                         adapter.notifyDataSetChanged();
                     


                 catch (JSONException e) 
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                
             

             @Override
             public void onFailure(Throwable e, String response) 
                 // Response failed :(

                 try 
                    JSONObject jsonResponse = new JSONObject(response);

                    JSONArray array = jsonResponse.getJSONArray("errors");
                    JSONObject error = array.getJSONObject(0);
                    UIHelper.sendAlert(context, error.getString("message"), error.getString("name"));

                 catch (JSONException e1) 

             

             @Override
             public void onFinish() 

             

        ;

        OnScrollListener scrollListener = new OnScrollListener()

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) 

                if (visibleItemCount == totalItemCount)
                else 
                    if ((firstVisibleItem + visibleItemCount) == totalItemCount && (shouldReload == true)) 

                        shouldReload = false;
                        page++;
                        getData(page);
                    
                

            

            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) 
            

        ;

        private JSONArray concatArray(JSONArray... arrs)
                throws JSONException 
            JSONArray result = new JSONArray();
            for (JSONArray arr : arrs) 
                for (int i = 0; i < arr.length(); i++) 
                    result.put(arr.get(i));
                
            
            return result;
        


【问题讨论】:

【参考方案1】:

我认为这可能是因为您在FragmentonCreate 方法中使用getData 填充列表。请尝试使用onViewCreatedonResume 填充您的列表。

【讨论】:

在另一个片段上按返回按钮时不会调用 onResume。【参考方案2】:

首先为您的列表视图定义一个适配器。其次控制你的反应类型。我看到了字符串,但你也许可以处理 jsonarray。最后设置你的适配器 mylist.setadapter(adapter);

【讨论】:

以上是关于返回片段后ListView为空的主要内容,如果未能解决你的问题,请参考以下文章

片段中的 Listview 适配器给出空指针异常

方向/配置更改后如何维护 ListView 片段状态?

片段事务分离和附加后ListView不工作?

添加数据库后填充listview

按下后退按钮时正在重新创建 Listview 片段

Listview设置适配器片段nullpointerexception