如何在 ListFragment 中使用 setEmptyView() 和自定义列表布局
Posted
技术标签:
【中文标题】如何在 ListFragment 中使用 setEmptyView() 和自定义列表布局【英文标题】:How to use setEmptyView() with custom list layout in ListFragment 【发布时间】:2012-12-14 11:22:33 【问题描述】:我正在使用带有几个 Fragments
的分页器。
我想在列表中没有条目时显示一条消息 (Fragment
)。
我尝试将Textview
与android:id="@id/android:empty
一起使用,但它不起作用。
自定义列表布局代码:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:padding="@dimen/padding_medium" >
<TextView
android:id="@+id/label_value"
android:layout_
android:layout_
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="@dimen/padding_medium"
android:text="@string/label_value"
android:textColor="@android:color/white"
android:textSize="18sp" />
<TextView
android:id="@+id/label_date"
android:layout_
android:layout_
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="@dimen/padding_medium"
android:text="@string/title_time"
android:textColor="@android:color/white"
android:textSize="16sp" />
</RelativeLayout>
列出适配器类:
public class JournalAdapter extends ArrayAdapter<String>
private final Context context;
private final List<String> values;
private final List<String> dates;
public JournalAdapter(Context context, List<String> values,
List<String> dates)
super(context, R.layout.layout_journal_list, values);
this.context = context;
this.values = values;
this.dates = dates;
@Override
public View getView(int position, View convertView, ViewGroup parent)
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.layout_journal_list, parent, false);
TextView value = (TextView) rowView.findViewById(R.id.label_glucose);
TextView date = (TextView) rowView.findViewById(R.id.label_date);
value.setText(values.get(position));
date.setText(dates.get(position));
return rowView;
列表解析方法:
private void initListView()
values = dataSource.getAllValues();
List<String> values = new ArrayList<String>();
List<String> dates = new ArrayList<String>();
for (Value value : values)
values.add(Double.toString(value.getValue()));
dates.add(secondsToDate(value.getDate()));
setListAdapter(new JournalAdapter(context, values, dates));
listView = getListView();
listView.setEmptyView(noItems("NO ITEMS"));
listView.setOnItemClickListener(this);
noItems
方法:
private TextView noItems(String text)
TextView emptyView = new TextView(context);
emptyView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT));
emptyView.setText(text);
emptyView.setTextColor(Color.WHITE);
emptyView.setTextSize(20);
emptyView.setVisibility(View.GONE);
emptyView.setGravity(Gravity.CENTER_VERTICAL
| Gravity.CENTER_HORIZONTAL);
return emptyView;
【问题讨论】:
是否有任何理由将您在noItems()
方法中创建的TextView
的可见性设置为View.GONE?
我从这里***.com/questions/4088711/… 复制了这段代码。顺便说一句,我尝试删除此行并将其设置为 VISIBLE,但仍然相同。
您能否尝试在您的ListFragment
中仅设置一次空的TextView
(例如在onActivityCreated
中),然后简单地更新其文本(使用findViewById()
查找TextView
(当然要加一个id(比如android.R.id.empty
)))?
如果我理解正确,我无法使用 findviewById() 方法更新文本,因为 Eclipse 显示此错误:FragmentValue 类型的方法 findViewById(int) 未定义。附言FragmentValue 是类的名称。
是的,使用Activity
:getActivity().findViewById
【参考方案1】:
这对我有用(从this question 得到解决方案@ 由William Remacle 提出)。您可能错过的是将创建的TextView
添加到ListView
布局父级(下面的noItems
方法底部的第二行代码):
在我的ListFragment
中,我使用以下方法获取空视图的视图:
private TextView noItems(String text)
TextView emptyView = new TextView(getActivity());
//Make sure you import android.widget.LinearLayout.LayoutParams;
emptyView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
//Instead of passing resource id here I passed resolved color
//That is, getResources().getColor((R.color.gray_dark))
emptyView.setTextColor(getResources().getColor(R.color.gray_dark));
emptyView.setText(text);
emptyView.setTextSize(12);
emptyView.setVisibility(View.GONE);
emptyView.setGravity(Gravity.CENTER_VERTICAL
| Gravity.CENTER_HORIZONTAL);
//Add the view to the list view. This might be what you are missing
((ViewGroup) getListView().getParent()).addView(emptyView);
return emptyView;
然后在ListFragment
的onStart()
方法中设置空视图:
@Override
public void onStart()
super.onStart();
getListView().setEmptyView(
noItems(getResources().getString(R.string.widget_empty)));
【讨论】:
将emptyView
作为第一个孩子插入时,这对我来说更可靠:((ViewGroup) getListView().getParent()).addView(emptyView, 0);
,这样它就不会与ListView
重叠。
它就像一个魅力。我同意@TalkLittle,它比在布局中使用自定义视图要可靠得多。谢谢!
经过累人的搜索......终于上面的解决方案对我有用!谢谢@fahmy!【参考方案2】:
android:id="@android:id/empty"
而不是
android:id="@id/android:empty"
【讨论】:
还是一样。顺便说一句,Android 文档写的是@id/android:empty,而不是@android:id/empty。参考 - developer.android.com/reference/android/app/ListFragment.html以上是关于如何在 ListFragment 中使用 setEmptyView() 和自定义列表布局的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ListFragment 中触发 onListItemClick
Android Studio 中的 ListFragment