使用 RemoteView 删除 Widget 中以编程方式生成的布局

Remove programmatically generated layout in Widget usin RemoteView

我正在为 Android 创建一个小部件,但我遇到了一个问题。 我的主要小部件布局中有一个容器,我想在列表中动态添加新行。 为此,我在容器的 RemoteViews 上使用了 addView 方法:

Widget.java

RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
for (int i = 0; i < 10; i++) {
    RemoteViews rowView = new RemoteViews(context.getPackageName(), R.layout.row);
    views.addView(R.id.list_container, rowView);
}

row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:id="@+id/row"
    android:layout_width="match_parent"
    android:layout_height="20dp"
    android:orientation="horizontal"
    xmlns:android="http://schemas.android.com/apk/res/android">
</LinearLayout>

widget.xml

...
<LinearLayout
    android:id="@+id/list_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
</LinearLayout>
...

所以现在,我有一个包含 10 lines/copy 行布局的布局。 但是每一行都有相同的 id,这取决于我在 layout/row.xml.

中输入的那个

我现在想删除一行,我该怎么做,因为所有行都有相同的 ID?

     views.removeAllViews(R.id.row);

有人知道这是如何工作的吗?也许我做错了,或者小部件布局不是以编程方式定义的?

我添加这个答案是因为 Mike M 找到了解决方案。

不知道这样做是否更好,但它确实有效

我将行的 RemoteViews 保存在数组中。 每次我更新小部件时,我都会用数组的 RemoteViews 填充视图。重新创建我的列表的所有布局树。

在每次更新之前,我现在可以在我的 ArrayList 中删除或添加行,这将显示我想要的内容。

ArrayList<RemoteViews> rows = new ArrayList();

// Adding rows : rows.size() = 3
for (int i = 0; i < 3; i++) {
    RemoteViews rowView = new RemoteViews(context.getPackageName(), R.layout.row);
    rows.add(rowView);
}
// Removing a row : rows.size() = 2
rows.remove(2);

// Update the Layout
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
views.removeAllViews(R.id.list_container)
for (int i = 0; i < rows.size(); i++) {
    views.addView(R.id.list_container, rowView);
}
// Only 2 rows appear

另一个问题是访问我行中的特定元素,但这可以使用相同的方法来完成。 RemoteViews.settextviewtext(id) 只在他们的孩子中搜索 id,这样我就可以访问行中的元素,因为它们中有不同的 id。