在ListFragment中设置EmptyListView无法按预期方式工作

时间:2015-06-27 20:51:28

标签: android android-layout android-listfragment

我正在尝试设置自定义ListFragment的Empty视图,以便在列表为空时以编程方式显示。空布局的Xml文件如下所示。只是一个TextView。

(list_empty_view.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" 
android:gravity="center"
>

<TextView 
     android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="No Items"
android:textSize="30sp"
android:gravity="center"
/>

</LinearLayout>    

我在ListFragment中使用以下代码来设置EmptyView。我只是猜测它是设置它的正确位置,因为在此之前ListView没有实例化,因此如果我调用getListView()

则抛出错误
@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);
    View v=getActivity().getLayoutInflater().inflate(R.layout.list_empty_view, null);
    getListView().setEmptyView(v);
}

当列表为空时,这不显示EmptyView所以我认为问题是在inflate方法中为root参数提供null。所以我用另一个答案中找到的东西替换了null。

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);
        View v=getActivity().getLayoutInflater().inflate(R.layout.list_empty_view, (ViewGroup)getListView().getParent());
        getListView().setEmptyView(v);

    }

此工作正常,List现在显示以前的布局,当它为空时但是当我将一个项目添加到我的列表时,该项目没有出现在列表中。只是一个空白的屏幕。甚至不是我刚设置的EmptyView布局。

我对这个问题完全无能为力,因为我用一些我不完全掌握的东西替换了null。因此,我所使用的所有步骤的任何帮助将不胜感激,因为我现在是Android的新手。我只是想以编程方式添加空布局,因为如果这样可行,我计划在空布局中添加更多内容(按钮,ImageView等)

3 个答案:

答案 0 :(得分:0)

使用ListFragment的最简单方法(至少在我的经验中)是提供自定义布局,而不是让它使用默认布局。 The documentation显示了一个非常简单的示例,说明如何为ListFragment指定布局;您只需确保对其进行充气并将其返回onCreateView()

res/layout/my_list_fragment.xml

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

    <ListView android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        ... />

    <TextView android:id="@android:id/empty"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="No Items"
        android:textSize="30sp" />
</FrameLayout>

在你的片段中:

@Override
public void onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View root = inflater.inflate(R.layout.my_list_fragment, container, false);
    ...
    return root;
}

答案 1 :(得分:0)

我认为问题是您为空视图夸大的视图实际上并不是视图层次结构的一部分(例如,您从不调用someViewGroup.addView(emptyView))。当列表没有项目时,由于它具有空视图,ListView变为GONE,空视图变为VISIBLE,但如果它不在视图层次结构中,则它永远不会被看到,因此是空白屏幕。

另一个选择是仅使用空FrameLayout(或其他一些ViewGroup)作为布局XML中的空视图,并以编程方式将视图添加到该视图中。

答案 2 :(得分:0)

Karakuri给出的提示非常有帮助。问题实际上是我没有添加空列表视图来查看ListFragment的层次结构,因此它无法正确替换它。用这个替换了我的代码并且它有效。

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);
    View v = getActivity().getLayoutInflater().inflate(
            R.layout.list_empty_view, null);
    ((ViewGroup) getListView().getParent()).addView(v);
    getListView().setEmptyView(v);
}