XML中ListFragment的自定义空视图

时间:2014-04-16 18:31:13

标签: android android-listview

我正在尝试修改现有代码,而不是Android新手。如果我解释的任何概念或假设在这个世界上没有意义,请告诉我!

我的目标是为XML列表视图的空视图定义布局。今天,我们通过编程方式调整源自onActivityCreated的{​​{1}} CustomListFragment中的默认空视图来实现此功能:

ListFragment

我宁愿用XML定义我的空视图的样式。它更干净,我可以使用自定义布局,而现在它只允许一个字符串。

它似乎依赖于默认的listview布局(因为我无法在片段代码中找到任何setEmptyText(getResources().getString(R.string.listview_empty)); TextView emptyTextView = (TextView) getListView().getEmptyView(); emptyTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.listview_empty_text_size)); emptyTextView.setTextColor(getResources().getColor(R.color.listview_empty_text)); ),其中包含空文本视图,进度指示器等。我试图提供我的自定义布局;这是我的XML:

inflate

现在我在<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@android:id/empty" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="No items to show."/> <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="match_parent"></ListView> </LinearLayout>

中覆盖onCreateView
CustomListFragment

我从@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.custom_listview, container, false); return view; } 删除了我在上面发布的代码。

现在,由于onActivityCreated&#39; s ListFragment为空,我遇到了崩溃。它最初由mProgressContainer设置为:

ensureList()

我是否应该定义一个&#34; Progress Container&#34;在我的自定义布局中控制?在我看来,这不是正确的方法,因为我需要将mProgressContainer = root.findViewById(INTERNAL_PROGRESS_CONTAINER_ID); 设置为id

为空文本情况提供自定义XML定义视图的推荐方法是什么?

2 个答案:

答案 0 :(得分:5)

您需要使用setEmptyView而不是setEmptyText。

此相关问题和答案显示了如何使用您可以使用setEmptyView https://stackoverflow.com/a/15990955/443900

设置的自定义视图

摘要是做类似的事情:

// if you're using a ListFragment
// do this inside onActivityCreated 
View  emptyView = getActivity().getLayoutInflater().inflate(R.layout.empty_view, null);

((ViewGroup)getListView().getParent()).addView(emptyView);
getListView().setEmptyView(emptyView);

答案 1 :(得分:3)

ListFragment的documentation onCreateView()说:

  

如果要使用自己的自定义内容覆盖此方法,请考虑在布局文件中包含标准布局list_content,以便继续保留ListFragment的所有标准行为。特别是,这是目前显示内置不确定进度状态的唯一方法。

检查ensureList()方法的source表明,如果您使用的是自定义视图,则不仅仅是考虑因素:看起来您拥有包含标准list_content布局,否则在查找进度容器时会爆炸。

但是,即使你确实包括:

    <include layout="@android:layout/list_content" />
在您的XML中

,并且您定义了自己的ID为android.R.id.empty的自定义空视图,您将使用自己的空视图遇到问题。 ensureList()中的代码更喜欢默认布局的空视图:

        mStandardEmptyView = (TextView)root.findViewById(
                com.android.internal.R.id.internalEmpty);
        if (mStandardEmptyView == null) {
            mEmptyView = root.findViewById(android.R.id.empty);
        } else {
            mStandardEmptyView.setVisibility(View.GONE);
        }

我还尝试直接在列表视图中设置空视图,即:

getListView().setEmptyView(myCustomEmptyView)

但这也有问题,因为列表片段在显示内置进度容器时不知道隐藏空视图。

我的结论是,如果您要定义自己的自定义空视图,则无法利用ListFragment的内置行为或方法,例如setListAdapter()和{{1}你必须自己管理进度容器和空视图的可见性。