我拉着我的头发试图解决这个问题。从我读过的所有教程中,我有这种设置的方式应该有效。我有一个ListActivity,它使用自定义适配器来显示一些数据。如果适配器为空,我想显示“找不到项目”消息。
这是我的布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/BaseStyle"
android:orientation="vertical"
android:padding="5dip"
>
<ListView android:id="@android:id/list"
style="@style/BaseStyle"
/>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/empty"
style="@style/BaseStyle.Title"
android:text="No Items Found"
/>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/text"
style="@style/BaseStyle.Title"
android:layout_alignParentTop="true"
/>
</RelativeLayout>
这是我的代码:
public class Main extends ListActivity {
private CustomAdapter adapter;
private String[] items = {};
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
adapter = new CustomAdapter();
PopulateItems();
for (String item : items)
adapter.addItem(item);
this.setListAdapter(adapter);
adapter.notifyDataSetChanged();
}
private class CustomAdapter extends BaseAdapter {
private String[] mData;
private LayoutInflater mInflater;
public CustomAdapter() {
mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void addItem(String item) {
mData.add(item);
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder;
String item = (String)this.getItem(position);
if (convertView == null)
{
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.main, parent, false);
holder.text = (TextView)convertView.findViewById(R.id.text);
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
TextView tvText = holder.text;
tvText.setText(item);
}
static class ViewHolder {
TextView text;
}
当“items”字符串数组没有数据时,“No Items Found”文本显示正常。 PopulateItem()方法中有一个过程将使用数据填充数组,如果有数据,仍然可以在列表的每一行上看到“找不到项目”文本,“在数据下面”。因此,空文本基本上被数据覆盖。
答案 0 :(得分:1)
因为ID为“空”的文本视图仍然可见,所以最初将该视图的可见性设置为不可见,如果列表为空,则只显示该视图,
看看android:visibility =“invisible”参数。
并且在代码中,如果列表为空,则为yourtextview.setVisibility(View.VISIBILE)
答案 1 :(得分:0)
我不确定您是否在代码中提出了任何拼写错误。看起来你在发布代码之前就删除了部分代码。
getView()用于在ListView中为特定行制作视图。我猜你实际上夸大了你的main.xml,它是包含ListView,EmptyView和另一个TextView的RelativeLayout。
如果你的ListView只是在推迟字符串,只需实例化一个TextView并在getView中返回它
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
String item = (String)this.getItem(position);
if (convertView == null)
{
convertView = new TextView(context);
}
convertView.setText(item);
return convertView
}
通过自定义适配器的构造函数传递上下文
编辑:在一行中显示多个文字视图
如果我要严格要求,问题不在于convertView = mInflater.inflate()行。错误发生在文件中。如果列表视图中的每一行都有更复杂的视图,通常更容易为另一个xml文件充气。早期的错误是看似递归的main.xml膨胀
要处理多个textview,请执行以下操作:
创建另一个xml文件来表示listview中的每一行list_item.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
.....
>
<TextView android:id="@+id/list_text_1"
....
/>
<TextView android:id="@+id/list_text_2"
....
/>
<TextView android:id="@+id/list_text_3"
....
/>
</LinearLayout>
在适配器的getView实现中,
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
String item = (String)this.getItem(position);
if (convertView == null)
{
convertView = mInflater.inflate(R.layout.list_item.xml, parent, false);
//link list_text_1, list_text_2, list_text_3 as you need to the individual
// textviews
}
else {
// TODO linking up the textviews when convertView is not null
}
return convertView
}
考虑到需要对xml文件进行充气,这可能是引入视图模式的好时机。在此answer中链接的pdf文件的第11/19页给出了关于ViewHolder模式的非常好的解释。
最后,请阅读ListView的更多示例,并观察他们何时在getView中使用inflater,以及 他们实际膨胀。