【问题标题】:empty view on ListActivity not workingListActivity 上的空视图不起作用
【发布时间】:2011-09-06 03:18:04
【问题描述】:

我正在努力解决这个问题。从我读过的所有教程中,我的设置方式应该可以工作。我有一个使用自定义适配器来显示一些数据的 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”文本,即数据的“下方”。所以空文本基本上是被数据覆盖了。

【问题讨论】:

    标签: android android-layout listactivity custom-adapter


    【解决方案1】:

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

    【讨论】:

    • 没有必要这么复杂。 ListView 应该在检测到列表不为空时自动将空视图设置为不可见
    • 这是我的印象,如果您有一个 id 为 android:id="@android:id/empty" 的视图,那么如果列表为空,它将显示该视图。这就是让我感到困惑的地方。我会尝试设置可见性。
    【解决方案2】:

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

    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
    }
    

    通过自定义适配器的构造函数传入上下文

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

    如果我要严格一点,问题不在于 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 模式的好时机。 answer 中链接的 pdf 文件的第 11/19 页对 ViewHolder 模式给出了很好的解释。

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

    【讨论】:

    • 我对 Android 开发比较陌生,但是,从我所阅读的内容来看,只要您有一个 id 为 @android:id/empty 的视图,如果有没有数据。我没有包含所有代码,但这是处理布局的代码部分。我调用 main.xml 的唯一地方是当我使用 setContentView 时,在 onCreate 下和 getView 方法中。编辑:我在深夜写了这篇文章,所以我确实有一个错字。在 getView 中,我想我缺少实例化 tvText 变量的地方。
    • 你对@android:id/empty的理解没有错。只要内容为空就会显示,只要你没有内容,Android就会隐藏这个视图。从您的描述看来,您在列表视图中具有列表视图的层次结构。这意味着任何未填充数据的行都将被视为空并显示空视图......因此每行上都显示“未找到项目”
    • 所以,我很困惑,也许我遗漏了一些明显的东西,但是如果适配器是空的,我会看到一次“未找到项目”,就像我预期的那样。问题是,当有数据时,我会在每一行上看到“未找到项目”消息和数据。看起来数据被覆盖在每一行的“未找到项目”消息之上。
    • 好的,我想我知道我的问题出在哪里。就在这行代码中: convertView = mInflater.inflate(R.layout.main, parent, false);我可能不应该使用它,只需要使用 yjw 的代码。 yjw,您将如何更改代码以针对多个 TextView?
    • 我更新了我的答案。希望它足够清楚。如果您有任何疑问,请联系我!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2016-11-18
    相关资源
    最近更新 更多