【问题标题】:Custom empty view for ListFragment in XMLXML 中 ListFragment 的自定义空视图
【发布时间】:2014-05-31 19:07:35
【问题描述】:

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

我的目标是在 XML 中为我的列表视图的空视图定义一个布局。今天,我们通过编程调整 onActivityCreated 中的默认空视图来实现此功能,而我的 CustomListFragment 源自 ListFragment

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),其中包含一个空文本视图、一个进度指示器等。我试图提供我的自定义布局;这是我的 XML:

<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>

现在我在CustomListFragment 中覆盖onCreateView

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

我从onActivityCreated 中删除了我在上面发布的那段代码。

现在,我遇到了崩溃,因为ListFragmentmProgressContainer 为空。它最初是由ensureList()设置的:

mProgressContainer = root.findViewById(INTERNAL_PROGRESS_CONTAINER_ID);

我应该在我的自定义布局中定义一个“进度容器”控件吗?在我看来这不是正确的方法,因为我需要将id 设置为INTERNAL_PROGRESS_CONTAINER_ID

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

【问题讨论】:

    标签: android android-listview


    【解决方案1】:

    您需要使用 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);
    

    【讨论】:

    • 谢谢! :) 拯救我的一天! :)
    【解决方案2】:

    ListFragment 的 onCreateView() 的 documentation 表示:

    如果您使用自己的自定义内容覆盖此方法,请考虑在布局文件中包含标准布局 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()setListShown(),你必须管理它的可见性进度容器和自己的空视图。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多