我正在尝试修改现有代码,而不是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定义视图的推荐方法是什么?
答案 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}你必须自己管理进度容器和空视图的可见性。