0

我正在拔头发试图弄清楚这一点。从我读过的所有教程中,我的设置方式应该可以工作。我有一个使用自定义适配器来显示一些数据的 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() 方法中有一个过程,它将用数据填充数组,如果有数据,在列表的每一行上仍然可以看到“No Items Found”文本,即数据的“下方”。所以空文本基本上被数据覆盖了。

4

2 回答 2

1

因为您的 id 为“empty”的文本视图仍然可见,所以最初将该视图的可见性设置为不可见,如果列表为空,则仅使其可见,
请查看 android:visibility="invisible" 参数。
如果列表为空,则在代码中 yourtextview.setVisibility(View.VISIBILE)

于 2011-09-06T03:33:32.790 回答
0

我不确定您是否在代码的问题中输入了任何拼写错误。看起来您在将部分代码发布到此处之前已经删除了部分代码。

getView() 用于为ListView 中的特定行制作视图。我猜你实际上夸大了你的 main.xml,这是你的 RelativeLayout,包含 ListView、EmptyView 和另一个 TextView。

如果您的 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
}

通过自定义适配器的构造函数传入 Context

编辑:在一行中显示多个文本视图

如果我要严格一点,问题不在于 convertView = mInflater.inflate() 行。错误在膨胀的文件中。如果列表视图中的每一行都有更复杂的视图,通常更容易扩充另一个 xml 文件。较早的错误是对 main.xml 的递归膨胀

要处理多个文本视图,请这样做:

创建另一个 xml 文件来表示列表视图中的每一行,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 文件,这可能是引入 viewholder 模式的好时机。此答案中链接的 pdf 文件的第 11/19 页对 ViewHolder 模式提供了很好的解释。

最后,请阅读更多 ListView 的示例,并观察他们何时在 getView 中使用充气器以及它们实际充气的内容。

于 2011-09-06T05:27:02.207 回答