Android 小部件:在notifyAppWidgetViewDataChanged 上更改ListView 中的项目布局

ala*_*hoi 1 layout android listview widget android-listview

ListView如果给出触发器,我想更新 Android 应用程序小部件中的某些项目 a 的布局。所以我getView()在 中的方法中实现了下面的方法RemoteViewsService.RemoteViewsFactory

public RemoteViews getViewAt(int position) {
    ...
    int remoteViewId;

    if (some condition) {
        remoteViewId = R.layout.highlighted_item;
    } else {
        remoteViewId = R.layout.item;
    }

    RemoteViews rv = new RemoteViews(mContext.getPackageName(), remoteViewId);
Run Code Online (Sandbox Code Playgroud)

此代码在首次加载小部件时有效,但在使用notifyAppWidgetViewDataChanged布局进行更新时仍然存在并且不会更改。如何更新用于 ListView 项目的 xml 布局?

ssc*_*mid 5

换背景

\n

如果我的假设是正确的,并且您尝试通过更改背景颜色或类似的内容来突出显示列表项,我\xc2\xb4d 建议使用可绘制选择器,而不是以编程方式更改布局:

\n

可绘制/list_item_selector.xml

\n
<selector xmlns:android="http://schemas.android.com/apk/res/android">\n\n    <item \n        android:state_activated="true"\n        android:drawable="@drawable/list_item_background_activated" />\n    \n    <item \n        android:state_pressed="true"\n        android:drawable="@drawable/list_item_background_pressed" />\n\n    <item\n        android:drawable="@drawable/list_item_background" />\n\n</selector>\n
Run Code Online (Sandbox Code Playgroud)\n

可绘制/list_item_background.xml
\n可绘制/list_item_background_pressed.xml
\n可绘制/list_item_background_activated.xml

\n

为选择器中的每个状态定义这样一个可绘制对象,并将“颜色”替换为适当的颜色资源。

\n
<shape xmlns:android="http://schemas.android.com/apk/res/android"\n    android:shape="rectangle" >\n    \n    <solid android:color="color" />\n\n    <stroke\n        android:width="1dp"\n        android:color="color" />\n\n</shape>\n
Run Code Online (Sandbox Code Playgroud)\n

将列表选择器应用到 widget\xc2\xb4s 布局中的 ListView:

\n
<ListView\n    android:id="@android:id/list"\n    android:layout_width="fill_parent"\n    android:layout_height="fill_parent"\n    android:listSelector="@drawable/list_item_selector" />\n
Run Code Online (Sandbox Code Playgroud)\n

我将其用于我自己的小部件,并且它运行良好。\n有关状态列表的更多信息,请参阅此链接

\n
\n

改变整个布局

\n

要更改整个布局,请尝试以下操作:

\n
public class WidgetListProvider implements RemoteViewsFactory {\n\n    private boolean alternateLayout = 1;\n\n    @Override\n    public void onDataSetChanged() {\n        \n        alternateLayout = alternateLayout == 1 ? 2 : 1;\n    }\n\n    @Override\n    public RemoteViews getViewAt(int position) {\n        \n        final RemoteViews rv = new RemoteViews(_context.getPackageName(),\n                alternateLayout == 1 ? R.layout.list_row : R.layout.list_row2);\n\n        [...]\n        \n        return rv;\n    }\n\n    @Override\n    public int getViewTypeCount() {\n        \n        return 2;\n    }\n\n    [...]    \n}    \n
Run Code Online (Sandbox Code Playgroud)\n

重要提示:注意 getViewTypeCount() - 因为您使用两种不同的布局,所以必须在此处返回 2。如果返回 1,将显示第二个布局的加载视图。

\n