使用Provider刷新列表

时间:2014-02-20 11:30:25

标签: android android-layout android-fragments

引言

我正在使用Database和ContentProvider来填充ListFragment。问题是我删除项目后没有刷新ListFragment,我必须关闭并重新打开应用程序以显示列表中添加的项目。

我以前工作得很好,但经过我在代码中做的修改后,这已经开始发生,我不知道如何解决。

造成这种情况的说明

从我的主Activity,我通过intent调用ListFragment。由于片段无法通过意图直接调用,因此我调用FragmentActivity,该函数仅用于启动ListFragment。

[Main] >> [FragmentActivity] >> [ListFragment]

由于我必须处理单窗格或双窗格,我创建了一个包含片段的布局,这称为list_layout

FragmentActivity:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.list_layout);
    //...

    if (mDualPane){
        MyPlacesListFragment listFragment = new MyPlacesListFragment();
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.add(R.id.list_fragment, listFragment).commit();
    }
    else {
        MyPlacesListFragment listFragment = new MyPlacesListFragment();
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.add(android.R.id.content, listFragment).commit();
    }
}

list_layout.xml:(对于单一窗格视图,双窗格视图类似但水平方向并添加Framelayout容器)

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <fragment 
        class="com.final.reversegeocoding.MyPlacesListFragment"
        android:id="@+id/list_fragment"
        android:layout_width="match_parent" 
        android:layout_height="match_parent" />  
</LinearLayout>

ListFragment使用ResourceCursorAdapter,因此我使用newVew和bindView方法。我只会把代码引用到我如何膨胀类屁股我已经检查过其他代码功能做得好。不得不说我膨胀android.R.layout.simple_list_item_2,因为这是我填写清单所需的布局。

ListFragment:

final class PlacesCursorAdapter extends ResourceCursorAdapter {
    private final LayoutInflater mInflater;

    public PlacesCursorAdapter(Context context, Cursor c) {
        super(context, android.R.layout.simple_list_item_2, c, 0);
        //...

    public View newView(Context context, Cursor cursor, ViewGroup parent) {

        View view = mInflater.inflate(android.R.layout.simple_list_item_2, parent, false);
        //...

结论

在我做之前,在FragmentActivity中设置setContentView(R.layout.list_layout);并在删除项目时正确刷新。

但是由于我必须处理单窗格或双窗格,我被迫这样做了,现在,当我删除一个项目时,列表会刷新,但是因为它包含在FragmentActivity&#39; s中list_layout并且在我退出并再次输入活动之前不会刷新,列表不会在其中刷新。

所以我的问题是: 如何修改此代码以便在不退出ListFragment的情况下刷新布局?

2 个答案:

答案 0 :(得分:0)

修改数据后,调用adapter.notifyDataSetChanged(),它会刷新数据

答案 1 :(得分:0)

好吧,正如帖子中所说,我知道它与布局有关。我只需要修改list_layout以及我在FragmentActivity上调用它的方式,它已经开始恢复正常。

<强> FragmentActivity:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.list_layout);

    MyPlacesListFragment listFragment = new MyPlacesListFragment();
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.add(R.id.list_fragment, listFragment).commit();
}

list_layout.xml:(对于单一窗格视图,双窗格视图类似但水平方向并添加Framelayout容器)

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Framelayout
        android:id="@+id/list_fragment"
        android:layout_width="match_parent" 
        android:layout_height="match_parent" />  
</LinearLayout>