在Android中动态添加和删除TextView

时间:2013-07-09 06:23:24

标签: android arraylist android-framelayout viewgroup

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

代码如下:

以下是 main.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)。但我看到的只是一个空白列表 - 列表项目不可见。 [顺便说一下,名单工作正常。当我从TextView中删除main.xml时,我可以看到所有列表项。]请帮忙。

8 个答案:

答案 0 :(得分:12)

    txtview.setVisibility(View.GONE) ;
    txtview.setVisibility(View.VISIBLE) ;

答案 1 :(得分:3)

为什么不使用ListView的{​​{3}}选项。

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

emptyView

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

请务必在setEmptyView()上致电setAdapter()之前致电ListView

答案 2 :(得分:1)

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

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

希望有所帮助。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

实际上有一个提示&amp;在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时才会被充气{1}}可见性将更改为View.VISIBLE@layout/empty视图层次结构膨胀后,它将替换全局布局中的ViewStub

ViewStub documentation

Source

答案 5 :(得分:0)

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

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

您真的应该使用android:visibility="gone"设置textview xml,并在需要时将其显示。

2)如果您希望将textview放在列表视图的顶部,请使用LinearLayout代替FrameLayout。在列表视图中,将android:layout_height="0dip"更改为android:layout_height="wrap_content",然后删除layout_weight。

答案 6 :(得分:0)

rowtxt.setText("Hello" +  ++i);//for adding textview
rltv.addView(rowtxt);

rowtxt.setVisibility(View.GONE);//use for disable textview
            rltv.removeViewAt(--i);

答案 7 :(得分:0)

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

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

lc2.removeAllViews();
lc3.removeAllViews();

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