【问题标题】:Android widget: Changing item layout in ListView on notifyAppWidgetViewDataChangedAndroid 小部件:在 notifyAppWidgetViewDataChanged 上更改 ListView 中的项目布局
【发布时间】:2014-10-04 15:04:14
【问题描述】:

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

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 布局?

【问题讨论】:

标签: android listview layout android-listview widget


【解决方案1】:

改变背景

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

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
drawable/list_item_background_activated.xml

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

<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,则会为第二个布局显示加载视图。

【讨论】:

  • 感谢您的回答。我可以应用你的方法,但我想知道我是否可以完全改变项目的布局以获得更广泛的可能性。
  • 是的,你可以改变整个布局,我已经用工作代码 sn-p 更新了我的答案。
  • 终于!我整天搜索以更改我的小部件的布局。一旦改变它就卡在加载中......我完全忘记了如果我有多个布局来改变getViewTypeCount。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多