XML中ListFragment的自定义空视图

sig*_*ger 3 android android-listview

我正在尝试修改现有代码,而不是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));
Run Code Online (Sandbox Code Playgroud)

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

它似乎依赖于默认的listview布局(因为我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>
Run Code Online (Sandbox Code Playgroud)

现在我覆盖onCreateView了我的CustomListFragment:

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

我删除了上面发布的代码片段onActivityCreated.

现在,我得到一个崩溃,因为ListFragmentmProgressContainer为空.它最初设置ensureList()为:

mProgressContainer = root.findViewById(INTERNAL_PROGRESS_CONTAINER_ID);
Run Code Online (Sandbox Code Playgroud)

我应该在自定义布局中定义"Progress Container"控件吗?在我看来,这不是正确的方法,因为我需要给它id一套INTERNAL_PROGRESS_CONTAINER_ID.

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

Lee*_*Lee 6

您需要使用setEmptyView而不是setEmptyText.

此相关问题和答案显示如何使用您可以使用/sf/answers/1119366881/设置的自定义视图setEmptyView

总结是做类似的事情:

// 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);
Run Code Online (Sandbox Code Playgroud)