ListView没有在Fragment中显示数据

时间:2014-04-30 10:27:37

标签: android listview fragment

我有10个片段,每个片段都有ListView。我正在显示自定义适配器的数据。但ListView没有显示任何内容。示例: - 假设我在第4页并且有按钮。我点击它并从服务器获取一些数据,之后我使用自定义适配器。但数据未显示在ListView中。

我注意到,如果我将listview从onCreateView()替换为onActivityCreated()。有用。我能够在ListView上看到数据。但每个页面都更新为pageno-1的listview。 假设我在第5页并更新到listview。这里listno-5的listview没有显示数据。我看到它在第1页的列表视图中显示数据。

我认为,Fragment无法在所有页面中添加listview,因此每页都会显示数据。如果我在listiview中触摸获取错误,则在listview中添加数据后: -

04-30 16:03:40.120: W/AbsListView(8161): Intent to operate on non-exist data, childcount = 0,mFirstPosition = 0,adapter count = 0,action = 0,mActivePointerId = 0,mScrollY = 0,this = android.widget.ListView@42236718
04-30 16:03:40.159: W/AbsListView(8161): Intent to operate on non-exist data, childcount = 0,mFirstPosition = 0,adapter count = 0,action = 2,mActivePointerId = 0,mScrollY = 0,this = android.widget.ListView@42236718


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

    mView = inflater.inflate(R.layout.scorecard_swing_items,
            container, false);

    swingListView = (ListView) mView.findViewById(R.id.swingListView);
    return mView;
)

onActivityResult()

myAdapter adapter = new myAdapter(getActivity().getBaseContext(),
list);
swingListView.setAdapter(adapter);
adapter.notifyDataSetChanged();

1 个答案:

答案 0 :(得分:1)

您是否正在添加和删除ListView?如果是这样,这是错误的方法。当新数据从服务器进入时,您需要在适配器上操作以刷新数据。像

这样的东西
 function void onLoadFinished( List<?> myObjects )
 {
      this.adapter.clear();
      this.adapter.addAll( myObjects );
 }

这将立即清除列表并添加新数据。每次构建ListView都不是可行的方法。

此外,您可能应该考虑使用Loader框架,因为它将为您处理所有AsyncTask的内容。我使用a ADP's excellent examples here.

学习了模式

另外,请确保您正在扩展ListFragment。如果是这样,您的布局中必须包含ListView,其ID为@id/android:list,然后只需在onCreateView方法中进行设置即可。这是一个XML示例:

<!DOCTYPE android>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#FFFFFFFF" >

    <ListView
        android:id="@id/android:list"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentTop="true"
        android:cacheColorHint="#FDFFCE" />

    <Spinner
        android:id="@+id/location_spinner"
        android:layout_width="56dp"
        android:layout_height="1px"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:gravity="center"
        android:textColor="#FF000000"
        android:visibility="invisible" />

    <Spinner
        android:id="@+id/area_spinner"
        android:layout_width="wrap_content"
        android:layout_height="1px"
        android:layout_alignParentBottom="true"
        android:layout_toLeftOf="@+id/location_type_spinner"
        android:gravity="center"
        android:textColor="#FF000000"
        android:visibility="invisible" />    

</RelativeLayout>

然后视图在这里膨胀:

@Override
public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState )
{
    View view = inflater.inflate( R.layout.fragment_location_list, null );
    return view;
}

我在onActivityCreated中执行所有其他设置和视图绑定:

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

    LayoutInflater.from( getActivity() );
    getListView().setDividerHeight( 1 );
    getListView().setOnCreateContextMenuListener( this );
    getListView().setOnItemLongClickListener( this );
    getListView().setFocusable( true );
    getListView().setOnTouchListener( this );        
    .
    .
    .
}

这应该为您处理所有FragmentActivity生命周期事件。