ListActivity上的空视图无效

时间:2011-09-06 03:18:04

标签: android android-layout listactivity custom-adapter

我拉着我的头发试图解决这个问题。从我读过的所有教程中,我有这种设置的方式应该有效。我有一个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()方法中有一个过程将使用数据填充数组,如果有数据,仍然可以在列表的每一行上看到“找不到项目”文本,“在数据下面”。因此,空文本基本上被数据覆盖。

2 个答案:

答案 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,以及 他们实际膨胀。