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

时间:2014-09-05 06:00:20

标签: android listview layout android-listview widget

如果给出了触发器,我想在android app小部件的ListView中更新某些项目的布局。因此,我在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);

此代码在第一次加载窗口小部件时有效,但在使用notifyAppWidgetViewDataChanged更新时,布局仍然存在且未更改。如何更新用于ListView项的xml布局?

1 个答案:

答案 0 :(得分:3)

更改背景

如果我的假设是正确的,并且您试图通过更改背景颜色或类似的东西来突出显示列表项,我建议使用选择器drawable而不是以编程方式更改布局:

<强>抽拉/ list_item_selector.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item 
        android:state_activated="true"
        android:drawable="@drawable/list_item_background_activated" />

    <item 
        android:state_pressed="true"
        android:drawable="@drawable/list_item_background_pressed" />

    <item
        android:drawable="@drawable/list_item_background" />

</selector>

<强>抽拉/ list_item_background.xml
绘制/ list_item_background_pressed.xml
可拉伸/ list_item_background_activated.xml

为选择器中的每个状态定义这样一个drawable,并用适当的颜色资源替换'color'。

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <solid android:color="color" />

    <stroke
        android:width="1dp"
        android:color="color" />

</shape>

将列表选择器应用于窗口小部件布局中的ListView:

<ListView
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:listSelector="@drawable/list_item_selector" />

我将它用于我自己的小部件,它完美无缺。 有关州名单的更多信息,请参阅此link


更改整个布局

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

public class WidgetListProvider implements RemoteViewsFactory {

    private boolean alternateLayout = 1;

    @Override
    public void onDataSetChanged() {

        alternateLayout = alternateLayout == 1 ? 2 : 1;
    }

    @Override
    public RemoteViews getViewAt(int position) {

        final RemoteViews rv = new RemoteViews(_context.getPackageName(),
                alternateLayout == 1 ? R.layout.list_row : R.layout.list_row2);

        [...]

        return rv;
    }

    @Override
    public int getViewTypeCount() {

        return 2;
    }

    [...]    
}    

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