【问题标题】:Add and remove a TextView dynamically in Android在 Android 中动态添加和删除 TextView
【发布时间】:2013-07-09 06:23:24
【问题描述】:

我设置了一个 FrameLayout,它在 ListView 之上有一个 TextView。现在,在MainActivity 中,执行一些代码后,我检查ListView 是否为空。如果是,我显示TextView,如果不是,我删除TextView

代码如下:

以下是ma​​in.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/flMain"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tvAddItem"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Add some subjects"
        android:textSize="20sp" />

    <ListView
        android:id="@+id/ItemsList"
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="1" />

</FrameLayout>

在 MainActivity 类中,我执行以下操作:

MainActivity.java

TextView tvNoItem = (TextView) findViewById(R.id.tvAddItem);
ListView subListView = (ListView) findViewById(R.id.itemsList);
FrameLayout fl = (FrameLayout) findViewById(R.id.flMain);

ArrayList<Item> itemsList;

//some code

if(itemsList.isEmpty()) {
    fl.addView(tvNoItem);
} else {
    fl.removeView(tvNoItem);
}

现在,当我运行它并向列表中添加一些项目时,TextView (tvNoItem) 确实被删除了。但我看到的只是一个空白列表 - 列表项不可见。 [顺便说一句,列表工作正常。当我从main.xml 中删除TextView 时,我可以看到所有列表项。] 请帮忙。

【问题讨论】:

  • 为什么不将视图设置为消失? textView.setVisibility(View.GONE)
  • 我试过了。它做同样的事情。我得到一个空白活动。

标签: android arraylist android-framelayout viewgroup


【解决方案1】:
    txtview.setVisibility(View.GONE) ;
    txtview.setVisibility(View.VISIBLE) ;

【讨论】:

    【解决方案2】:

    你为什么不使用ListViewemptyView选项。

    这是一篇关于在适配器为空时显示空视图的好帖子。当您的适配器源为空时,它会自动显示。

    Android – ListView => setEmptyView()

    你不需要检查你的数据源(ArrayList)是否为空,android框架会处理所有的隐藏和显示实现。

    ListView 上拨打setAdapter() 之前,请务必先拨打setEmptyView()

    【讨论】:

      【解决方案3】:

      而不是添加和删除 TextView 尝试隐藏和显示它。使用 View.VISIBLE 和 VIEW.GONE 属性:

      if(itemsList.isEmpty()) {
          tvNoItem.setVisibility(View.VISIBLE);
      } else {
          tvNoItem.setVisibility(View.GONE);
      }
      

      希望对您有所帮助。

      【讨论】:

      • 它是否通过将其可见性设置为“消失”来从布局的子元素中删除特定元素?
      【解决方案4】:

      改为添加/删除尝试更改可见性状态。

      【讨论】:

        【解决方案5】:

        实际上有一个提示和技巧可以在listView 为空时显示视图

        <FrameLayout
        android:layout_width="fill_parent"
                android:layout_height="0dp"
                android:layout_weight="1" >
        
        <ListView
        android:id="@android:id/list"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent" />
        
        <ViewStub
        android:id="@android:id/empty"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:layout="@layout/empty" />
        </FrameLayout>
        

        ViewStub 是一个不可见的零尺寸视图,可用于在运行时懒惰地膨胀布局资源。布局 @layout/empty 将仅在 ViewStub 可见性将被膨胀时更改为View.VISIBLE。一旦 @layout/empty 视图层次结构膨胀,它将替换全局布局中的 ViewStub

        ViewStub documentation

        Source

        【讨论】:

          【解决方案6】:

          1) 首先,您的代码有问题。您的 tvNoItem 已经在 xml 布局中定义,因此您不应再次添加它。您只添加动态创建的视图,例如

          textView tv = new TextView(this);
          ... //customize your text view
          fl.addView(tv);
          

          你真的应该用android:visibility="gone" 设置你的textview xml,并在你想要的时候让它可见。

          2) 如果您希望文本视图位于列表视图之上,请使用 LinearLayout 而不是 FrameLayout。在您的列表视图中,将 android:layout_height="0dip" 更改为 android:layout_height="wrap_content",并删除 layout_weight。

          【讨论】:

            【解决方案7】:
            rowtxt.setText("Hello" +  ++i);//for adding textview
            rltv.addView(rowtxt);
            
            rowtxt.setVisibility(View.GONE);//use for disable textview
                        rltv.removeViewAt(--i);
            

            【讨论】:

              【解决方案8】:

              在布局中动态获取视图之前先重置

              LinearLayout lc2 = (LinearLayout) findViewById(R.id.leftcode1);
              LinearLayout lc3 = (LinearLayout) findViewById(R.id.lcvalue1);
              
              lc2.removeAllViews();
              lc3.removeAllViews();
              

              以上行对我来说是为了防止重复在线性布局中动态添加文本视图

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2011-04-29
                • 2014-04-29
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多